diff --git a/gavrant player housing overhaul.esp b/gavrant player housing overhaul.esp new file mode 100644 index 00000000..48e32180 Binary files /dev/null and b/gavrant player housing overhaul.esp differ diff --git a/meshes/clutter/bones/deerskullhornsstatic.nif b/meshes/clutter/bones/deerskullhornsstatic.nif new file mode 100644 index 00000000..c2be82e2 --- /dev/null +++ b/meshes/clutter/bones/deerskullhornsstatic.nif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71cbb24a6d2960723460c4a5252542a821acb1d3a0f70c2c34874ddf12a41317 +size 21126 diff --git a/meshes/clutter/candles/candlehornchandelier02.nif b/meshes/clutter/candles/candlehornchandelier02.nif index fde67402..8dc9b99d 100644 --- a/meshes/clutter/candles/candlehornchandelier02.nif +++ b/meshes/clutter/candles/candlehornchandelier02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f7a4299b8668c38db5c15fe8e8e73c4e062e6152141a3fa8d876feecef9d7cf -size 204715 +oid sha256:51c59f9bca26934c82e9c6e77a6cd645b44c3d5b5ff7b474432c2a9d0d21af57 +size 110553 diff --git a/meshes/clutter/candles/candlehornfloor01.nif b/meshes/clutter/candles/candlehornfloor01.nif new file mode 100644 index 00000000..66a577b2 --- /dev/null +++ b/meshes/clutter/candles/candlehornfloor01.nif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d067451bb3b5770a6cc4ed4a6a81a5fb1aec4a0a1e7ee45c7c4a04b818a625d0 +size 70451 diff --git a/meshes/clutter/candles/candlehorntable01.nif b/meshes/clutter/candles/candlehorntable01.nif index 2517c49e..c207b4db 100644 --- a/meshes/clutter/candles/candlehorntable01.nif +++ b/meshes/clutter/candles/candlehorntable01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0400b1539f93bd92b4d57427baefff0020d9dccd6966d3c72f96845af4fcbd60 +oid sha256:8e1c1e1945280266118e7428a833fc01a1e7bec1ee468c43ec4e73cdea8e33b7 size 22598 diff --git a/meshes/clutter/common/commoncrate01.nif b/meshes/clutter/common/commoncrate01.nif index 721e28fa..47c9cf45 100644 --- a/meshes/clutter/common/commoncrate01.nif +++ b/meshes/clutter/common/commoncrate01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f33afa0983e7160d06c6fdd34ea970a4e15dc4e9d6f3b5059045855d3e09fcc +oid sha256:0c49e03f150498acc893e6a7f7bd46a45695dc2f3b2a21243f6bb42790c31266 size 29179 diff --git a/meshes/clutter/common/commoncrate02.nif b/meshes/clutter/common/commoncrate02.nif index cb229593..e2e953a8 100644 --- a/meshes/clutter/common/commoncrate02.nif +++ b/meshes/clutter/common/commoncrate02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3712f2bcf8d03f1bf138bedd3837c8e82eab930cd72a964f2d76564348d3446d +oid sha256:b3396a288d3ea2503943759ca68d0531a500e560e18c0027d4ea4dd2b4efba52 size 29336 diff --git a/meshes/clutter/glazedcandlesstatic02.nif b/meshes/clutter/glazedcandlesstatic02.nif index 7e5c8600..72b34638 100644 --- a/meshes/clutter/glazedcandlesstatic02.nif +++ b/meshes/clutter/glazedcandlesstatic02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62362d2e5b14ca342cc415354c41103ac980cc1a3089e8d1d53ac67fe49e77d5 +oid sha256:415b81560a38a59f53d5b60f7c2af4116751e140aded49b78ec71f71d0dc103d size 38537 diff --git a/meshes/clutter/ruins/ruinsfloorcandlelampmidon.nif b/meshes/clutter/ruins/ruinsfloorcandlelampmidon.nif index 755c378b..ddafe995 100644 --- a/meshes/clutter/ruins/ruinsfloorcandlelampmidon.nif +++ b/meshes/clutter/ruins/ruinsfloorcandlelampmidon.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8594d77f5bd1de888a16889702df76f32380998e3b523b114e1bca1d99d3218 -size 45703 +oid sha256:e3b4faa6e7463467775df4925857ce1adaab42f582628143214b80c4bcae56cd +size 45749 diff --git a/meshes/clutter/ruins/ruinsfloorcandlelampsmon.nif b/meshes/clutter/ruins/ruinsfloorcandlelampsmon.nif index b1f5d07a..64c6ff87 100644 --- a/meshes/clutter/ruins/ruinsfloorcandlelampsmon.nif +++ b/meshes/clutter/ruins/ruinsfloorcandlelampsmon.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab3a5c2d9818157930879309502a0f84f566f1ac96594ccf6c31ad6ccc4c5d25 -size 43438 +oid sha256:cf974a15ca13097d4c52b290a9f67543b56ef432d2c7f089b594fa4b20d68d63 +size 43484 diff --git a/meshes/clutter/shrines/shrinebase.nif b/meshes/clutter/shrines/shrinebase.nif index a4510dd4..b2b571d3 100644 --- a/meshes/clutter/shrines/shrinebase.nif +++ b/meshes/clutter/shrines/shrinebase.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:898dcdbeb40f988d288e840e77f200faad4a6bc4fba9faba3a0b9243c5285fff -size 68708 +oid sha256:43efa6c573e55fcb0a526d47b15d23261d58c90398bddaedf44a7560cee9f1ab +size 68754 diff --git a/meshes/enderal/architecture/undercity/gramophone.nif b/meshes/enderal/architecture/undercity/gramophone.nif index 71554c38..a612e364 100644 --- a/meshes/enderal/architecture/undercity/gramophone.nif +++ b/meshes/enderal/architecture/undercity/gramophone.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d73fca940cc7703a7dfc8eb9417b7167f3b33b4fd88dae72605782abbebaf2bc -size 90471 +oid sha256:0e7f5a6066a0c2e52785ea9dfebfcecb638e340fba7a01e23e7e386999c3f83d +size 81790 diff --git a/meshes/enderal/forgottenstories/phasmalist/phasmalistworkstation_placeable.nif b/meshes/enderal/forgottenstories/phasmalist/phasmalistworkstation_placeable.nif new file mode 100644 index 00000000..06a58a6b --- /dev/null +++ b/meshes/enderal/forgottenstories/phasmalist/phasmalistworkstation_placeable.nif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc95f4df8df708a43f4d6ca9b7acd2a36e7019a37df0f009006cd18250bd508f +size 358465 diff --git a/meshes/enderal/playerhousing/animaltrophies/mountedantlers.nif b/meshes/enderal/playerhousing/animaltrophies/mountedantlers.nif index 120b58b7..0bbf8c74 100644 --- a/meshes/enderal/playerhousing/animaltrophies/mountedantlers.nif +++ b/meshes/enderal/playerhousing/animaltrophies/mountedantlers.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ab0e91d5a6f297e064bbdf1cc52afe06bc8eba8bfb32cf8c613b68c9254ba80 -size 39314 +oid sha256:f83ea781b74a47140b4262bb377907d571e0a0eeb126b04e985b311cd3647389 +size 47592 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedbear01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedbear01.nif index 93dc63cc..a0dd67f9 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedbear01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedbear01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d24ed9fd23085d4e95be56dd2b16f6d6d394b515d16d0c1aff7f44c0ab1fbadd -size 58397 +oid sha256:e1499edfd3cf480c7841750000a5cc7b8c6485d555aff72aa27f362cf656b190 +size 64571 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedelkfemale02.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedelkfemale02.nif index dfd7869d..fa81d438 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedelkfemale02.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedelkfemale02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:820095123be6ae566421883af770791cafd1f8a053ae3c2685bb4f32b68dde17 -size 49644 +oid sha256:37441eb2814c4583a9ba05bf16d19c3cdb8d35eb0d63d54623da8d04d473a969 +size 52146 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedelkmale02.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedelkmale02.nif index 6121821b..1c7bd1ee 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedelkmale02.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedelkmale02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0efd2b363482bd54faee2ee1cd82c1970cdf6ed472cb1d095ba7e55ebacb145 -size 83835 +oid sha256:b9411b627eaf4d9c37c5785a64a04283a49e4cd1e836d4768075d4024582b308 +size 85559 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedgoat01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedgoat01.nif index 65e1c597..629c0981 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedgoat01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedgoat01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0a670fca4e807cf909afc546b7fb89cfb191d45f95ea9ef468fe56023f7411a -size 81804 +oid sha256:64248c2afaa5a0d52e360a928decde6067650e72c16e65468ecf6153c686f497 +size 84821 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedhorker01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedhorker01.nif index 2c244c0a..202394b2 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedhorker01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedhorker01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f40adde6738c17cd6a1d71dfb5618d1e725dc5e58678a44c4d081d3c4c9d02d -size 59561 +oid sha256:fbd846eec39806a6d844d244719ca676c4544e6aedb2759246868a47d22596cd +size 62253 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedmudcrab01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedmudcrab01.nif index 81905298..4a66fcce 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedmudcrab01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedmudcrab01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed04287dadc71bd0cec077de1e49a434c6937b2b3232aae811891c9637d50ac3 -size 112623 +oid sha256:91e1443f888916c65a0f2f6f1a69f95447ad304cf271d1f80bc2d118a19ea7af +size 118702 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedsabrecat01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedsabrecat01.nif index 953c3baf..55b502b6 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedsabrecat01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedsabrecat01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4eb1d8df14a066d70d0036edbe63cc218c3074218a9b9fd87fbfddfc650ddf0 -size 95871 +oid sha256:2f1fab5d9df9e5ede6c77bbc70707a3b272dde2e87920efde7ff61acea4d51f2 +size 98389 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedskeever01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedskeever01.nif index b58e8ef2..b7c6ce72 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedskeever01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedskeever01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ecbc70f2b6fc5ca7d67afe7fbf0dd1a1a1049916c4278ebe122f56417e1938a4 -size 72279 +oid sha256:cc7612d1125a560b1c274c5684970b276954086d16ec439ff8b1e36b819b1bf6 +size 76673 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedslaughterfish01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedslaughterfish01.nif index e5af12ae..a351ccd4 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedslaughterfish01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedslaughterfish01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42efdb9dac6d5f6b999c129359f100970a189f208fc219af98250c90af3b4616 -size 85082 +oid sha256:d28156b5337655d7c9b57ed12a5ec4ac3300ff65a3ff41c1c60bab0f77c518ab +size 92228 diff --git a/meshes/enderal/playerhousing/animaltrophies/wallmountedwolf01.nif b/meshes/enderal/playerhousing/animaltrophies/wallmountedwolf01.nif index 5ad66adb..4decd82f 100644 --- a/meshes/enderal/playerhousing/animaltrophies/wallmountedwolf01.nif +++ b/meshes/enderal/playerhousing/animaltrophies/wallmountedwolf01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dcc7e401ce674500e455602f6d99c2ded737a31354614d0cc0a73093faac7ff2 -size 69797 +oid sha256:1de80376e4157ded4275e7d2ba75fc20fd4d526f63d7dcdfcf351f37ec95eff6 +size 74135 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot01.nif b/meshes/enderal/playerhousing/ceramic/ruinspot01.nif index 83340351..6b9d5822 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot01.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7983a91e3a54c41134b272a267dccffc9ca0445d07d4f6b19f6b6a049bea4685 -size 23671 +oid sha256:79587c9f0580ac9789292c536bd2606d46ade01249e56dc39cd389e019ad5aef +size 23717 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot02.nif b/meshes/enderal/playerhousing/ceramic/ruinspot02.nif index 05a9e798..35732929 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot02.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74f3df04d68c60b9ea583dbd45d24592e1986eb37ec8b34caebf81e0e0d24be4 -size 23767 +oid sha256:9e4b4b1add71050c76de6a1238192c073ff3062902c3777d34fdd31e17785c60 +size 23813 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot03.nif b/meshes/enderal/playerhousing/ceramic/ruinspot03.nif index 242b5393..a2dc32ab 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot03.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot03.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d63fd80f710901f33c8b84c69369ec4c1cf32704b53b8e2545331c9f01253908 -size 26387 +oid sha256:18cf1e6b08528403ce0a0df52725085d8e7dbd67cef7c9c097b5bf9411412c37 +size 26433 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot04.nif b/meshes/enderal/playerhousing/ceramic/ruinspot04.nif index 42f2e69e..1eab0e2e 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot04.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot04.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:808882b402161584d4b90fcc7824c639e1513dcc48923331155d243c605d3aaf -size 26515 +oid sha256:4164a4992e6466f278862d0dd1569c4b5b4a46ed3c64fbf8e372212ff3818b69 +size 26561 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot05.nif b/meshes/enderal/playerhousing/ceramic/ruinspot05.nif index 43ca46e3..b055c8d6 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot05.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot05.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c066caeec397d17a96184b744bbd0fe798b928d926baa48a2c49b2e6903211c8 -size 34311 +oid sha256:b2d3a5107c0874ff01196a7d0389643e4473c0c955aea19d4cfc70e7e54d67e0 +size 34357 diff --git a/meshes/enderal/playerhousing/ceramic/ruinspot06.nif b/meshes/enderal/playerhousing/ceramic/ruinspot06.nif index 578bf81c..e0d31af3 100644 --- a/meshes/enderal/playerhousing/ceramic/ruinspot06.nif +++ b/meshes/enderal/playerhousing/ceramic/ruinspot06.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bad73835746e2ee3652ce7ca48af029baf5e29ce51bd080898aa129670b2e1fb -size 31863 +oid sha256:e7080dd6f54373a1f1c217996b34c7b6ab51a08e2dc21534368a564de1c083b0 +size 31909 diff --git a/meshes/enderal/playerhousing/furniture/gramophone_placeable.nif b/meshes/enderal/playerhousing/furniture/gramophone_placeable.nif new file mode 100644 index 00000000..22ea1820 --- /dev/null +++ b/meshes/enderal/playerhousing/furniture/gramophone_placeable.nif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:455a36e7f2bdd0e4914a9366741e258e0e1e47fc14dcce64963a5cb4ad7d7ec9 +size 81791 diff --git a/meshes/enderal/playerhousing/lights/glazedcandles01static.nif b/meshes/enderal/playerhousing/lights/glazedcandles01static.nif index dd887f26..76dc9a63 100644 --- a/meshes/enderal/playerhousing/lights/glazedcandles01static.nif +++ b/meshes/enderal/playerhousing/lights/glazedcandles01static.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e69d0423040a584f1f985fa3ce62dc5772fb3deec76ffe5c8d5cc555b04c894 +oid sha256:931bc467bdf5a8507cae9b9b237f109d3d873bf84ab6284831c04c54b0e77662 size 22735 diff --git a/meshes/enderal/playerhousing/lights/impwallsconcecandle01c.nif b/meshes/enderal/playerhousing/lights/impwallsconcecandle01c.nif index 2bac4126..6fc15f54 100644 --- a/meshes/enderal/playerhousing/lights/impwallsconcecandle01c.nif +++ b/meshes/enderal/playerhousing/lights/impwallsconcecandle01c.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5103a4eef463431257fa2a5c9550da782440550e32c60ff35631836a486521ff +oid sha256:67ab95873693c755c734090a86fbce429fb466903fe12f3a22fda76c66482c4e size 38740 diff --git a/meshes/enderal/playerhousing/lights/ruinscandlesconceon01.nif b/meshes/enderal/playerhousing/lights/ruinscandlesconceon01.nif index 7ddf17e8..39da23c9 100644 --- a/meshes/enderal/playerhousing/lights/ruinscandlesconceon01.nif +++ b/meshes/enderal/playerhousing/lights/ruinscandlesconceon01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f1ea68a65f7714ab233b0095cb6adac69f2bebe6fb65ba8edbfcd2d49b0ae86 +oid sha256:be5986875da55289a57fd5526bb35562b5bb14166ca3633016e427175337f241 size 55244 diff --git a/meshes/enderal/playerhousing/lights/silvercandlestick01.nif b/meshes/enderal/playerhousing/lights/silvercandlestick01.nif index ff0a1750..b199127b 100644 --- a/meshes/enderal/playerhousing/lights/silvercandlestick01.nif +++ b/meshes/enderal/playerhousing/lights/silvercandlestick01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eaf875993841a75402ef4de04b22c6e11ef90877517770fc4d1084f4603b2da3 -size 45264 +oid sha256:6c4d6a1225508e0dbe0f274ee4683a36eefebd6592b16835c00f715d2d1d503e +size 45310 diff --git a/meshes/enderal/playerhousing/lights/silvercandlestick02.nif b/meshes/enderal/playerhousing/lights/silvercandlestick02.nif index 48a7a3a8..7b16f451 100644 --- a/meshes/enderal/playerhousing/lights/silvercandlestick02.nif +++ b/meshes/enderal/playerhousing/lights/silvercandlestick02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d050b95a73ebb28058dc0484c62f7a3013a427797d21e59ad07417acba8f033 -size 114365 +oid sha256:402388b6823a2484fa6d13d10ddfac86e345f6b20cf76f1db40f89f43ebce966 +size 114411 diff --git a/meshes/enderal/playerhousing/miscellaneous/haybale01.nif b/meshes/enderal/playerhousing/miscellaneous/haybale01.nif index 2175f315..4e23b85c 100644 --- a/meshes/enderal/playerhousing/miscellaneous/haybale01.nif +++ b/meshes/enderal/playerhousing/miscellaneous/haybale01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33264c2351f19f50d1c32c357e67791062a4457faf2416a7d984ba467559b100 -size 34618 +oid sha256:34a638cff9f9ffc9f1363394da4e79ef596372b8d920ed014f8c9fc8f3a6454f +size 34475 diff --git a/meshes/enderal/playerhousing/miscellaneous/meadbarrel01.nif b/meshes/enderal/playerhousing/miscellaneous/meadbarrel01.nif index 24ab88b9..19cc6677 100644 --- a/meshes/enderal/playerhousing/miscellaneous/meadbarrel01.nif +++ b/meshes/enderal/playerhousing/miscellaneous/meadbarrel01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:623aa02438817305d058ef4e7539fdf0530ebc86e3cd3e8104971cf3bc6ece08 +oid sha256:f43e806716f71aca52df80df0fc52a393476e877fda8dd331f9ff29796e65763 size 20259 diff --git a/meshes/enderal/playerhousing/miscellaneous/nobledivider01.nif b/meshes/enderal/playerhousing/miscellaneous/nobledivider01.nif index 61c203f6..3182bbe0 100644 --- a/meshes/enderal/playerhousing/miscellaneous/nobledivider01.nif +++ b/meshes/enderal/playerhousing/miscellaneous/nobledivider01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c8e5c331a28a16609410143e4a157a42c92f5ab79fea5752cf33650bc6c1203 -size 50078 +oid sha256:c2b3580029fca6d473024b4956dcd6d9e8d618d90d3ff25d2415f72a564c621f +size 50094 diff --git a/meshes/enderal/playerhousing/miscellaneous/noblewallshelf01.nif b/meshes/enderal/playerhousing/miscellaneous/noblewallshelf01.nif index fa3e3415..f96241cd 100644 --- a/meshes/enderal/playerhousing/miscellaneous/noblewallshelf01.nif +++ b/meshes/enderal/playerhousing/miscellaneous/noblewallshelf01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f808aa716efe3b1acfc98e9cc4e5a96da594f8151a26ece385d1d00eec317c13 -size 11682 +oid sha256:8d52f351e9918a788b9a7ec557e802bc95f3603abc8dc98223255625f45153f7 +size 11720 diff --git a/meshes/enderal/playerhousing/miscellaneous/noblewallshelf02.nif b/meshes/enderal/playerhousing/miscellaneous/noblewallshelf02.nif index 13328cfb..1c8200e7 100644 --- a/meshes/enderal/playerhousing/miscellaneous/noblewallshelf02.nif +++ b/meshes/enderal/playerhousing/miscellaneous/noblewallshelf02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8b5150868fe979842fc367ff9a98bf2ae1033b8edf8d9093763fb216c995e9c -size 13575 +oid sha256:a672cbdd72ccf8317d484eb9578217221b42796698d0cd3463fc2a892105a395 +size 13595 diff --git a/meshes/enderal/playerhousing/plants/basketflowers.nif b/meshes/enderal/playerhousing/plants/basketflowers.nif index 82bf6741..bb8c8104 100644 --- a/meshes/enderal/playerhousing/plants/basketflowers.nif +++ b/meshes/enderal/playerhousing/plants/basketflowers.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afbe296205122b6f36e6f3ebdf97ebf73b1cb5f68386864886097f40400faf89 -size 119683 +oid sha256:b40fc18aad49b802c077897087b677d9220c7c88b1d37003e23a59d550b590c9 +size 119729 diff --git a/meshes/enderal/playerhousing/plants/basketthistles.nif b/meshes/enderal/playerhousing/plants/basketthistles.nif index bb076200..0c343c9c 100644 --- a/meshes/enderal/playerhousing/plants/basketthistles.nif +++ b/meshes/enderal/playerhousing/plants/basketthistles.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d47577ae4510dd3c957add5564acd7cabeca5a7978bc576195c99817d6a73677 -size 142953 +oid sha256:606d414c474fcebd94da86a09dc53b193502888efa59b4f5234ef6d60f886397 +size 142999 diff --git a/meshes/enderal/playerhousing/plants/planter01deathbell.nif b/meshes/enderal/playerhousing/plants/planter01deathbell.nif index 34a2c48b..ad7b179e 100644 --- a/meshes/enderal/playerhousing/plants/planter01deathbell.nif +++ b/meshes/enderal/playerhousing/plants/planter01deathbell.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:050608bed7b9b379048adaaa27243c981dc39a90c4eeed6cecfd10b9db9b6dbb -size 70931 +oid sha256:0812033790bc68b78ce58e8e53eadd89e35ef33bf71bc85ff7167c1697964776 +size 70746 diff --git a/meshes/enderal/playerhousing/plants/planter01dragontongue.nif b/meshes/enderal/playerhousing/plants/planter01dragontongue.nif index d3dcc33d..46f360b7 100644 --- a/meshes/enderal/playerhousing/plants/planter01dragontongue.nif +++ b/meshes/enderal/playerhousing/plants/planter01dragontongue.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e024cc1d440939aac37160b7b2b8a88c1e053a06c19308dc32b4c78f1b9e6d1f -size 79253 +oid sha256:e03ef1e97e7b8685f0f73ac7c681a97276ca818f889e5507db9dc97c31a44d7a +size 79068 diff --git a/meshes/enderal/playerhousing/plants/planter01juniper.nif b/meshes/enderal/playerhousing/plants/planter01juniper.nif index b1601e43..ff2eadb0 100644 --- a/meshes/enderal/playerhousing/plants/planter01juniper.nif +++ b/meshes/enderal/playerhousing/plants/planter01juniper.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:201a143a9fb30c452f6e024621719b8ddea7a9623455c37f6678b934373d8fcd -size 81311 +oid sha256:2dc0a6f7d1c6b090279d076c88e926d158c3cabac5dda4d36fe5c29fb2c0fafd +size 81126 diff --git a/meshes/enderal/playerhousing/plants/planter01snowberries.nif b/meshes/enderal/playerhousing/plants/planter01snowberries.nif index b46dd82c..7d480e6d 100644 --- a/meshes/enderal/playerhousing/plants/planter01snowberries.nif +++ b/meshes/enderal/playerhousing/plants/planter01snowberries.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8e540081ea2648b2a7f63d0724160e76923973016665f9735ece4502c9f4bac3 -size 148398 +oid sha256:14194be0a61c2d0f9371a5d9203fe2ff06bbc46e0492ff1338485b68f8992a24 +size 148213 diff --git a/meshes/enderal/playerhousing/plants/planter01vinemaple.nif b/meshes/enderal/playerhousing/plants/planter01vinemaple.nif index 80263a4f..0d7bbf28 100644 --- a/meshes/enderal/playerhousing/plants/planter01vinemaple.nif +++ b/meshes/enderal/playerhousing/plants/planter01vinemaple.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e4c4e7957c06a651b102154d3185d834b910534b9a553f5c18290fbfdd5ff6d -size 65556 +oid sha256:72555975422333d59db3f007a73d7634573544c2c4276306d68dfe3ae8c06082 +size 65371 diff --git a/meshes/enderal/playerhousing/plants/planter02nightshade.nif b/meshes/enderal/playerhousing/plants/planter02nightshade.nif index 3915e103..073dcb6e 100644 --- a/meshes/enderal/playerhousing/plants/planter02nightshade.nif +++ b/meshes/enderal/playerhousing/plants/planter02nightshade.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1901f5aa9ba6a6e91f8214cc18748ed7fc14a7707d1cfe13702378026b9699d5 -size 56662 +oid sha256:bf3cf308ed410ac030b0d39a21cf5423c0af7d54f4526bd93d322dd9fdc8d2c5 +size 56566 diff --git a/meshes/enderal/playerhousing/plants/planter03lavender.nif b/meshes/enderal/playerhousing/plants/planter03lavender.nif index bc7572ac..c252259b 100644 --- a/meshes/enderal/playerhousing/plants/planter03lavender.nif +++ b/meshes/enderal/playerhousing/plants/planter03lavender.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:892b71960b59c331999bf320319efe0e4c6523356dd723a8bc0095d59a06e1cd -size 145244 +oid sha256:7926bf1deb2e7d68168dd99f7edf8be17a8f165f36f56b9feb0a7c7f9bbfccf0 +size 145146 diff --git a/meshes/enderal/playerhousing/plants/planter04vinemaple.nif b/meshes/enderal/playerhousing/plants/planter04vinemaple.nif index ff9d334d..9567dd77 100644 --- a/meshes/enderal/playerhousing/plants/planter04vinemaple.nif +++ b/meshes/enderal/playerhousing/plants/planter04vinemaple.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d91569da84036f8284fcd0e0bd332553af6636671be58ede73a12a492044d92f -size 75934 +oid sha256:3ed8a88998aa2619e07097bbbb1d3c7c66463678d934833cb10442a912fd6f36 +size 75885 diff --git a/meshes/enderal/playerhousing/plants/planterkettleferns.nif b/meshes/enderal/playerhousing/plants/planterkettleferns.nif index fc8f8f22..82980139 100644 --- a/meshes/enderal/playerhousing/plants/planterkettleferns.nif +++ b/meshes/enderal/playerhousing/plants/planterkettleferns.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97548a8c28f050ceb9179ea052b4e4ee25771e46bcea490e7dd3697b43800aef -size 51352 +oid sha256:c305572146f337a4f081b32f016d6558e66841120056f52d2a55a2fc0ec3eaec +size 53814 diff --git a/meshes/enderal/playerhousing/plants/ruinsflowervase01.nif b/meshes/enderal/playerhousing/plants/ruinsflowervase01.nif index 7ab62904..f83afedd 100644 --- a/meshes/enderal/playerhousing/plants/ruinsflowervase01.nif +++ b/meshes/enderal/playerhousing/plants/ruinsflowervase01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e84784271ffff713998b1fec41e1852cb290149a8a1faec77d531dfb34e4c3a -size 100260 +oid sha256:9d916bca00d358ccb2fd51d3c6c0910fca88a557cd798a73105e0c1b434600d1 +size 101999 diff --git a/meshes/enderal/playerhousing/rugs/rug01.nif b/meshes/enderal/playerhousing/rugs/rug01.nif index 2810dc5a..a54f5d8e 100644 --- a/meshes/enderal/playerhousing/rugs/rug01.nif +++ b/meshes/enderal/playerhousing/rugs/rug01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3972a0086c620214878654c36f8ed39b8153e05b527e4d4009af765754ac061 +oid sha256:6819891fd500cffc2ccb9fd80056bca661de7bae2dd2e272b712fa379c10895f size 1841 diff --git a/meshes/enderal/playerhousing/rugs/rug02.nif b/meshes/enderal/playerhousing/rugs/rug02.nif index d2f30820..25a490e6 100644 --- a/meshes/enderal/playerhousing/rugs/rug02.nif +++ b/meshes/enderal/playerhousing/rugs/rug02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de78c8cf9378d44cc74e1a589baaa927075fc0faa0e7f79396113adfa13400a9 +oid sha256:718115e13c856ecbc838f6c055e1aa8f8a3f0d38d2166f50bfd9a9461d7934d9 size 1965 diff --git a/meshes/enderal/playerhousing/rugs/rug03.nif b/meshes/enderal/playerhousing/rugs/rug03.nif index 769e0851..353629cb 100644 --- a/meshes/enderal/playerhousing/rugs/rug03.nif +++ b/meshes/enderal/playerhousing/rugs/rug03.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a77e3dedebc400c5036ffd2b532c88351d752fa8f281640fdf8859f3325d7cb +oid sha256:44ae42b15a6400a95e809566efde082b9f4573b96477fb5ec19049efadb29ddc size 4244 diff --git a/meshes/enderal/playerhousing/rugs/rug04.nif b/meshes/enderal/playerhousing/rugs/rug04.nif index a6707dff..7f9f06a7 100644 --- a/meshes/enderal/playerhousing/rugs/rug04.nif +++ b/meshes/enderal/playerhousing/rugs/rug04.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acd0b05e17464d4e24d477bb9450c8ac84c1ff3e67119d330620f61cb1383441 +oid sha256:2df6a8dd6e168efadd404cbcbf4831428a1c237be12b42aad321193ac1b85c53 size 4571 diff --git a/meshes/enderal/playerhousing/rugs/rug05.nif b/meshes/enderal/playerhousing/rugs/rug05.nif index 2dc4b6d6..fc98d426 100644 --- a/meshes/enderal/playerhousing/rugs/rug05.nif +++ b/meshes/enderal/playerhousing/rugs/rug05.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:10b09e913f6971bdc017a877aac1fc5a3e67faa7fe81eb3aa10362484e8733ce +oid sha256:7758681df056cedb26bddc52a8a7150499d32e5625cd3a3c57fc59eb946f7d04 size 5774 diff --git a/meshes/enderal/playerhousing/rugs/rug06.nif b/meshes/enderal/playerhousing/rugs/rug06.nif index 63497fc2..4de20ab6 100644 --- a/meshes/enderal/playerhousing/rugs/rug06.nif +++ b/meshes/enderal/playerhousing/rugs/rug06.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1536b97767ca17e556e93ec40adc6de7374bfcf5315937610188fb38d7cb144f +oid sha256:7edfd0c46a600e6321dbf1f1142ed6fd35a369a41133fb86919e527dd000bb37 size 4455 diff --git a/meshes/enderal/playerhousing/rugs/rug07.nif b/meshes/enderal/playerhousing/rugs/rug07.nif index 5816b93d..766312bd 100644 --- a/meshes/enderal/playerhousing/rugs/rug07.nif +++ b/meshes/enderal/playerhousing/rugs/rug07.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2ab25d678d002f9faa25cf30c7c22c000bbdeac864568ece6fb6115c6d5b325e +oid sha256:b357d2a9c4fd93b19bfac18578e94c3a57098649de25a2508051bb151bb347cf size 5914 diff --git a/meshes/enderal/playerhousing/rugs/rug08.nif b/meshes/enderal/playerhousing/rugs/rug08.nif index 4d188856..a8ffad11 100644 --- a/meshes/enderal/playerhousing/rugs/rug08.nif +++ b/meshes/enderal/playerhousing/rugs/rug08.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93bea4cc857ef2ac4701e539ad3066e5fd9d140eb92eb85419aecc32b2f16f84 +oid sha256:7c2ec58e2d49404b90bdfd9930a1a483ca72e02a41ca12d02ec92c093c34edce size 2425 diff --git a/meshes/enderal/playerhousing/rugs/rug09.nif b/meshes/enderal/playerhousing/rugs/rug09.nif index 6fc3c1d8..9fd4d3c8 100644 --- a/meshes/enderal/playerhousing/rugs/rug09.nif +++ b/meshes/enderal/playerhousing/rugs/rug09.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8fec2acd8a078c519219717dd944472094cbb4bd7ba851e92077a227e21d7d69 +oid sha256:792f01b69f259c5ea8f50d5036af0a5a7b7b62c57659f1788d7d3614746717cf size 2889 diff --git a/meshes/enderal/playerhousing/rugs/rug10.nif b/meshes/enderal/playerhousing/rugs/rug10.nif index 90491730..4108bd5f 100644 --- a/meshes/enderal/playerhousing/rugs/rug10.nif +++ b/meshes/enderal/playerhousing/rugs/rug10.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6188ace1f76ccdddc920d6322dcc9724a407d363405ea0721f341ac24c877b40 +oid sha256:bf8894a10c355bbc023ffe4dcd7ed25683626c4f39f48dd3dce1dfbe13334927 size 2889 diff --git a/meshes/enderal/playerhousing/rugs/rug11.nif b/meshes/enderal/playerhousing/rugs/rug11.nif index 3bbb86d4..cbad3a82 100644 --- a/meshes/enderal/playerhousing/rugs/rug11.nif +++ b/meshes/enderal/playerhousing/rugs/rug11.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be07c76bf5128111d6f4d669d7c3dcabad8d2a82e2b0547eead8a206b0a82f89 +oid sha256:d8674b04eabdf31faf28a6162b48f80e03dda40919ac058be733ac93c7430875 size 5914 diff --git a/meshes/enderal/playerhousing/rugs/rug12.nif b/meshes/enderal/playerhousing/rugs/rug12.nif index 9bcda827..e9f9326f 100644 --- a/meshes/enderal/playerhousing/rugs/rug12.nif +++ b/meshes/enderal/playerhousing/rugs/rug12.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c6fa3289b2b3a404ec516f60e055f02f8d8823c174e00cd82f10c19bae4af93 +oid sha256:13c7782ec66a1a0165a48752f62acbe6aa67f9396b79513f7623baf3b97b0fb0 size 5978 diff --git a/meshes/enderal/playerhousing/rugs/rug13.nif b/meshes/enderal/playerhousing/rugs/rug13.nif index f2c911c2..95688719 100644 --- a/meshes/enderal/playerhousing/rugs/rug13.nif +++ b/meshes/enderal/playerhousing/rugs/rug13.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdd302fe631f9d40402720b82c451eb012be8845602e766e81888cfcca26ec88 +oid sha256:154a69bf04e4d445ecbd94bef5591fa49284d9a29cf1a5b266b88f9a2d410312 size 1925 diff --git a/meshes/enderal/playerhousing/rugs/rug14.nif b/meshes/enderal/playerhousing/rugs/rug14.nif index d9c7e1e7..37724567 100644 --- a/meshes/enderal/playerhousing/rugs/rug14.nif +++ b/meshes/enderal/playerhousing/rugs/rug14.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2eea16bf2f52496812e9728d0505e96e6fbb3317f17bc53f04b40758d2207aff +oid sha256:5de176cc068bd288dfe3842f9af1aac5e518b9c3f1bd125fb2919459f979ad54 size 2757 diff --git a/meshes/enderal/playerhousing/rugs/rug15.nif b/meshes/enderal/playerhousing/rugs/rug15.nif index e29aca9d..5cb31ab3 100644 --- a/meshes/enderal/playerhousing/rugs/rug15.nif +++ b/meshes/enderal/playerhousing/rugs/rug15.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1f860e91a31af6269de176fb3bb1ed7998a56542f2ef3d028205062e5d97865 +oid sha256:f391ba6824b0b02f9b29d1257fded5f997a0aea72e21dd26f451ac9d992dd63f size 1925 diff --git a/meshes/enderal/playerhousing/rugs/ruground01.nif b/meshes/enderal/playerhousing/rugs/ruground01.nif index a9e1642b..a0cdee1c 100644 --- a/meshes/enderal/playerhousing/rugs/ruground01.nif +++ b/meshes/enderal/playerhousing/rugs/ruground01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e018ff3e389025499af8eca1537e6c512b3b19adb69f599d4c5e9e3e63483cf3 -size 4379 +oid sha256:ae7f6e2683e62a72282687c90ec76bd0f4cdee09ad08e1db210b1d73346c4298 +size 4672 diff --git a/meshes/enderal/playerhousing/rugs/ruground02.nif b/meshes/enderal/playerhousing/rugs/ruground02.nif index 47a0675b..5ebdce4f 100644 --- a/meshes/enderal/playerhousing/rugs/ruground02.nif +++ b/meshes/enderal/playerhousing/rugs/ruground02.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a72f84a4846b2642e0743f3964aade25f81e4359add4bfade597b78c145ef2e -size 4379 +oid sha256:c7b4cdfccfbc145d455fb67cb5fc9c02a3c7980fee5aa82a4323a2c5fcc6d413 +size 4672 diff --git a/meshes/enderal/playerhousing/rugs/ruground03.nif b/meshes/enderal/playerhousing/rugs/ruground03.nif index 691a5185..e65bcf07 100644 --- a/meshes/enderal/playerhousing/rugs/ruground03.nif +++ b/meshes/enderal/playerhousing/rugs/ruground03.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c88130465659726ae4da5e3e3e73a2377d88b2543c546e0ddca60c5e97f5e8a -size 4560 +oid sha256:662d507186b1daadea2f8c7b5aabe230f30c845672e637ee481d53f16e494c40 +size 4853 diff --git a/meshes/enderal/playerhousing/rugs/ruground04.nif b/meshes/enderal/playerhousing/rugs/ruground04.nif index 3684dfb9..02336ced 100644 --- a/meshes/enderal/playerhousing/rugs/ruground04.nif +++ b/meshes/enderal/playerhousing/rugs/ruground04.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0cc94ef9089f176962efe326bec58ef4eb44b5179107665e6c6dc84b5db6b718 -size 4372 +oid sha256:b281aa1e72b703585f9fcff415cbb1bbbc6468e2f1adb4bba999ffded01e10fd +size 4669 diff --git a/meshes/enderal/playerhousing/wallbasket/wallbasket01.nif b/meshes/enderal/playerhousing/wallbasket/wallbasket01.nif index 824f854f..ca571968 100644 --- a/meshes/enderal/playerhousing/wallbasket/wallbasket01.nif +++ b/meshes/enderal/playerhousing/wallbasket/wallbasket01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9f70d9d6dffa38c13dbeff623ac48770aeb867b8af36fb6734b254522459e64 -size 16611 +oid sha256:c0c0a8add7ed862036dc6fb318779c2f009ef45f798d7924241264bef3cb51db +size 16657 diff --git a/meshes/enderal/playerhousing/wallbasket/wallbasket03.nif b/meshes/enderal/playerhousing/wallbasket/wallbasket03.nif index 4727331a..23b35a64 100644 --- a/meshes/enderal/playerhousing/wallbasket/wallbasket03.nif +++ b/meshes/enderal/playerhousing/wallbasket/wallbasket03.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e05258e6c91771efb65d03c2c4f48deddc331727e6bb9cfc379d919663e1a6ab -size 18455 +oid sha256:f4e4183f39a49a03da31c1c8a0474277e48ed391d459047a6db03042d2f632b4 +size 18501 diff --git a/meshes/enderal/playerhousing/wallbasket/wallbasket04.nif b/meshes/enderal/playerhousing/wallbasket/wallbasket04.nif index f6fcefe9..fad58ab4 100644 --- a/meshes/enderal/playerhousing/wallbasket/wallbasket04.nif +++ b/meshes/enderal/playerhousing/wallbasket/wallbasket04.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7077e4d9e6b13f49c8cf56fc7f5e0ecd33afdbc467ab4b792ed235df59740d03 -size 16611 +oid sha256:68bf78763a9916b169814f0ab7fe2867eb6b10928815d6b852ee3ce1c245c338 +size 16657 diff --git a/meshes/enderal/playerhousing/wallbasket/wallbaskethex01.nif b/meshes/enderal/playerhousing/wallbasket/wallbaskethex01.nif index da38038d..d80d4dec 100644 --- a/meshes/enderal/playerhousing/wallbasket/wallbaskethex01.nif +++ b/meshes/enderal/playerhousing/wallbasket/wallbaskethex01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:768b08d1d60056391f5e31a321b074e095003563fec94df01401fc7f5c144781 -size 9353 +oid sha256:5297d46e73a75ebe1b59adf902918011ec5b00cad338dfae5ef8cb548a47751a +size 9399 diff --git a/meshes/enderal/playerhousing/wallbasket/wallbaskethex04.nif b/meshes/enderal/playerhousing/wallbasket/wallbaskethex04.nif index 67444142..157a58a5 100644 --- a/meshes/enderal/playerhousing/wallbasket/wallbaskethex04.nif +++ b/meshes/enderal/playerhousing/wallbasket/wallbaskethex04.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0958e8b9ded0fa60a102ba23b1107f11ca6ce22daa043964b890e13a9d30231a -size 10240 +oid sha256:b57d839a517654e465a16768d2c097297526a3fa00a26ad1c00b75e7180baf30 +size 10286 diff --git a/meshes/furniture/orcfurniture/orcshelf01.nif b/meshes/furniture/orcfurniture/orcshelf01.nif index 64f5d401..fa9f17b4 100644 --- a/meshes/furniture/orcfurniture/orcshelf01.nif +++ b/meshes/furniture/orcfurniture/orcshelf01.nif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:32bfae2369bd740ef12ba9a69101a89cc7a868adbb204a0f7b0e6796205f6e08 +oid sha256:4cfc908ce41c7acdbbbff75d3e334f0cfe8d579e6fc79faa61dade0581c96c79 size 56366 diff --git a/scripts/_00e_gaboff_grammophonesc.pex b/scripts/_00e_gaboff_grammophonesc.pex index a23385ac..1160c5a9 100644 Binary files a/scripts/_00e_gaboff_grammophonesc.pex and b/scripts/_00e_gaboff_grammophonesc.pex differ diff --git a/scripts/_00e_game_playerhouse_boardsc.pex b/scripts/_00e_game_playerhouse_boardsc.pex index c82a91c5..adab6193 100644 Binary files a/scripts/_00e_game_playerhouse_boardsc.pex and b/scripts/_00e_game_playerhouse_boardsc.pex differ diff --git a/scripts/_00e_placeablegrammophonplay.pex b/scripts/_00e_placeablegrammophonplay.pex index f4a59800..52825a0f 100644 Binary files a/scripts/_00e_placeablegrammophonplay.pex and b/scripts/_00e_placeablegrammophonplay.pex differ diff --git a/scripts/_00e_playerhousing_furniture.pex b/scripts/_00e_playerhousing_furniture.pex index 13a7434d..7c6430f6 100644 Binary files a/scripts/_00e_playerhousing_furniture.pex and b/scripts/_00e_playerhousing_furniture.pex differ diff --git a/scripts/_00e_playerhousing_furnitureitem.pex b/scripts/_00e_playerhousing_furnitureitem.pex index 4353001d..93298570 100644 Binary files a/scripts/_00e_playerhousing_furnitureitem.pex and b/scripts/_00e_playerhousing_furnitureitem.pex differ diff --git a/scripts/_00e_playerhousing_lightfurniture.pex b/scripts/_00e_playerhousing_lightfurniture.pex index a1f8bfe0..c8eee5b0 100644 Binary files a/scripts/_00e_playerhousing_lightfurniture.pex and b/scripts/_00e_playerhousing_lightfurniture.pex differ diff --git a/scripts/_00e_playerhousing_mannequincontrol.pex b/scripts/_00e_playerhousing_mannequincontrol.pex index f895a808..8729aeb1 100644 Binary files a/scripts/_00e_playerhousing_mannequincontrol.pex and b/scripts/_00e_playerhousing_mannequincontrol.pex differ diff --git a/scripts/_00e_playerhousingcurrentomanipulate.pex b/scripts/_00e_playerhousingcurrentomanipulate.pex index aaa5c14e..4592e6e3 100644 Binary files a/scripts/_00e_playerhousingcurrentomanipulate.pex and b/scripts/_00e_playerhousingcurrentomanipulate.pex differ diff --git a/scripts/_00e_playerhousingcurrentotranslation.pex b/scripts/_00e_playerhousingcurrentotranslation.pex index c5a11038..9ba38cb5 100644 Binary files a/scripts/_00e_playerhousingcurrentotranslation.pex and b/scripts/_00e_playerhousingcurrentotranslation.pex differ diff --git a/scripts/_00e_playerhousingmaster.pex b/scripts/_00e_playerhousingmaster.pex index 2a8fb146..982eebb3 100644 Binary files a/scripts/_00e_playerhousingmaster.pex and b/scripts/_00e_playerhousingmaster.pex differ diff --git a/scripts/_00e_playerhousingtutorial.pex b/scripts/_00e_playerhousingtutorial.pex index 155fd64c..2522d8b8 100644 Binary files a/scripts/_00e_playerhousingtutorial.pex and b/scripts/_00e_playerhousingtutorial.pex differ diff --git a/scripts/_00e_playersetupscript.pex b/scripts/_00e_playersetupscript.pex index 34777c10..38d7c9aa 100644 Binary files a/scripts/_00e_playersetupscript.pex and b/scripts/_00e_playersetupscript.pex differ diff --git a/scripts/_00e_questfunctions.pex b/scripts/_00e_questfunctions.pex index 585a8c67..bd821ba7 100644 Binary files a/scripts/_00e_questfunctions.pex and b/scripts/_00e_questfunctions.pex differ diff --git a/scripts/source/_00e_gaboff_grammophonesc.psc b/scripts/source/_00e_gaboff_grammophonesc.psc new file mode 100644 index 00000000..beb7f698 --- /dev/null +++ b/scripts/source/_00e_gaboff_grammophonesc.psc @@ -0,0 +1,132 @@ +Scriptname _00E_Gaboff_GrammophoneSC extends ObjectReference + +Message Property _00E_Gaboff_GrammophoneMSG Auto +Message Property _00E_PlayerhousingKoppophonVolume Auto +Sound Property _00E_MUS_Special_OceansWidowM Auto +MiscObject Property Gold001 Auto +Actor Property PlayerREF Auto + +Int iSoundID = -1 +Float fVolume = 0.5 +Bool bMusicLocked = False + +Float Property MUSIC_LENGTH = 212.3 AutoReadOnly + + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +Function PlayMusic(Sound musicSound, Float fMusicLength) + If fVolume <= 0.0 || fVolume > 1.0 + fVolume = 0.5 + EndIf + RegisterForModEvent("BardsLoadGame", "OnBardsLoadGame") + iSoundID = musicSound.Play(Self) + Sound.SetInstanceVolume(iSoundID, fVolume) + RegisterForSingleUpdate(_00E_QuestFunctions.AdjustTimePeriodByEngineTimerError(fMusicLength)) + GoToState("") + _00E_PlayerhousingKoppophonVolume.Show(fVolume * 100.0) +EndFunction + +Function ChangeMusicVolume() + If fVolume >= 0.0 && fVolume < 1.0 + fVolume += 0.25 + Else ; fVolume >= 1.0 or something is wrong with fVolume + fVolume = 0.0 + EndIf + Sound.SetInstanceVolume(iSoundID, fVolume) + _00E_PlayerhousingKoppophonVolume.Show(fVolume * 100.0) +EndFunction + +Function StopMusic() + bMusicLocked = True + + GoToState("DoneCleanup") + UnregisterForModEvent("BardsLoadGame") + UnregisterForUpdate() + + If iSoundID != -1 + Sound.StopInstance(iSoundID) + iSoundID = -1 + EndIf + + bMusicLocked = False +EndFunction + +Function TryStopMusic() + If bMusicLocked == False + StopMusic() + Else + RegisterForSingleUpdate(0.5) + EndIf +EndFunction + + +;===================================================================================== +; EVENTS +;===================================================================================== + +Event OnInit() + GoToState("DoneCleanup") +EndEvent + +Event OnActivate(ObjectReference akActionRef) + If akActionRef == PlayerREF && bMusicLocked == False + bMusicLocked = True + + If iSoundID == -1 + If _00E_Gaboff_GrammophoneMSG.Show() == 0 + PlayerREF.RemoveItem(Gold001, 5) + PlayMusic(_00E_MUS_Special_OceansWidowM, MUSIC_LENGTH) + EndIf + Else + ChangeMusicVolume() + EndIf + + bMusicLocked = False + EndIf +EndEvent + +Event OnUpdate() + TryStopMusic() +EndEvent + +Event OnBardsLoadGame(string eventName, string strArg, float numArg, Form sender) + ; Player just loaded a save with the gramophone playing. The sound is dead by now. + TryStopMusic() +EndEvent + +Event OnCellAttach() + TryStopMusic() +EndEvent + +Event OnLoad() + TryStopMusic() +EndEvent + +Event OnCellDetach() + TryStopMusic() +EndEvent + +Event OnUnload() + TryStopMusic() +EndEvent + +State DoneCleanup + Event OnCellAttach() + ; Do nothing + EndEvent + + Event OnLoad() + ; Do nothing + EndEvent + + Event OnCellDetach() + ; Do nothing + EndEvent + + Event OnUnload() + ; Do nothing + EndEvent +EndState diff --git a/scripts/source/_00e_game_playerhouse_boardsc.psc b/scripts/source/_00e_game_playerhouse_boardsc.psc new file mode 100644 index 00000000..5297a5c8 --- /dev/null +++ b/scripts/source/_00e_game_playerhouse_boardsc.psc @@ -0,0 +1,186 @@ +scriptName _00E_Game_Playerhouse_BoardSC extends ObjectReference conditional + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +function EnableFurniture(Int iLevel) + + FadeToBlackIMOD.Apply(1.00000) + utility.Wait(2 as Float) + FadeToBlackHoldIMOD.ApplyCrossFade(1 as Float) + if iLevel == 1 + _00E_Game_Playerhouse_ArkMarket_Level01Linker.Enable() + elseIf iLevel == 2 + _00E_Game_Playerhouse_ArkMarket_Level02Linker.Enable() + elseIf iLevel == 3 + _00E_Game_Playerhouse_ArkMarket_Level03Linker.Enable() + endIf + FadeToBlackBackIMOD.ApplyCrossFade(1 as Float) + +endFunction + +function DisableFurniture() + + FadeToBlackIMOD.Apply(1.00000) + utility.Wait(2 as Float) + FadeToBlackHoldIMOD.ApplyCrossFade(1 as Float) + _00E_Game_Playerhouse_ArkMarket_Level01Linker.Disable(false) + _00E_Game_Playerhouse_ArkMarket_Level02Linker.Disable(false) + _00E_Game_Playerhouse_ArkMarket_Level03Linker.Disable(false) + FadeToBlackBackIMOD.ApplyCrossFade(1 as Float) + +endFunction + + +function OnActivate(ObjectReference akActionRef) + + ;backwards compatibility for saves prior patch 1.2.3.0 + If (_00E_Game_Playerhouse_ArkMarket_Level01Linker.IsEnabled()) + _00E_FurniturePurchased.SetValue(1) + EndIf + ;backwards compatibility for saves prior patch 1.2.3.0 + + Int iButton = _00E_Game_PlayerHouse_ArkMarket_Board.Show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000) + if iButton == 7 + return + elseIf iButton == 0 + + If PlayerREF.GetParentCell() == CapitalCityPlayerhouse + PlayerREF.RemoveItem(Gold001, 300) + Else + PlayerREF.RemoveItem(Gold001, 1250) + EndIf + + _00E_FurniturePurchased.SetValue(1) + self.EnableFurniture(1) + + elseIf iButton == 1 + + If PlayerREF.GetParentCell() == CapitalCityPlayerhouse + PlayerREF.RemoveItem(Gold001, 500) + Else + PlayerREF.RemoveItem(Gold001, 1500) + EndIf + + _00E_FurniturePurchased.SetValue(2) + self.EnableFurniture(2) + + elseIf iButton == 2 + + If PlayerREF.GetParentCell() == CapitalCityPlayerhouse + PlayerREF.RemoveItem(Gold001, 700) + Else + PlayerREF.RemoveItem(Gold001, 1750) + EndIf + + _00E_FurniturePurchased.SetValue(3) + self.EnableFurniture(3) + + elseif iButton == 4 + + int iButton02 = _00E_Game_PlayerHouse_RemoveFurniture.Show() + + if iButton02 == 0 + + ReturnAndRefund() + + Else + + Activate(PlayerREF) + + EndIf + + elseif iButton == 5 + + Cell cCurrentCell = Self.GetParentCell() + String sHouseName = NQ24.ChooseHouseName() + cCurrentCell.SetName(sHouseName) + + If cCurrentCell == CapitalCityPlayerhouse + Player.sHouseMarketQuarterName = sHouseName + ElseIf cCurrentCell == CapitalCityPlayerHouseUpper + Player.sHouseNobleQuarterName = sHouseName + EndIf + + elseif iButton == 6 + + _00E_PlayerhousingMaster.GetMaster().ShowExpansionBoardTutorial() + + endIf + +endFunction + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +Function ReturnAndRefund() + + DisableFurniture() + + If PlayerREF.GetParentCell() == CapitalCityPlayerhouse + + If _00E_FurniturePurchased.GetValue() == 1 + PlayerREF.AddItem(Gold001, 150) + _00E_FurniturePurchased.SetValue(0) + ElseIf _00E_FurniturePurchased.GetValue() == 2 + PlayerREF.AddItem(Gold001, 250) + _00E_FurniturePurchased.SetValue(0) + ElseIf _00E_FurniturePurchased.GetValue() == 3 + PlayerREF.AddItem(Gold001, 350) + _00E_FurniturePurchased.SetValue(0) + EndIf + + ElseIf PlayerREF.GetParentCell() == CapitalCityPlayerhouseUpper + + If _00E_FurniturePurchased.GetValue() == 1 + PlayerREF.AddItem(Gold001, 625) + _00E_FurniturePurchased.SetValue(0) + ElseIf _00E_FurniturePurchased.GetValue() == 2 + PlayerREF.AddItem(Gold001, 750) + _00E_FurniturePurchased.SetValue(0) + ElseIf _00E_FurniturePurchased.GetValue() == 3 + PlayerREF.AddItem(Gold001, 875) + _00E_FurniturePurchased.SetValue(0) + EndIf + + EndIf + +EndFunction + +;===================================================================================== +; PROPERTIES +;===================================================================================== + +Actor Property PlayerREF Auto + +Cell Property CapitalCityPlayerhouse Auto +Cell Property CapitalCityPlayerHouseUpper Auto + +GlobalVariable Property _00E_FurniturePurchased Auto + +bool Property bLevel01FurniturePurchased Auto Conditional Hidden +bool Property bLevel02FurniturePurchased Auto Conditional Hidden +bool Property bLevel03FurniturePurchased Auto Conditional Hidden + +imagespacemodifier property FadeToBlackBackIMOD auto +ObjectReference property _00E_Game_Playerhouse_ArkMarket_Level01Linker auto +message property _00E_Game_PlayerHouse_ArkMarket_Board auto +imagespacemodifier property FadeToBlackIMOD auto +Bool property __Config_bHouseHasLevel02 auto conditional +{Check this if this house has level 02 furniture designed.} +ObjectReference property _00E_Game_Playerhouse_ArkMarket_Level02Linker auto +imagespacemodifier property FadeToBlackHoldIMOD auto +Bool property __Config_bHouseHasLevel01 auto conditional +{Check this if this house has level 01 furniture designed.} +ObjectReference property _00E_Game_Playerhouse_ArkMarket_Level03Linker auto +Bool property __Config_bHouseHasLevel03 auto conditional +{Check this if this house has level 03 furniture designed.} + +MiscObject Property Gold001 Auto + +Message Property _00E_Game_PlayerHouse_RemoveFurniture Auto + +_00E_NQ24_Playerhousing_Functions Property NQ24 Auto +_00E_PlayerHousing_CellNameSC Property Player Auto diff --git a/scripts/source/_00e_placeablegrammophonplay.psc b/scripts/source/_00e_placeablegrammophonplay.psc new file mode 100644 index 00000000..4a428c87 --- /dev/null +++ b/scripts/source/_00e_placeablegrammophonplay.psc @@ -0,0 +1,161 @@ +Scriptname _00E_PlaceableGrammophonPlay extends ObjectReference + +Sound Property _00E_MUS_Placeable_Koppophon Auto +MusicType Property _00E_SilenceTransitionHighPriority Auto ; OBSOLETE. Left for version update on older saves. +MusicType Property _00E_SilenceKoppophon Auto +GlobalVariable Property _00E_AchievementsEnabled Auto +Message Property _00E_PlayerhousingKoppophonVolume Auto +Actor Property PlayerREF Auto + +Int playbackId = -1 +Float volume = 0.5 +Bool bDone ; Unlocked END_KOPPOPHON_01 achievement +Bool bMusicLocked = False +Bool bOldSilenceUpdated = False + +Float Property MUSIC_LENGTH = 87.2 AutoReadOnly + + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +Function StopMusic() + bMusicLocked = True + + UnregisterForModEvent("BardsLoadGame") + UnregisterForUpdate() + + If bOldSilenceUpdated == False + bOldSilenceUpdated = True + If playbackId != -1 + _00E_SilenceTransitionHighPriority.Remove() + EndIf + EndIf + + If playbackId != -1 + Sound.StopInstance(playbackId) + playbackId = -1 + EndIf + + _00E_SilenceKoppophon.Remove() + + bMusicLocked = False +EndFunction + +Function TryStopMusic() + If bMusicLocked == False + StopMusic() + Else + RegisterForSingleUpdate(0.5) + EndIf +EndFunction + +Function Cleanup() + GoToState("DoneCleanup") + TryStopMusic() +EndFunction + + +;===================================================================================== +; EVENTS +;===================================================================================== + +Event OnInit() + GoToState("DoneCleanup") +EndEvent + +Event OnActivate(ObjectReference triggerRef) + If triggerRef == PlayerREF && _00E_PlayerhousingMaster.ReferenceCanBeActivated(Self) && bMusicLocked == False + bMusicLocked = True + + If playbackId == -1 ; Start playing + bOldSilenceUpdated = True + RegisterForModEvent("BardsLoadGame", "OnBardsLoadGame") + + _00E_SilenceKoppophon.Add() + + playbackId = _00E_MUS_Placeable_Koppophon.Play(Self) + If volume <= 0.0 || volume > 1.0 + volume = 0.5 + EndIf + Sound.SetInstanceVolume(playbackId, volume) + RegisterForSingleUpdate(_00E_QuestFunctions.AdjustTimePeriodByEngineTimerError(MUSIC_LENGTH)) + + GoToState("") + + _00E_PlayerhousingKoppophonVolume.Show(volume * 100.0) + + If _00E_AchievementsEnabled.GetValueInt() == 1 && (bDone == False) + bDone = True + Game.UnlockAchievement("END_KOPPOPHON_01") + EndIf + + ElseIf bOldSilenceUpdated == False + ; Player just loaded an older save with the Koppophon playing. The sound is dead by now. + StopMusic() + + Else ; Volume control + Float fNewVolume = volume + 0.25 + If fNewVolume > 1.0 + fNewVolume = 0.0 + EndIf + + Sound.SetInstanceVolume(playbackId, fNewVolume) + If fNewVolume == 0.0 ; On mute + _00E_SilenceKoppophon.Remove() + ElseIf volume == 0.0 ; On unmute + _00E_SilenceKoppophon.Add() + EndIf + volume = fNewVolume + + _00E_PlayerhousingKoppophonVolume.Show(volume * 100.0) + + EndIf + + bMusicLocked = False + EndIf +EndEvent + +Event OnUpdate() + TryStopMusic() +EndEvent + +Event OnBardsLoadGame(string eventName, string strArg, float numArg, Form sender) + ; Player just loaded a save with the Koppophon playing. The sound is dead by now. + TryStopMusic() +EndEvent + +Event OnCellAttach() + Cleanup() +EndEvent + +Event OnLoad() + Cleanup() +EndEvent + +Event OnCellDetach() + Cleanup() +EndEvent + +Event OnUnload() + Cleanup() +EndEvent + +State DoneCleanup + Event OnCellAttach() + ; Do nothing + EndEvent + + Event OnLoad() + ; Do nothing + EndEvent + + Event OnCellDetach() + ; Do nothing + EndEvent + + Event OnUnload() + ; Do nothing + EndEvent +EndState diff --git a/scripts/source/_00e_playerhousing_furniture.psc b/scripts/source/_00e_playerhousing_furniture.psc new file mode 100644 index 00000000..f5717f8f --- /dev/null +++ b/scripts/source/_00e_playerhousing_furniture.psc @@ -0,0 +1,48 @@ +scriptname _00E_Playerhousing_Furniture extends ObjectReference +{A manipulatable housing object while being in the world} + +Float Property CustomDistance Auto +{ Custom distance from the player in the placemenet Move Mode } +Float Property OffsetAngleZ Auto +{ Custom offset Z rotation in the placemenet Move Mode } +Float Property OffsetPositionZ Auto +{ Custom offset Z position in the placemenet Move Mode } +Bool Property IsSetPositionIncompatible Auto +{ If the .nif of the object has a bhkCollisionObject with SET_LOCAL flag, SetPosition() or MoveTo() can easily mess this object up in the placement mode. } + +Form Property InventoryItem Auto Hidden + +_00E_Playerhousing_FurnitureItem Property furnitureItem Auto Hidden +{ OBSOLETE. Left for compatibility with older saves. } + +Form Function GetInventoryItem() + If furnitureItem ; Update from the old way of storing the base inventory item + If InventoryItem == None + InventoryItem = furnitureItem.GetBaseObject() + EndIf + furnitureItem = None + EndIf + + Return InventoryItem +EndFunction + +Function finishPlacement() + ; This function is called when the furniture object is at the right position and being placed. + + SetMotionType(Motion_Dynamic, True) + + ; in case we place a mannequin, we need to store its position + ObjectReference myObjRef = self as ObjectReference + If myObjRef as _00E_Playerhousing_MannequinControl + (myObjRef as _00E_Playerhousing_MannequinControl).FinishPlacement() + Else + BlockActivation(true) + Disable() + Utility.Wait(0.1) + Enable() + + If myObjRef as _00E_Phasmalist_Workbench + (myObjRef as _00E_Phasmalist_Workbench).FinishPlacement() + EndIf + EndIf +EndFunction diff --git a/scripts/source/_00e_playerhousing_furnitureitem.psc b/scripts/source/_00e_playerhousing_furnitureitem.psc new file mode 100644 index 00000000..30ea0540 --- /dev/null +++ b/scripts/source/_00e_playerhousing_furnitureitem.psc @@ -0,0 +1,43 @@ +scriptname _00E_Playerhousing_FurnitureItem extends ObjectReference +{A manipulatable housing object while being in the players inventory} + +ActorBase Property _MANNEQUIN_toCreate auto +Furniture Property _FURNITURE_toCreate auto +Container Property _CONTAINER_toCreate auto +Light Property _LIGHT_toCreate auto +MiscObject Property _MISC_toCreate Auto +Activator Property _ACTIVATOR_toCreate Auto + +_00E_PlayerhousingMaster Property master Auto + +Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) + If akNewContainer == None + If master == None + master = _00E_PlayerhousingMaster.GetMaster() + EndIf + master.playerItemDropped(Self) + EndIf +EndEvent + +_00E_Playerhousing_Furniture Function placeFurnitureAtMe() + _00E_Playerhousing_Furniture result = None + If _MANNEQUIN_toCreate + result = PlaceAtMe(_MANNEQUIN_toCreate, abForcePersist = True, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + ElseIf _FURNITURE_toCreate + result = PlaceAtMe(_FURNITURE_toCreate, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + ElseIf _CONTAINER_toCreate + result = PlaceAtMe(_CONTAINER_toCreate, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + ElseIf _LIGHT_toCreate + result = PlaceAtMe(_LIGHT_toCreate, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + ElseIf _ACTIVATOR_toCreate + result = PlaceAtMe(_ACTIVATOR_toCreate, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + ElseIf _MISC_toCreate + result = PlaceAtMe(_MISC_toCreate, abInitiallyDisabled = True) as _00E_Playerhousing_Furniture + EndIf + + If result == None + Debug.MessageBox("ERROR: *_toCreate property in playerhousingfurnitureitem is no furnitureitem, please write a bugticket") + EndIf + + Return result +EndFunction \ No newline at end of file diff --git a/scripts/source/_00e_playerhousing_lightfurniture.psc b/scripts/source/_00e_playerhousing_lightfurniture.psc new file mode 100644 index 00000000..e61375f6 --- /dev/null +++ b/scripts/source/_00e_playerhousing_lightfurniture.psc @@ -0,0 +1,23 @@ +Scriptname _00E_Playerhousing_LightFurniture extends _00E_Playerhousing_Furniture + +Light Property LIGHT_toCreate auto +{not used due to graphic bugs} +; ObjectReference createdLight + +function finishPlacement() +{this function is called when the furniture object is at the right position and being placed; use e.g. for light} + parent.finishPlacement() + ;real light cannot be placed since it causes graphic bugs + + ;createdLight = placeAtMe(LIGHT_toCreate) + ;createdLight.setScale(0.99) +Endfunction + +;/ +Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) + if akOldContainer== None + createdLight.disable() + createdLight.delete() + Endif +Endevent +/; \ No newline at end of file diff --git a/scripts/source/_00e_playerhousing_mannequincontrol.psc b/scripts/source/_00e_playerhousing_mannequincontrol.psc new file mode 100644 index 00000000..8b70a7b1 --- /dev/null +++ b/scripts/source/_00e_playerhousing_mannequincontrol.psc @@ -0,0 +1,231 @@ +Scriptname _00E_Playerhousing_MannequinControl extends Actor + +import utility + +Actor Property PlayerREF Auto + +Bool bIsInPlacementMode = False +Bool bActivationBlocked = False + + +;===================================================================================== +; EVENTS +;===================================================================================== + +Event OnCellLoad() + If bIsInPlacementMode == False + ResetOnLoad() + EndIf +EndEvent + +Event OnLoad() + If bIsInPlacementMode + ResetOnLoad() + EndIf +EndEvent + +Event OnActivate(ObjectReference TriggerRef) + If TriggerRef == PlayerREF && _00E_PlayerhousingMaster.ReferenceCanBeActivated(self) && bActivationBlocked == False + bActivationBlocked = True + + ConvertArmorSlots() ; Version update + + OpenInventory(True) + ResetPosition() + Wait(0.1) + EnableAI(False) + + bActivationBlocked = False + EndIf +EndEvent + +Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) + If (akBaseItem as Armor) + If TryRegisterAddedArmor(akBaseItem) + EquipItem(akBaseItem) + Else + ;Turn it back if the mannequin has one of these already, or if all the slots are full. + RemoveItem(akBaseItem, aiItemCount, True, PlayerREF) + EndIf + Else + RemoveItem(akBaseItem, aiItemCount, True, PlayerREF) + EndIf +EndEvent + +Event OnObjectUnequipped(Form akBaseObject, ObjectReference akReference) + If (akBaseObject as Armor) + UnregisterRemovedArmor(akBaseObject) + EndIf +EndEvent + + +;===================================================================================== +; ARMOR SLOTS TRACKING +;===================================================================================== + +Form Property ArmorSlot01 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot02 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot03 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot04 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot05 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot06 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot07 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot08 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot09 Auto Hidden ; Obsolete. Left for version updates on older saves. +Form Property ArmorSlot10 Auto Hidden ; Obsolete. Left for version updates on older saves. + +Form[] ArmorSlots +Bool bConvertedArmorSlots = False + +Function ConvertArmorSlots() + If bConvertedArmorSlots + Return + EndIf + bConvertedArmorSlots = True + + ArmorSlots = New Form[10] + + Int index = _ConvertArmorSlot(0, ArmorSlot01) + index = _ConvertArmorSlot(index, ArmorSlot02) + index = _ConvertArmorSlot(index, ArmorSlot03) + index = _ConvertArmorSlot(index, ArmorSlot04) + index = _ConvertArmorSlot(index, ArmorSlot05) + index = _ConvertArmorSlot(index, ArmorSlot06) + index = _ConvertArmorSlot(index, ArmorSlot07) + index = _ConvertArmorSlot(index, ArmorSlot08) + index = _ConvertArmorSlot(index, ArmorSlot09) + index = _ConvertArmorSlot(index, ArmorSlot10) + + ArmorSlot01 = None + ArmorSlot02 = None + ArmorSlot03 = None + ArmorSlot04 = None + ArmorSlot05 = None + ArmorSlot06 = None + ArmorSlot07 = None + ArmorSlot08 = None + ArmorSlot09 = None + ArmorSlot10 = None +EndFunction + +Int Function _ConvertArmorSlot(Int index, Form armorItem) + If armorItem && ArmorSlots.Find(armorItem) < 0 + ArmorSlots[index] = armorItem + index += 1 + EndIf + + Return index +EndFunction + +Bool Function TryRegisterAddedArmor(Form armorItem) + ; First check to see if this is already in a slot + If ArmorSlots.Find(armorItem) >= 0 + Return False + EndIf + + ; Now find an emtpy slot to put it in, if there is one. + Int i = 0 + While i < ArmorSlots.Length + If ArmorSlots[i] == None + ArmorSlots[i] = armorItem + Return True + EndIf + + i += 1 + EndWhile + + ; Nope. No room left. + Return False +EndFunction + +Function UnregisterRemovedArmor(Form armorItem) + ;This loop will also clear duplicates that might have been generated. + Int i = 0 + While i < ArmorSlots.Length + If ArmorSlots[i] == armorItem + ArmorSlots[i] = None + EndIf + i += 1 + EndWhile +EndFunction + +Function ReequipAllArmor() + UnequipAll() + + Int i = 0 + While i < ArmorSlots.Length + If ArmorSlots[i] + EquipItem(ArmorSlots[i]) + EndIf + i += 1 + EndWhile +EndFunction + + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +Float forceX +Float forceY +Float forceZ +Float forceAngleX +Float forceAngleY +Float forceAngleZ + +Bool bPosisionValidated = False + +Function ResetPosition() + If bPosisionValidated == False + bPosisionValidated = True + + If forceX == 0 && forceY == 0 && forceZ == 0 + Float fAngleZ = PlayerREF.GetAngleZ() + Float fDistanceFromPlayer = 100.0 + + forceX = PlayerREF.GetPositionX() + fDistanceFromPlayer * Math.sin(fAngleZ) + forceY = PlayerREF.GetPositionY() + fDistanceFromPlayer * Math.cos(fAngleZ) + forceZ = PlayerREF.GetPositionZ() + EndIf + EndIf + + SetPosition(forceX, forceY, forceZ) + SetAngle(forceAngleX, forceAngleY, forceAngleZ) +EndFunction + +Function ResetOnLoad() + ConvertArmorSlots() ; Version update + + BlockActivation() + + EnableAI(True) + If bIsInPlacementMode == False + ResetPosition() + EndIf + ReequipAllArmor() + EnableAI(False) +EndFunction + +Function StartPlacement() + bIsInPlacementMode = True +EndFunction + +Function FinishPlacement() + bIsInPlacementMode = False + + Disable() + + forceX = GetPositionX() + forceY = GetPositionY() + forceZ = GetPositionZ() + forceAngleX = GetAngleX() + forceAngleY = GetAngleY() + forceAngleZ = GetAngleZ() + + bPosisionValidated = True + + Enable() + + _00E_QuestFunctions.WaitForReferenceToLoad(self) + ResetOnLoad() +EndFunction diff --git a/scripts/source/_00e_playerhousingcurrentomanipulate.psc b/scripts/source/_00e_playerhousingcurrentomanipulate.psc new file mode 100644 index 00000000..ff095ced --- /dev/null +++ b/scripts/source/_00e_playerhousingcurrentomanipulate.psc @@ -0,0 +1,336 @@ +Scriptname _00E_PlayerhousingCurrentOManipulate extends ReferenceAlias + +EffectShader Property _00E_PlayerHousingManipulationShader Auto +Sound Property UIMenuPrevNext Auto +Actor Property PlayerRef Auto + +String Property CONTROL_TURN_LEFT = "Strafe Left" AutoReadOnly +String Property CONTROL_TURN_RIGHT = "Strafe Right" AutoReadOnly +String Property CONTROL_MOVE_UP = "Forward" AutoReadOnly +String Property CONTROL_MOVE_DOWN = "Back" AutoReadOnly + +Int Property TRANSLATION_TURN_LEFT = 0 AutoReadOnly +Int Property TRANSLATION_TURN_RIGHT = 1 AutoReadOnly +Int Property TRANSLATION_MOVE_UP = 2 AutoReadOnly +Int Property TRANSLATION_MOVE_DOWN = 3 AutoReadOnly + +Int Property STATE_IDLE = 0 AutoReadOnly +Int Property STATE_UPDATING = 1 AutoReadOnly +Int Property STATE_WORKING = 2 AutoReadOnly + +Float Property ROTATION_SPEED_START = 15.0 AutoReadOnly +Float Property ROTATION_SPEED_FALLBACK = 20.0 AutoReadOnly +Float Property ROTATION_SPEED_MAX = 180.0 AutoReadOnly +Float Property ROTATION_SPEED_CHANGE_MOD = 0.25 AutoReadOnly +Float Property ROTATION_MAX = 90.0 AutoReadOnly + +Float Property MOVEMENT_SPEED_START = 10.0 AutoReadOnly +Float Property MOVEMENT_SPEED_FALLBACK = 20.0 AutoReadOnly +Float Property MOVEMENT_SPEED_MAX = 200.0 AutoReadOnly +Float Property MOVEMENT_SPEED_CHANGE_MOD = 0.25 AutoReadOnly +Float Property MOVEMENT_MAX = 100.0 AutoReadOnly + +Float Property FAST_TRANSLATION_SPEED = 1000000.0 AutoReadOnly + +Float fObjectPosX +Float fObjectPosY +Float fObjectPosZ +Float fObjectAngleX +Float fObjectAngleY +Float fObjectAngleZ +Float fPlayerPosZ +Float fTablePosZ + +Float fTranslationSpeed +Float fTranslationSpeedIncrease + +Int iWorkingState +Int iCurrentTranslation +Bool bGamepadMode +Int iWatchedKeyCode +Int iTurnLeftKey +Int iTurnRightKey +Int iMoveUpKey +Int iMoveDownKey + +Function Setup(ObjectReference curObjectRef) + ForceRefTo(curObjectRef) + + iWorkingState = STATE_IDLE + + bGamepadMode = Game.UsingGamepad() + If bGamepadMode == False + iTurnLeftKey = Input.GetMappedKey(CONTROL_TURN_LEFT, 0) + iTurnRightKey = Input.GetMappedKey(CONTROL_TURN_RIGHT, 0) + iMoveUpKey = Input.GetMappedKey(CONTROL_MOVE_UP, 0) + iMoveDownKey = Input.GetMappedKey(CONTROL_MOVE_DOWN, 0) + Else + iTurnLeftKey = 274 + iTurnRightKey = 275 + iMoveUpKey = 280 + iMoveDownKey = 281 + EndIf + + If PlayerRef == None ; Just in case + PlayerRef = Game.GetPlayer() + EndIf + + fPlayerPosZ = PlayerRef.GetPositionZ() + fTablePosZ = fPlayerPosZ + 64.0 + + GoToState("Working") + + TryRegisterForKey(iTurnLeftKey, CONTROL_TURN_LEFT) + TryRegisterForKey(iTurnRightKey, CONTROL_TURN_RIGHT) + TryRegisterForKey(iMoveUpKey, CONTROL_MOVE_UP) + TryRegisterForKey(iMoveDownKey, CONTROL_MOVE_DOWN) + + _00E_PlayerHousingManipulationShader.Play(curObjectRef) +EndFunction + +Function TryRegisterForKey(Int iKeyCode, String control) + If iKeyCode > 0 + RegisterForKey(iKeyCode) + Else + RegisterForControl(control) + EndIf +EndFunction + +Function Shutdown(Bool bRegisterNewOffsets) + GoToState("") + UnregisterForAllKeys() + UnregisterForAllControls() + UnregisterForUpdate() + + ObjectReference myRef = GetRef() + If myRef != None + _00E_PlayerHousingManipulationShader.Stop(myRef) + + While iWorkingState != STATE_IDLE && iWorkingState != STATE_WORKING + Utility.WaitMenuMode(0.05) + EndWhile + If iWorkingState == STATE_WORKING + myRef.StopTranslation() + EndIf + + If bRegisterNewOffsets + Float fNewOffsetAngleZ = myRef.GetAngleZ() - PlayerRef.GetAngleZ() + Float fNewOffsetPosZ = myRef.GetPositionZ() - PlayerRef.GetPositionZ() + (GetOwningQuest() as _00E_PlayerhousingMaster).RegisterNewHousingObjectOffsets(fNewOffsetAngleZ, fNewOffsetPosZ) + EndIf + + Clear() + EndIf +EndFunction + +State Working + Event OnKeyDown(Int iKeyCode) + TryStartTranslation(KeyCodeToTranslationMode(iKeyCode), iKeyCode) + EndEvent + + Event OnKeyUp(Int iKeyCode, Float fHoldTime) + TryStopTranslation(KeyCodeToTranslationMode(iKeyCode)) + EndEvent + + Event OnControlDown(String control) + TryStartTranslation(ControlToTranslationMode(control), 0) + EndEvent + + Event OnControlUp(String control, Float fHoldTime) + TryStopTranslation(ControlToTranslationMode(control)) + EndEvent + + Event OnUpdate() + ; OnControlUp is not always properly triggered. Maybe OnKeyUp too. The code below is a workaround for that. + ; For gamepads this failsafe is useless because Input.IsKeyPressed always returns False for controller buttons. + If iWatchedKeyCode > 0 && iWorkingState == STATE_WORKING + If Input.IsKeyPressed(iWatchedKeyCode) + RegisterForSingleUpdate(0.05) + Else + TryStopTranslation(iCurrentTranslation) + EndIf + EndIf + EndEvent + + Event OnTranslationComplete() + ; The previously started translation reached its end point + + If iWorkingState != STATE_WORKING + Return + EndIf + iWorkingState = STATE_UPDATING + + ObjectReference myRef = GetRef() + + If iWatchedKeyCode <= 0 || fTranslationSpeedIncrease < 0.0 + ; Do nothing + ElseIf iCurrentTranslation == TRANSLATION_TURN_LEFT || iCurrentTranslation == TRANSLATION_TURN_RIGHT + Float fRotationAngle = GetNextTranslationStep(ROTATION_SPEED_MAX, ROTATION_SPEED_CHANGE_MOD, ROTATION_MAX) + fObjectAngleZ = myRef.GetAngleZ() + TurnTranslate(myRef, fRotationAngle) + + iWorkingState = STATE_WORKING + Return + ElseIf iCurrentTranslation == TRANSLATION_MOVE_UP || iCurrentTranslation == TRANSLATION_MOVE_DOWN + Float fMoveZ = GetNextTranslationStep(MOVEMENT_SPEED_MAX, MOVEMENT_SPEED_CHANGE_MOD, MOVEMENT_MAX) + fObjectPosZ = myRef.GetPositionZ() + MoveTranslate(myRef, fMoveZ) + + iWorkingState = STATE_WORKING + Return + EndIf + + ; Fallback + FinalizeTranslation(myRef) + UIMenuPrevNext.Play(PlayerRef) + + iWorkingState = STATE_IDLE + EndEvent +EndState + +Int Function KeyCodeToTranslationMode(Int iKeyCode) + If iKeyCode > 0 + If iKeyCode == iTurnLeftKey + Return TRANSLATION_TURN_LEFT + ElseIf iKeyCode == iTurnRightKey + Return TRANSLATION_TURN_RIGHT + ElseIf iKeyCode == iMoveUpKey + Return TRANSLATION_MOVE_UP + ElseIf iKeyCode == iMoveDownKey + Return TRANSLATION_MOVE_DOWN + EndIf + EndIf + + Return -1 +EndFunction + +Int Function ControlToTranslationMode(String control) + If control == CONTROL_TURN_LEFT + Return TRANSLATION_TURN_LEFT + ElseIf control == CONTROL_TURN_RIGHT + Return TRANSLATION_TURN_RIGHT + ElseIf control == CONTROL_MOVE_UP + Return TRANSLATION_MOVE_UP + ElseIf control == CONTROL_MOVE_DOWN + Return TRANSLATION_MOVE_DOWN + EndIf + + Return -1 +EndFunction + +Function TryStartTranslation(Int iTranslationMode, Int iTriggerKeyCode) + If iTranslationMode < 0 || iWorkingState != STATE_IDLE + Return + EndIf + + iWorkingState = STATE_UPDATING + iCurrentTranslation = iTranslationMode + iWatchedKeyCode = iTriggerKeyCode + + ObjectReference myRef = GetRef() + + fObjectPosX = myRef.GetPositionX() + fObjectPosY = myRef.GetPositionY() + fObjectPosZ = myRef.GetPositionZ() + + fObjectAngleX = myRef.GetAngleX() + fObjectAngleY = myRef.GetAngleY() + fObjectAngleZ = myRef.GetAngleZ() + + fTranslationSpeedIncrease = 0.0 + + If iCurrentTranslation == TRANSLATION_TURN_LEFT || iCurrentTranslation == TRANSLATION_TURN_RIGHT + If iWatchedKeyCode > 0 + fTranslationSpeed = ROTATION_SPEED_START + TurnTranslate(myRef, fTranslationSpeed * ROTATION_SPEED_CHANGE_MOD) + Else + fTranslationSpeed = ROTATION_SPEED_FALLBACK + TurnTranslate(myRef, ROTATION_MAX) + EndIf + ElseIf iCurrentTranslation == TRANSLATION_MOVE_UP || iCurrentTranslation == TRANSLATION_MOVE_DOWN + If iWatchedKeyCode > 0 + fTranslationSpeed = MOVEMENT_SPEED_START + MoveTranslate(myRef, fTranslationSpeed * MOVEMENT_SPEED_CHANGE_MOD) + Else + fTranslationSpeed = MOVEMENT_SPEED_FALLBACK + MoveTranslate(myRef, MOVEMENT_MAX) + EndIf + EndIf + + If iWatchedKeyCode > 0 && bGamepadMode == False + RegisterForSingleUpdate(0.05) + EndIf + + iWorkingState = STATE_WORKING +EndFunction + +Function TryStopTranslation(Int iTranslationMode) + If iCurrentTranslation != iTranslationMode || iWorkingState != STATE_WORKING + Return + EndIf + + iWorkingState = STATE_UPDATING + + ObjectReference myRef = GetRef() + myRef.StopTranslation() + UnregisterForUpdate() + FinalizeTranslation(myRef) + + iWorkingState = STATE_IDLE +EndFunction + +Function TurnTranslate(ObjectReference myRef, Float fRotationAngle) + If iCurrentTranslation == TRANSLATION_TURN_LEFT + fObjectAngleZ -= fRotationAngle + Else + fObjectAngleZ += fRotationAngle + EndIf + myRef.TranslateTo(fObjectPosX, fObjectPosY, fObjectPosZ, fObjectAngleX, fObjectAngleY, fObjectAngleZ, FAST_TRANSLATION_SPEED, fTranslationSpeed) +EndFunction + +Function MoveTranslate(ObjectReference myRef, Float fMoveZ) + If iCurrentTranslation == TRANSLATION_MOVE_DOWN + Float fNewZ = fObjectPosZ - fMoveZ + If fObjectPosZ > fTablePosZ && fNewZ < fTablePosZ + ; A primitive "drop on the table" + fNewZ = fTablePosZ + fTranslationSpeedIncrease = -1.0 ; Stop on reaching fPlayerPosZ. + ElseIf fObjectPosZ > fPlayerPosZ && fNewZ < fPlayerPosZ + ; A primitive "drop on the floor" + fNewZ = fPlayerPosZ + fTranslationSpeedIncrease = -1.0 ; Stop on reaching fPlayerPosZ. + EndIf + fObjectPosZ = fNewZ + Else + fObjectPosZ += fMoveZ + EndIf + myRef.TranslateTo(fObjectPosX, fObjectPosY, fObjectPosZ, fObjectAngleX, fObjectAngleY, fObjectAngleZ, fTranslationSpeed, FAST_TRANSLATION_SPEED) +EndFunction + +Float Function GetNextTranslationStep(Float fSpeedMax, Float fSpeedChangeMod, Float fChangeMax) + If fTranslationSpeed < fSpeedMax + If fTranslationSpeedIncrease < 20.0 + fTranslationSpeedIncrease += 5.0 + EndIf + fTranslationSpeed += fTranslationSpeedIncrease + If fTranslationSpeed > fSpeedMax + fTranslationSpeed = fSpeedMax + EndIf + EndIf + Float fResult = fTranslationSpeed * fSpeedChangeMod + If fTranslationSpeed >= fSpeedMax || fResult > fChangeMax + Return fChangeMax + Else + Return fResult + EndIf +EndFunction + +Function FinalizeTranslation(ObjectReference myRef) + ; TranslateTo below prevents the object from twitching and becoming blurry when a translation ends + If iCurrentTranslation == TRANSLATION_TURN_LEFT || iCurrentTranslation == TRANSLATION_TURN_RIGHT + fObjectAngleZ = myRef.GetAngleZ() + ElseIf iCurrentTranslation == TRANSLATION_MOVE_UP || iCurrentTranslation == TRANSLATION_MOVE_DOWN + fObjectPosZ = myRef.GetPositionZ() + EndIf + myRef.TranslateTo(fObjectPosX, fObjectPosY, fObjectPosZ, fObjectAngleX, fObjectAngleY, fObjectAngleZ, FAST_TRANSLATION_SPEED, FAST_TRANSLATION_SPEED) +EndFunction diff --git a/scripts/source/_00e_playerhousingcurrentotranslation.psc b/scripts/source/_00e_playerhousingcurrentotranslation.psc new file mode 100644 index 00000000..45bac641 --- /dev/null +++ b/scripts/source/_00e_playerhousingcurrentotranslation.psc @@ -0,0 +1,117 @@ +Scriptname _00E_PlayerhousingCurrentOTranslation extends ReferenceAlias + +EffectShader Property _00E_PlayerHousingTranslationShader Auto +Actor Property PlayerRef Auto + +Bool bIsWorking = False +Bool bIsWarmingUp = False + +Float fDistance +Float fOffsetAngleZ +Float fOffsetPosZ + +Float Property ORBIT_ANGULAR_SPEED_CAP = 30.0 AutoReadOnly +Float Property FAST_TRANSLATION_SPEED = 1000000.0 AutoReadOnly + + +Function Setup(_00E_Playerhousing_Furniture furnitureRef, Bool bEnteringPlacement, Float fStoredOffsetAngleZ, Float fStoredOffsetPositionZ) + bIsWarmingUp = True + furnitureRef.Disable() + + If PlayerRef == None + PlayerRef = Game.GetPlayer() + EndIf + + fDistance = furnitureRef.CustomDistance + If fDistance <= 0.0 + fDistance = 100.0 + EndIf + + If bEnteringPlacement + fOffsetAngleZ = furnitureRef.OffsetAngleZ + fOffsetPosZ = furnitureRef.OffsetPositionZ + + If furnitureRef.IsSetPositionIncompatible == False + Float x = PlayerRef.GetPositionX() + Float y = PlayerRef.GetPositionY() + Float z = PlayerRef.GetPositionZ() + Float fAngleZ = PlayerRef.GetAngleZ() + + furnitureRef.SetPosition(x + fDistance * Math.sin(fAngleZ), y + fDistance * Math.cos(fAngleZ), z + fOffsetPosZ) + furnitureRef.SetAngle(0, 0, fAngleZ + fOffsetAngleZ) + EndIf + + ObjectReference myRef = furnitureRef as ObjectReference + If (myRef as _00E_Playerhousing_MannequinControl) + (myRef as _00E_Playerhousing_MannequinControl).StartPlacement() + ElseIf (myRef as _00E_Phasmalist_Workbench) + (myRef as _00E_Phasmalist_Workbench).StartPlacement() + EndIf + Else + fOffsetAngleZ = fStoredOffsetAngleZ + fOffsetPosZ = fStoredOffsetPositionZ + EndIf + + ForceRefTo(furnitureRef) + bIsWorking = True + furnitureRef.Enable() +EndFunction + +Function Shutdown() + bIsWorking = False + + ObjectReference myRef = GetRef() + If myRef + While bIsWarmingUp && (PlayerRef.GetParentCell() == myRef.GetParentCell()) + Utility.WaitMenuMode(0.05) + EndWhile + myRef.StopTranslation() + _00E_PlayerHousingTranslationShader.Stop(myRef) + Clear() + EndIf +EndFunction + +Event OnLoad() + ; Loop needs to be extracted from the rest of the code due to performance reasons (don't know why exactly, but defining new functions slows this down dramatically) + ObjectReference myRef = GetRef() + Float fPrevAngleZ = -1.0 + + myRef.SetMotionType(4) ; Set motion type to Motion_Keyframed. This would fix "collision phantoms" of the object while the player is moving around "dragging" it. + _00E_PlayerHousingTranslationShader.Play(myRef) + + bIsWarmingUp = False + + While bIsWorking + Float x = PlayerRef.GetPositionX() + Float y = PlayerRef.GetPositionY() + Float z = PlayerRef.GetPositionZ() + Float fAngleZ = PlayerRef.GetAngleZ() + + ; Cap the angular speed of the object's orbiting around the player at ORBIT_ANGULAR_SPEED_CAP. + ; This fixes some objects pushing the player (because they pass THROUGH the player?) on sharp camera turns. + If fPrevAngleZ >= 0.0 + Float fDelta = fAngleZ - fPrevAngleZ + If fDelta < -180.0 + fDelta += 360.0 + ElseIf fDelta > 180.0 + fDelta -= 360.0 + EndIf + If fDelta < -ORBIT_ANGULAR_SPEED_CAP + fAngleZ = fPrevAngleZ - ORBIT_ANGULAR_SPEED_CAP + If fAngleZ < 0.0 + fAngleZ += 360.0 + EndIf + ElseIf fDelta > ORBIT_ANGULAR_SPEED_CAP + fAngleZ = fPrevAngleZ + ORBIT_ANGULAR_SPEED_CAP + If fAngleZ >= 360.0 + fAngleZ -= 360.0 + EndIf + EndIf + EndIf + + If bIsWorking + myRef.TranslateTo(x + fDistance * Math.sin(fAngleZ), y + fDistance * Math.cos(fAngleZ), z + fOffsetPosZ, 0, 0, fAngleZ + fOffsetAngleZ, FAST_TRANSLATION_SPEED, FAST_TRANSLATION_SPEED) + EndIf + fPrevAngleZ = fAngleZ + EndWhile +EndEvent diff --git a/scripts/source/_00e_playerhousingmaster.psc b/scripts/source/_00e_playerhousingmaster.psc new file mode 100644 index 00000000..bff27002 --- /dev/null +++ b/scripts/source/_00e_playerhousingmaster.psc @@ -0,0 +1,554 @@ +scriptname _00E_PlayerhousingMaster extends Quest + +Actor Property player Auto +ReferenceAlias Property currentHousingObjectInTranslation Auto +ReferenceAlias Property currentHousingObjectInManipulation Auto +Message Property _00E_Playerhousing_CannotPlaceObjectsHere Auto +Message Property _00E_Playerhousing_ContainerContentMove Auto +Message Property _00E_Playerhousing_StartTutorial Auto +Message Property _00E_Playerhousing_ExpansionBoardTutorial Auto +Message Property _00E_Playerhousing_TranslationMode Auto +Message Property _00E_Playerhousing_TranslationModeTutorial Auto +Message Property _00E_Playerhousing_TranslationModeTutorial_Gamepad Auto +Message Property _00E_Playerhousing_ManipulationMode Auto +Message Property _00E_Playerhousing_ManipulationModeTutorial Auto +Message Property _00E_Playerhousing_ManipulationModeTutorial_Gamepad Auto +Sound Property UIMenuActive Auto +GlobalVariable Property _00E_Meditate_Allowed Auto +GlobalVariable Property _00E_Phasmalist_TankMode Auto +GlobalVariable Property _00E_DisableCraftingTutorials Auto + +_00E_Playerhousing_Furniture currentHousingObject + +Bool bIsInPlacementMode = False +Bool bDisableNormalActivation = False +Bool bGamepadMode = False +Bool bDroppedFromInventory = False +Int iPickupKey + +Float fStoredOffsetAngleZ +Float fStoredOffsetPositionZ + +String Property CONTROL_ACTIVATE = "Activate" AutoReadOnly +String Property CONTROL_SHEATH = "Ready Weapon" AutoReadOnly + + +;===================================================================================== +; GLOBAL FUNCTIONS +;===================================================================================== + +_00E_PlayerhousingMaster Function GetMaster() Global + Return Game.GetFormFromFile(0x00043270, "Skyrim.esm") as _00E_PlayerhousingMaster +EndFunction + +Bool Function ReferenceCanBeActivated(ObjectReference ref) Global + If (ref as _00E_Playerhousing_Furniture) + _00E_PlayerhousingMaster master = GetMaster() + If master + Return master.IsNormalActivationEnabled() + EndIf + EndIf + + Return True +EndFunction + + +;===================================================================================== +; TUTORIALS +;===================================================================================== + +Bool bStartTutorialShown = False + +Bool bHideTranslationTutorial = False +Bool bHideTranslationTutorial_Gamepad = False +Bool bHideManipulationTutorial = False +Bool bHideManipulationTutorial_Gamepad = False + +Function ShowStartBuildModeTutorial() + If _00E_DisableCraftingTutorials.GetValueInt() == 0 && bStartTutorialShown == False + bStartTutorialShown = True + _00E_Playerhousing_StartTutorial.Show() + EndIf +EndFunction + +Function ShowExpansionBoardTutorial() + ; Called from _00E_Game_Playerhouse_BoardSC + If _00E_Playerhousing_ExpansionBoardTutorial.Show() == 1 + bHideTranslationTutorial = False + bHideTranslationTutorial_Gamepad = False + bHideManipulationTutorial = False + bHideManipulationTutorial_Gamepad = False + EndIf +EndFunction + +Bool Function _ShowPlacementModeTutorial(Message msgTutorial, Bool bHideFlag) + If bHideFlag == False + Return (msgTutorial.Show() == 1) + Else + Return bHideFlag + EndIf +EndFunction + +Function ShowTranslationModeTutorial() + If bGamepadMode + bHideTranslationTutorial_Gamepad = _ShowPlacementModeTutorial(_00E_Playerhousing_TranslationModeTutorial_Gamepad, bHideTranslationTutorial_Gamepad) + Else + bHideTranslationTutorial = _ShowPlacementModeTutorial(_00E_Playerhousing_TranslationModeTutorial, bHideTranslationTutorial) + EndIf +EndFunction + +Function ShowManipulationModeTutorial() + If bGamepadMode + bHideManipulationTutorial_Gamepad = _ShowPlacementModeTutorial(_00E_Playerhousing_ManipulationModeTutorial_Gamepad, bHideManipulationTutorial_Gamepad) + Else + bHideManipulationTutorial = _ShowPlacementModeTutorial(_00E_Playerhousing_ManipulationModeTutorial, bHideManipulationTutorial) + EndIf +EndFunction + + +;===================================================================================== +; SERVICE FUNCTIONS +;===================================================================================== + +Bool Function CanEnterPlacementMode() + Return (_00E_Meditate_Allowed.GetValue() != 0.0 && _00E_Phasmalist_TankMode.GetValue() == 0.0) +EndFunction + +Float fPlacementModeCarryWeightMod = 0.0 + +Function EnterPlacementMode() + If bIsInPlacementMode == False + bIsInPlacementMode = True + _00E_Meditate_Allowed.SetValueInt(0) + Game.SetInChargen(true, true, false) ; Forbid saving the game while placing stuff + + ; Make the player over encumbered to prevent them from the default running and in general to slow them down + fPlacementModeCarryWeightMod = Player.GetAV("CarryWeight") * 2.0 + If fPlacementModeCarryWeightMod < 1000.0 + fPlacementModeCarryWeightMod = 1000.0 + EndIf + Player.ModAV("CarryWeight", -fPlacementModeCarryWeightMod) + + bGamepadMode = Game.UsingGamepad() + If bGamepadMode == False + iPickupKey = Input.GetMappedKey(CONTROL_SHEATH, 0) + Else + iPickupKey = 277 + EndIf + EndIf +EndFunction + +Function ExitPlacementMode() + If bIsInPlacementMode + bIsInPlacementMode = False + If fPlacementModeCarryWeightMod != 0.0 + Player.ModAV("CarryWeight", fPlacementModeCarryWeightMod) + fPlacementModeCarryWeightMod = 0.0 + EndIf + Game.SetInChargen(false, true, false) ; Re-allow saving + _00E_Meditate_Allowed.SetValueInt(1) + EndIf + + currentHousingObject = None ; Prevent persistence +EndFunction + +Function PickUpHousingObject() + ; Clear currentHousingObject ASAP because of possible race conditions + _00E_Playerhousing_Furniture furnitureRef = (currentHousingObject as _00E_Playerhousing_Furniture) + currentHousingObject = None + + Form furnBaseObject = furnitureRef.GetBaseObject() + If (furnBaseObject as ActorBase) || (furnBaseObject as Container) + If furnitureRef.GetNumItems() > 0 + furnitureRef.RemoveAllItems(Player) + _00E_Playerhousing_ContainerContentMove.Show() + Else + ; Whatever... + furnitureRef.RemoveAllItems(Player) + EndIf + EndIf + Player.AddItem(furnitureRef.GetInventoryItem(), 1, False) + furnitureRef.Disable() + _00E_Phasmalist_Workbench worbenchRef = (furnitureRef as ObjectReference) as _00E_Phasmalist_Workbench + If worbenchRef + worbenchRef.OnPickUp() + EndIf + furnitureRef.Delete() +EndFunction + +Function FinishPlacingHousingObject() + ; Clear currentHousingObject ASAP because of possible race conditions + _00E_Playerhousing_Furniture furnitureRef = (currentHousingObject as _00E_Playerhousing_Furniture) + currentHousingObject = None + + Utility.Wait(0.05) ; Wait for the shaders to stop for sure + furnitureRef.finishPlacement() + PlaySwitchSound() +EndFunction + +Function PlaySwitchSound() + UIMenuActive.Play(player) +EndFunction + +Function RegisterNewHousingObjectOffsets(Float fNewOffsetAngleZ, Float fNewOffsetPositionZ) + fStoredOffsetAngleZ = fNewOffsetAngleZ + fStoredOffsetPositionZ = fNewOffsetPositionZ +EndFunction + +Function Update_209() + bStartTutorialShown = ((Self as Quest) as _00E_PlayerhousingTutorial).StartTutorialIsShown() +EndFunction + + +;===================================================================================== +; CONTROLS +;===================================================================================== + +Bool bLockActions = False +Bool bActiveActivate = False + +Function LockActions() + bLockActions = True + InterruptActivate() +EndFunction + +Function UnlockActions() + bLockActions = False + InterruptActivate() +EndFunction + +Function InterruptActivate() + If bActiveActivate + bActiveActivate = False + UnregisterForUpdate() + EndIf +EndFunction + +Function EnableBuildmodeControls() + RegisterForControl(CONTROL_ACTIVATE) + If bIsInPlacementMode && iPickupKey > 0 + RegisterForKey(iPickupKey) + EndIf + + UnlockActions() +EndFunction + +Function DisableBuildmodeControls() + LockActions() + + UnregisterForAllControls() + UnregisterForAllKeys() + UnregisterForUpdate() +EndFunction + +Event OnControlDown(String control) + If control == CONTROL_ACTIVATE + If bActiveActivate + bActiveActivate = False + bDisableNormalActivation = True + UnregisterForUpdate() + ElseIf bLockActions == False + bActiveActivate = True + bDisableNormalActivation = False + RegisterForSingleUpdate(1.1) + EndIf + EndIf +EndEvent + +Event OnControlUp(String control, Float holdTime) + If control == CONTROL_ACTIVATE + If bActiveActivate + bActiveActivate = False + UnregisterForUpdate() + If bLockActions == False + activateShortPressed() + EndIf + EndIf + EndIf +EndEvent + +Event OnUpdate() + If bActiveActivate + bActiveActivate = False + bDisableNormalActivation = True + If bLockActions == False + activateLongPressed() + EndIf + EndIf +EndEvent + +Event OnKeyDown(Int iKeyCode) + If iKeyCode == iPickupKey + If bLockActions == False + pickUpPressed() + EndIf + EndIf +EndEvent + + +;===================================================================================== +; DEFAULT STATE +;===================================================================================== + +Event OnBeginState() + ExitPlacementMode() +EndEvent + +Function playerItemDropped(_00E_Playerhousing_FurnitureItem akItemReference) + ; Called from _00E_Playerhousing_FurnitureItem on a placeable dropped from the inventory + Player.AddItem(akItemReference, 1, False) + _00E_Playerhousing_CannotPlaceObjectsHere.Show() +EndFunction + +Function activateShortPressed() + ; Process short activate press +EndFunction + +Function activateLongPressed() + ; Process long activate press +EndFunction + +Function pickUpPressed() + ; Process pick up key press +EndFunction + +Function enableBuildmode() + ; Enter the build mode when the player enters their house + ShowStartBuildModeTutorial() + GoToState("Buildmode") +EndFunction + +Function disableBuildmode() + ; Exit a build mode when the player leaves their house +EndFunction + +Bool Function IsNormalActivationEnabled() + ; The player can activate a placeable furniture normally + Return True +EndFunction + + +;===================================================================================== +; STATE Buildmode +;===================================================================================== + +STATE Buildmode + ; The player can enter the manipulation or translation mode by choosing a housing object or dropping a housing item + + Event OnBeginState() + ExitPlacementMode() + bDisableNormalActivation = True + EnableBuildmodeControls() + EndEvent + + Event OnEndState() + DisableBuildmodeControls() + EndEvent + + Function playerItemDropped(_00E_Playerhousing_FurnitureItem akItemReference) + If CanEnterPlacementMode() == False || bLockActions ; Locked by something else + Player.AddItem(akItemReference, 1, False) + Return + EndIf + LockActions() + + currentHousingObject = akItemReference.placeFurnitureAtMe() + If currentHousingObject == None + ; Some error happened + Player.AddItem(akItemReference, 1, False) + UnlockActions() + Return + EndIf + + DisableBuildmodeControls() + akItemReference.Disable() + currentHousingObject.InventoryItem = akItemReference.GetBaseObject() + akItemReference.Delete() + bDroppedFromInventory = True + GoToState("Translation") + EndFunction + + Function activateLongPressed() + LockActions() + + _00E_Playerhousing_Furniture targetRef = Game.GetCurrentCrosshairRef() as _00E_Playerhousing_Furniture + If targetRef && targetRef.IsFurnitureInUse() == False && Utility.IsInMenuMode() == False && CanEnterPlacementMode() + currentHousingObject = targetRef + GoToState("Translation") + Else + UnlockActions() + EndIf + EndFunction + + Function activateShortPressed() + ObjectReference targetRef = Game.GetCurrentCrosshairRef() + If (targetRef as _00E_Playerhousing_Furniture) && (bLockActions == False) + If (targetRef as _00E_Playerhousing_FurnitureItem) + ; Activate() would mean "Take" for this misc. object, so do nothing + ElseIf (targetRef as _00E_Theriantrophist_BlockCraftingSC) || (targetRef as _00E_Playerhousing_MannequinControl) || (targetRef as _00E_BedScript) || (targetRef as _00E_Phasmalist_Workbench) || (targetRef as _00E_PlaceableGrammophonPlay) + ; These objects do activation themselves in OnActivate event + Else + targetRef.Activate(player, true) + EndIf + EndIf + EndFunction + + Function enableBuildmode() + ; Do nothing + EndFunction + + Function disableBuildmode() + GoToState("") + EndFunction + + Bool Function IsNormalActivationEnabled() + Return ((bDisableNormalActivation == False) && (bLockActions == False)) + EndFunction + +ENDSTATE + + +;===================================================================================== +; STATE Translation +;===================================================================================== + +STATE Translation + ; The selected housing object is moved with the player + + Event OnBeginState() + Bool bEnteringPlacement = (bIsInPlacementMode == False) + + Game.DisablePlayerControls(abMovement = false, abFighting = true, abCamSwitch = false, abLooking = false, abSneaking = false, abMenu = true, abActivate = true) + EnterPlacementMode() + + If bEnteringPlacement && bDroppedFromInventory == False + ObjectReference housingObjRef = currentHousingObject as ObjectReference + If (housingObjRef as _00E_PlaceableGrammophonPlay) + (housingObjRef as _00E_PlaceableGrammophonPlay).StopMusic() + EndIf + EndIf + + If bDroppedFromInventory == False + PlaySwitchSound() + Else + bDroppedFromInventory = False + EndIf + + _00E_Playerhousing_TranslationMode.Show() + + (currentHousingObjectInTranslation as _00E_PlayerhousingCurrentOTranslation).Setup(currentHousingObject, bEnteringPlacement, fStoredOffsetAngleZ, fStoredOffsetPositionZ) + + ShowTranslationModeTutorial() + + EnableBuildmodeControls() + EndEvent + + Event OnEndState() + Game.EnablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, abLooking = true, abSneaking = true, abMenu = true, abActivate = true) + EndEvent + + Function activateShortPressed() + DisableBuildmodeControls() + (currentHousingObjectInTranslation as _00E_PlayerhousingCurrentOTranslation).Shutdown() + GoToState("Manipulation") + EndFunction + + Function activateLongPressed() + DisableBuildmodeControls() + (currentHousingObjectInTranslation as _00E_PlayerhousingCurrentOTranslation).Shutdown() + FinishPlacingHousingObject() + GoToState("Buildmode") + EndFunction + + Function pickUpPressed() + DisableBuildmodeControls() + (currentHousingObjectInTranslation as _00E_PlayerhousingCurrentOTranslation).Shutdown() + PickUpHousingObject() + GoToState("Buildmode") + EndFunction + + Function enableBuildmode() + ; Do nothing + EndFunction + + Function disableBuildmode() + DisableBuildmodeControls() + (currentHousingObjectInTranslation as _00E_PlayerhousingCurrentOTranslation).Shutdown() + If currentHousingObject + PickUpHousingObject() + EndIf + GoToState("") + EndFunction + + Bool Function IsNormalActivationEnabled() + Return False + EndFunction + +ENDSTATE + + +;===================================================================================== +; STATE Manipulation +;===================================================================================== + +STATE Manipulation + ; The player can change orientation or altitude of the selected housing object by using the keys + + Event OnBeginState() + Game.DisablePlayerControls(abMovement = false, abFighting = true, abCamSwitch = false, abLooking = false, abSneaking = false, abMenu = true, abActivate = true) + Game.SetPlayerAIDriven(True) + + PlaySwitchSound() + + _00E_Playerhousing_ManipulationMode.Show() + + (currentHousingObjectInManipulation as _00E_PlayerhousingCurrentOManipulate).Setup(currentHousingObject) + + ShowManipulationModeTutorial() + + EnableBuildmodeControls() + EndEvent + + Event OnEndState() + Game.SetPlayerAIDriven(False) + Game.EnablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, abLooking = true, abSneaking = true, abMenu = true, abActivate = true) + EndEvent + + Function activateShortPressed() + DisableBuildmodeControls() + (currentHousingObjectInManipulation as _00E_PlayerhousingCurrentOManipulate).Shutdown(True) + GoToState("Translation") + EndFunction + + Function activateLongPressed() + DisableBuildmodeControls() + (currentHousingObjectInManipulation as _00E_PlayerhousingCurrentOManipulate).Shutdown(False) + FinishPlacingHousingObject() + GoToState("Buildmode") + EndFunction + + Function pickUpPressed() + DisableBuildmodeControls() + (currentHousingObjectInManipulation as _00E_PlayerhousingCurrentOManipulate).Shutdown(False) + PickUpHousingObject() + GoToState("Buildmode") + EndFunction + + Function enableBuildmode() + ; Do nothing + EndFunction + + Function disableBuildmode() + DisableBuildmodeControls() + (currentHousingObjectInManipulation as _00E_PlayerhousingCurrentOManipulate).Shutdown(False) + If currentHousingObject + PickUpHousingObject() + EndIf + GoToState("") + EndFunction + + Bool Function IsNormalActivationEnabled() + Return False + EndFunction + +ENDSTATE diff --git a/scripts/source/_00e_playerhousingtutorial.psc b/scripts/source/_00e_playerhousingtutorial.psc new file mode 100644 index 00000000..308e38f8 --- /dev/null +++ b/scripts/source/_00e_playerhousingtutorial.psc @@ -0,0 +1,14 @@ +Scriptname _00E_PlayerhousingTutorial extends Quest +{ OBSOLETE. Left for version update. } + +Bool Function StartTutorialIsShown() + Return False +EndFunction + +STATE NoTutorial + + Bool Function StartTutorialIsShown() + Return True + EndFunction + +Endstate diff --git a/scripts/source/_00e_playersetupscript.psc b/scripts/source/_00e_playersetupscript.psc new file mode 100644 index 00000000..65452046 --- /dev/null +++ b/scripts/source/_00e_playersetupscript.psc @@ -0,0 +1,663 @@ +Scriptname _00E_PlayerSetUpScript extends ObjectReference +{Initializes all the necessary Quests, maintains the player, contains various OnPlayerLoadGame() failsafes} + +Float Property CURRENT_PATCH_VERSION = 2.09 AutoReadOnly + + +;===================================================================================== +; EVENTS +;===================================================================================== + +Event OnInit() + + ; needs the IsInMenuMode() check to prevent stuck messages when FS is not loaded + While Utility.IsInMenuMode() + Utility.WaitMenuMode(0.1) + EndWhile + + CheckIfForgottenStoriesIsLoaded() + + If self == (PlayerREF as ObjectReference) + + If fPatchVersion == 0.00 + fPatchVersion = CURRENT_PATCH_VERSION + EndIf + + GoToState("RealPlayer") + PlayerREF.SetActorValue("speedMult", 95) + PlayerREF.SetActorValue("Healrate", 0) + + SetAmountAutosaves() + + EnableDisableKillmove() + + AddPerks() + + DisableRegularWaiting() + StartQuests(QuestsToStart) + + EndIf + +EndEvent + +Event OnPlayerLoadGame() + If self == (PlayerREF as ObjectReference) ; A check just in case. Most likely this condition is always True + CheckIfForgottenStoriesIsLoaded() + Maintenance() + If GetState() != "RealPlayer" ; Post-1.2.5.0 version update + GoToState("RealPlayer") + EndIf + EndIf +EndEvent + +State RealPlayer + + ;/ Event OnBeginState() + Debug.Trace(self + ": OnBeginState RealPlayer") + EndEvent /; + +EndState + + +;===================================================================================== +; FUNCTIONS +;===================================================================================== + +Function CheckIfForgottenStoriesIsLoaded() + + ; function that quits back to the main menu when the Enderal - Forgotten Stories.esm is not not being added to the plugins.txt + ; and hence not being loaded in-game. Unknown reason, probably write protection issues + + If Game.GetModByName("Enderal - Forgotten Stories.esm") == 255 + bFSWasNotLoadedBefore = true + _00E_Game_ForgottenStoriesNotLoaded.Show() + Game.QuitToMainMenu() + Else + If bFSWasNotLoadedBefore == true + AddPerks() + If FSQuestsToStartFailsafePatch1560 == None + FSQuestsToStartFailsafePatch1560 = Game.GetFormFromFile(0x0102F4B0, "Enderal - Forgotten Stories.esm") as FormList + EndIf + StartQuests(FSQuestsToStartFailsafePatch1560) + bFSWasNotLoadedBefore = false + EndIf + EndIf + +EndFunction + +;===================================================================================== +; 1.5.6.0 +;===================================================================================== + +Function ResetFSNQR05Temple() + + ; resets the cells which is needed due to the fixes on enemies and ambushes in patch 1.5.6.0 + Quest FS_NQR05 = Game.GetFormFromFile(0x000438D2,"Skyrim.esm") as Quest + Cell FS_NQR05_Temple_02_New = Game.GetFormFromFile(0x00045101,"Skyrim.esm") as Cell + If FS_NQR05.GetStage() < 165 + FS_NQR05_Temple_02_New.Reset() + EndIf + +EndFunction + +;===================================================================================== +; 1.5.7.0 +;===================================================================================== + +Function CleanMQ12bGhostFlags() + + ; cleans old ghost flags on certain NPCs after the siege when patch 1.5.7.0 is applied + ; only needed once, since it won't happen anymore for everyone with a save before the siege + _00E_MQ12b_Functions MQ12bFunctions = Game.GetFormFromFile(0x0002EBAD,"Skyrim.esm") as _00E_MQ12b_Functions + MQ12bFunctions.OldRemoveGhostFlag() + +EndFunction + +;===================================================================================== +; 1.5.8.0 +;===================================================================================== + +Function ResetAuroraOnLoad() + ; resets Aurora if she was stuck during the ritual scene due to the gamehour change while she was in the smoking animation + _00E_FS_NQ07_Functions FS_NQ07Functions = Game.GetFormFromFile(0x0101CA09,"Enderal - Forgotten Stories.esm") as _00E_FS_NQ07_Functions + FS_NQ07Functions.ResetAurora() +EndFunction + +Function DisableMQ12bPanicTriggerbox() + ; disables MQ12b_SC3_PanicTriggerboxREF when patch 1.5.8.0 is applied + _00E_MQ12b_Functions MQ12bFunctions = Game.GetFormFromFile(0x0002EBAD,"Skyrim.esm") as _00E_MQ12b_Functions + If MQ12bFunctions.IsCompleted() + MQ12bFunctions.DisablePanicTriggerbox() + EndIf +EndFunction + +Function ReAddDarkKeeperAffinity() + + ; Dark Keeper Affinity Update + Spell _00E_Affinity_AbDarkKeeper = Game.GetFormFromFile(0x00143340,"Skyrim.esm") as Spell + If PlayerREF.HasSpell(_00E_Affinity_AbDarkKeeper) + PlayerREF.RemoveSpell(_00E_Affinity_AbDarkKeeper) + Utility.Wait(1) + PlayerREF.AddSpell(_00E_Affinity_AbDarkKeeper, false) + EndIf + +EndFunction + +Function ReAddFuryDrivenPerk() + + ; Fury Driven ability update + Spell abFuryDriven = Game.GetFormFromFile(0x000855CE, "Skyrim.esm") as Spell + If PlayerREF.HasSpell(abFuryDriven) + PlayerREF.RemoveSpell(abFuryDriven) + Utility.Wait(1) + PlayerREF.AddSpell(abFuryDriven, False) + EndIf + +EndFunction + +Function UpdateLivingTempleTrigger() + + ; Living Temple's ambush trigger update + ObjectReference triggerRef = Game.GetFormFromFile(0x000C6766, "Skyrim.esm") as ObjectReference + (triggerRef as defaultActivateSelf).playerAndAlliesOnly = True + +EndFunction + +Function UpdateMQ11a() + + ; MQ11a update + ObjectReference portcullisRef = Game.GetFormFromFile(0x000E1D1F, "Skyrim.esm") as ObjectReference + Quest MQ11a = Game.GetFormFromFile(0x0002EBA9, "Skyrim.esm") as Quest + If (MQ11a.GetStage() <= 125) && (portcullisRef.Is3DLoaded() == False) + (portcullisRef as _00E_DUNGate01Script).isOpen = False + EndIf + + If MQ11a.IsRunning() && (MQ11a.IsCompleted() == False) + (MQ11a as _00E_MQ11a_Functions).UpdateCaliaAliasScriptState() + EndIf + + ObjectReference NQ34_EnableMarkerREF = Game.GetFormFromFile(0x000480E8, "Skyrim.esm") as ObjectReference + If MQ11a.GetStage() >= 45 + NQ34_EnableMarkerREF.Enable() + EndIf + + Actor NQ34_WildMageREF = Game.GetFormFromFile(0x00141F00, "Skyrim.esm") as Actor + Quest NQ34 = Game.GetFormFromFile(0x00020A12, "Skyrim.esm") as Quest + If NQ34.GetStage() == 15 || NQ34.GetStage() == 20 + NQ34_WildMageREF.Enable() + EndIf + + If NQ34_WildMageREF.IsDead() && NQ34.GetStage() == 15 + NQ34.SetStage(20) + EndIf + +EndFunction + +Function AddPerks() + + ; adds the new Balancing perks for alchemy potions to the player, this is needed because of the changes with the Lycantroph + PlayerREF.AddPerk(_00E_FS_Alchemy_BalancingPerk) + PlayerREF.AddPerk(_00E_FS_Alchemy_BalancingPerk_RestorePotions) + +EndFunction + +Function DisableRegularWaiting() +{Disables regular waiting by adding the no-wait ability} + + PlayerREF.AddSpell(_00E_AbBlockWaiting, False) + +EndFunction + +Function StartQuests(Formlist QuestList) + + ; starts all quests that are in the formlist + Int iIndex = QuestList.GetSize() + While iIndex + iIndex -= 1 + Quest kQuest = QuestList.GetAt(iIndex) as Quest + kQuest.Start() + endwhile + +EndFunction + +;===================================================================================== +; 1.6.0.0 +;===================================================================================== + +Function UpdatePhasmalistContainer() + + ObjectReference Phasmalist_ApparationInventory_Bandit_Tier4 = Game.GetFormFromFile(0x0101E99B, "Enderal - Forgotten Stories.esm") as ObjectReference + ObjectReference Phasmalist_ApparationInventory_Archer_Tier5 = Game.GetFormFromFile(0x0101E9CA, "Enderal - Forgotten Stories.esm") as ObjectReference + Armor _00E_Phasmalist_Trinket_Bandit_Tier4 = Game.GetFormFromFile(0x0101E9A6, "Enderal - Forgotten Stories.esm") as Armor + Armor _00E_Phasmalist_Trinket_Archer_Tier5 = Game.GetFormFromFile(0x0101E9D4, "Enderal - Forgotten Stories.esm") as Armor + + _00E_Phasmalist_ApparationSC _36E_Phasmalist_Apparation_Hybrid_Tier4 = Game.GetFormFromFile(0x01025309, "Enderal - Forgotten Stories.esm") as _00E_Phasmalist_ApparationSC + _36E_Phasmalist_Apparation_Hybrid_Tier4.inventoryContainer = Phasmalist_ApparationInventory_Bandit_Tier4 + + If (PlayerREF.GetItemCount(_00E_Phasmalist_Trinket_Bandit_Tier4) > 0 && PlayerREF.GetItemCount(_00E_Phasmalist_Trinket_Archer_Tier5) == 0) + Phasmalist_ApparationInventory_Archer_Tier5.RemoveAllItems(Phasmalist_ApparationInventory_Bandit_Tier4, false, true) + EndIf + +EndFunction + +Function UpdatePassengerBookAtShipwreck() + + _00E_FS_NQ02_Functions FS_NQ02_Functions = (Game.GetFormFromFile(0x000438AC, "Skyrim.esm") as Quest) as _00E_FS_NQ02_Functions + FS_NQ02_Functions.UpdatePassengerBook() + +EndFunction + +Function ResetMQ02Riddle() + + GlobalVariable _00E_MQ02Riddle = Game.GetFormFromFile(0x00074B07, "Skyrim.esm") as GlobalVariable + + If _00E_MQ02Riddle.GetValueInt() > 0 + _00E_MQ02_Functions MQ02Functions = Game.GetFormFromFile(0x0002EBA1, "Skyrim.esm") as _00E_MQ02_Functions + MQ02Functions.ResetRiddle() + EndIf + +EndFunction + + +;===================================================================================== +; 1.6.1.0 +;===================================================================================== + + +Function UpdateMQ02() + _00E_MQ02_Functions MQ02Functions = Game.GetFormFromFile(0x0002EBA1, "Skyrim.esm") as _00E_MQ02_Functions + Int mq02stage = MQ02Functions.GetStage() + If mq02stage >= 138 && mq02stage < 170 + MQ02Functions.MQ02_TripToArkEnableMarker.EnableNoWait() + EndIf +EndFunction + + +;===================================================================================== +; 1.6.2.0 +;===================================================================================== + + +Function UpdateItemHandler() + + Cell ClassMenue = Game.GetFormFromFile(0x000A7FBC, "Skyrim.esm") as Cell + + If PlayerREF.GetParentCell() == ClassMenue + Quest ClassMenuItemHandler = Game.GetFormFromFile(0x00048442, "Skyrim.esm") as Quest + ReferenceAlias Player = ClassMenuItemHandler.GetAliasByName("Player") as ReferenceAlias + Player.ForceRefTo(PlayerREF) + EndIf + +EndFunction + + +;===================================================================================== +; 2.0.6 +;===================================================================================== + +Function UpdateMQ12b_206() + _00E_MQ12b_Functions MQ12bFunctions = Game.GetFormFromFile(0x0002EBAD, "Skyrim.esm") as _00E_MQ12b_Functions + Quest MQ15 = Game.GetFormFromFile(0x0002EBB0, "Skyrim.esm") as Quest + If MQ12bFunctions.GetStage() >= 135 && MQ15.GetStage() < 5 + MQ12bFunctions.OldReenableDisabledNPC() + EndIf +EndFunction + + +;===================================================================================== +; 2.0.8 +;===================================================================================== + +Function Update_208() + ; Obsolete abilities cleanup + _00E_FS_NQ07_Functions FS_NQ07_Quest = Game.GetFormFromFile(0x0001CA09, "Enderal - Forgotten Stories.esm") as _00E_FS_NQ07_Functions + Int iFS_NQ07Stage = FS_NQ07_Quest.GetStage() + If iFS_NQ07Stage >= 5 && iFS_NQ07Stage < 410 + FS_NQ07_Quest.UpdateAarosCarryTraySpell() + Else + RemoveObsoleteSpell(0x0009A893, "Skyrim.esm", 0x000F649A, "Skyrim.esm") + EndIf + + RemoveObsoleteSpell(0x0010D339, "Skyrim.esm", 0x000F649A, "Skyrim.esm") + RemoveObsoleteSpell(0x0006FFAF, "Skyrim.esm", 0x000F6498, "Skyrim.esm") + RemoveObsoleteSpell(0x000F64A0, "Skyrim.esm", 0x000F6498, "Skyrim.esm") + + ; Refill _00E_AnimTest_SC package arrays where needed + FillAnimTestPackages(0x00137889, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x0013788A, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x0013789F, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x001378A2, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x001378AA, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x001378AB, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x00147E12, "Skyrim.esm", 0x00070657, "Skyrim.esm") + FillAnimTestPackages(0x00147E14, "Skyrim.esm", 0x00070657, "Skyrim.esm") + + FillAnimTestPackages(0x0010D336, "Skyrim.esm", 0x00070645, "Skyrim.esm") + FillAnimTestPackages(0x0010D33B, "Skyrim.esm", 0x00070645, "Skyrim.esm") + FillAnimTestPackages(0x00147DEA, "Skyrim.esm", 0x00070645, "Skyrim.esm") + FillAnimTestPackages(0x00147E37, "Skyrim.esm", 0x00070645, "Skyrim.esm") + + ; "Gypsy minstrels" update + Keyword performSpotKwd = Game.GetFormFromFile(0x000FB905, "Skyrim.esm") as Keyword + (Game.GetFormFromFile(0x00044EBC, "Skyrim.esm") as _00E_BardPlayInstrumentScript).LinkedPlayMarkerKeyword = performSpotKwd + + (Game.GetFormFromFile(0x00046D79, "Skyrim.esm") as _00E_GypsyMinstrelsControlScript).UpdateWaypoint() +EndFunction + +Function RemoveObsoleteSpell(Int idNPC, String esmNPC, Int idSpell, String esmSpell) + Spell obsoleteSpell = Game.GetFormFromFile(idSpell, esmSpell) as Spell + (Game.GetFormFromFile(idNPC, esmNPC) as Actor).RemoveSpell(obsoleteSpell) +EndFunction + +Function FillAnimTestPackages(Int idNPC, String esmNPC, Int idPackage, String esmPackage) + Package newPackage = Game.GetFormFromFile(idPackage, esmPackage) as Package + (Game.GetFormFromFile(idNPC, esmNPC) as _00E_AnimTest_SC).UpdateFillPackages(newPackage) +EndFunction + + +;===================================================================================== +; 2.0.9 +;===================================================================================== + +Function Update_209() + Spell abSoulcaller = Game.GetFormFromFile(0x002F0EA, "Enderal - Forgotten Stories.esm") as Spell + If PlayerREF.HasSpell(abSoulcaller) + PlayerREF.RemoveSpell(abSoulcaller) + Utility.Wait(1) + PlayerREF.AddSpell(abSoulcaller, False) + EndIf + + Perk perkBloodlust = Game.GetFormFromFile(0x00069D38, "Skyrim.esm") as Perk + _ResetPerk(perkBloodlust) + + _00E_PlayerhousingMaster.GetMaster().Update_209() +EndFunction + + +;===================================================================================== +; ALL UPDATES +;===================================================================================== + +Function EnableDisableKillmove() + + ; it seems like that this ini setting does not do stuff by itself (or it is bugged) + ; therefore we need to read it from the file and change the global with which the killmoves are conditioned + If (Utility.GetINIBool("bVATSDisable:VATS") == 1) + KillMove.SetValueInt(0) + ElseIf (Utility.GetINIBool("bVATSDisable:VATS") == 0) + KillMove.SetValueInt(1) + EndIf + +EndFunction + +Function SetAmountAutosaves() + + ; increases amount of autosaves created from 3 to 5 without editing the ini files + ; new default ini files already have set the int to 5 + If Utility.GetINIInt("iAutoSaveCount:SaveGame") == 3 + Utility.SetINIInt("iAutoSaveCount:SaveGame", 5) + EndIf + +EndFunction + +Function SetAutoSaveInterval() + + ; updates the autosave interval + _00E_AutoSaveSystem_Functions AutoSaveSystem_Functions = Game.GetFormFromFile(0x00048141, "Skyrim.esm") as _00E_AutoSaveSystem_Functions + AutoSaveSystem_Functions.UpdateAutoSaveInterval() + +EndFunction + +Function FailsafeMQ05PrologueAliases() + + ; failsafe for issue 1536, fills empty aliases + If MQ05PrologueFunctions == None + MQ05PrologueFunctions = Game.GetFormFromFile(0x00033A5B, "Skyrim.esm") as _00E_MQ05Prologue_Functions + EndIf + MQ05PrologueFunctions.FillEmptyAliasesFailsafe() + +EndFunction + +Function RefreshMountNamesOnLoad() + + _00E_NQ06_Functions NQ06Functions = Game.GetFormFromFile(0x000725BA,"Skyrim.esm") as _00E_NQ06_Functions + NQ06Functions.RefreshNamesOnSaveLoad() + +EndFunction + +Function _ResetPerk(Perk p) + If PlayerREF.HasPerk(p) + PlayerREF.RemovePerk(p) + PlayerREF.AddPerk(p) + EndIf +EndFunction + +Function ResetArmorWeightPerks() + + ; Perks modifying armor weights need some push on each game load to work. + ; The push is needed only if the player is over-encumbered on game load. + ; If the player is not over-encumbered, the push is not needed because checking the inventory, picking up items, sheathing/drawing a weapon will reset the perks anyway. + If PlayerREF.IsOverEncumbered() + _ResetPerk(_00E_Class_Keeper_P05_C_Conditioning) + _ResetPerk(_00E_Class_Vagrant_P05_B_Lightweight) + EndIf + +EndFunction + +Function FixMoreAffinitiesMod() +{Fixes "More Affinites" mod missing properties in the Levelsystem scripts} + + _00E_QuestFunctions QuestFunctionsScript = (Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest) as _00E_QuestFunctions + If QuestFunctionsScript._00E_RemoveAllItems_TrashContainer == NONE + + Debug.Messagebox("Found broken scripts caused by mod >>More Affinities<<. Press OK to fix scripts.") + _00E_ConfigMenu ConfigMenuScript = (Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest) as _00E_ConfigMenu + ConfigMenuScript.controlQuest = (Game.GetFormFromFile(0x0101EC71, "Enderal - Forgotten Stories.esm") as Quest) as _FS_Phasmalist_ControlQuest + ConfigMenuScript._00E_ConfigMenu_DisableCraftingTutorials = Game.GetFormFromFile(0x00046D8E, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_DisableMenuTutorials = Game.GetFormFromFile(0x00046D8A, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_DisableOtherTutorials = Game.GetFormFromFile(0x00046D8F, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_DisableQuestTutorials = Game.GetFormFromFile(0x00046D8C, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_DisableReadAloudBooks = Game.GetFormFromFile(0x0102E982, "Enderal - Forgotten Stories.esm") as Message + ConfigMenuScript._00E_ConfigMenu_DisableSkillTutorials = Game.GetFormFromFile(0x00046D8D, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_GameplayOptions = Game.GetFormFromFile(0x0102F1BC, "Enderal - Forgotten Stories.esm") as Message + ConfigMenuScript._00E_ConfigMenu_Meditate = Game.GetFormFromFile(0x00046D98, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_OtherOptions = Game.GetFormFromFile(0x00046D89, "Skyrim.esm") as Message + ConfigMenuScript._00E_ConfigMenu_VideoSkip = Game.GetFormFromFile(0x0102E983, "Enderal - Forgotten Stories.esm") as Message + ConfigMenuScript._00E_DisableCraftingTutorials = Game.GetFormFromFile(0x00046D90, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_DisableMenuTutorials = Game.GetFormFromFile(0x00046D8B, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_DisableOtherTutorials = Game.GetFormFromFile(0x00046D93, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_DisableQuestTutorials = Game.GetFormFromFile(0x00046D92, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_DisableReadAloudBooks = Game.GetFormFromFile(0x0102E984, "Enderal - Forgotten Stories.esm") as GlobalVariable + ConfigMenuScript._00E_DisableSkillTutorials = Game.GetFormFromFile(0x00046D91, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_FS_ConfigMenu_Mount_Teleport = Game.GetFormFromFile(0x0102F1B9, "Enderal - Forgotten Stories.esm") as Message + ConfigMenuScript._00E_FS_ConfigMenu_Phasmalist_Teleport = Game.GetFormFromFile(0x0101F2B6, "Enderal - Forgotten Stories.esm") as Message + ConfigMenuScript._00E_FS_IsForgottenStoriesActivated = Game.GetFormFromFile(0x0004320E, "Skyrim.esm") as GlobalVariable + ConfigMenuScript._00E_HorseFlute_New = ((Game.GetFormFromFile(0x000725BA, "Skyrim.esm") as Quest).GetAliasByName("HorseFlute")) as _00E_Horseflute_SC + ConfigMenuScript._00E_VideoSkip = Game.GetFormFromFile(0x0102E985, "Enderal - Forgotten Stories.esm") as GlobalVariable + + + QuestFunctionsScript.BastionPerks = Game.GetFormFromFile(0x0006686B, "Skyrim.esm") as Formlist + QuestFunctionsScript.DerwishPerks = Game.GetFormFromFile(0x0006686D, "Skyrim.esm") as Formlist + QuestFunctionsScript.ElementalismPerks = Game.GetFormFromFile(0x00066875, "Skyrim.esm") as Formlist + QuestFunctionsScript.EspionagePerks = Game.GetFormFromFile(0x00066889, "Skyrim.esm") as Formlist + QuestFunctionsScript.GameHour = Game.GetFormFromFile(0x00000038, "Skyrim.esm") as GlobalVariable + QuestFunctionsScript.Gold001 = Game.GetFormFromFile(0x0000000f, "Skyrim.esm") as MiscObject + QuestFunctionsScript.LifeAndDeathPerks = Game.GetFormFromFile(0x00066873, "Skyrim.esm") as Formlist + QuestFunctionsScript.MAGIllusionCharm = Game.GetFormFromFile(0x00075805, "Skyrim.esm") as Sound + QuestFunctionsScript.ManipulationPerks = Game.GetFormFromFile(0x0006686A, "Skyrim.esm") as Formlist + QuestFunctionsScript.PlayerSkillMenu = ((Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest).GetAliasByName("Player") as Alias) as _00E_Game_SkillmenuSC + QuestFunctionsScript.RagePerks = Game.GetFormFromFile(0x00066887, "Skyrim.esm") as Formlist + QuestFunctionsScript.SympathyEsme = Game.GetFormFromFile(0x0102A498, "Enderal - Forgotten Stories.esm") as GlobalVariable + QuestFunctionsScript.TrickeryPerks = Game.GetFormFromFile(0x0006687F, "Skyrim.esm") as Formlist + QuestFunctionsScript.VagabondPerks = Game.GetFormFromFile(0x00066877, "Skyrim.esm") as Formlist + QuestFunctionsScript._00E_AchievementsEnabled = Game.GetFormFromFile(0x00046F83, "Skyrim.esm") as GlobalVariable + QuestFunctionsScript._00E_AllAmmos = Game.GetFormFromFile(0x000456C0, "Skyrim.esm") as Formlist + QuestFunctionsScript._00E_ArmorSetScript_sSetBonusRemoved = Game.GetFormFromFile(0x00036F96, "Skyrim.esm") as Message + QuestFunctionsScript._00E_DisableQuestTutorials = Game.GetFormFromFile(0x00046D92, "Skyrim.esm") as GlobalVariable + QuestFunctionsScript._00E_DisableSkillTutorials = Game.GetFormFromFile(0x00046D91, "Skyrim.esm") as GlobalVariable + QuestFunctionsScript._00E_FS_A3_AlreadyKnowThisLevel = Game.GetFormFromFile(0x0102F533, "Enderal - Forgotten Stories.esm") as Message + QuestFunctionsScript._00E_FS_A3_NeedToLearnOtherLevels = Game.GetFormFromFile(0x0101EC7D, "Enderal - Forgotten Stories.esm") as Message + QuestFunctionsScript._00E_FS_A3_sIn = Game.GetFormFromFile(0x00043BE0, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_A3_sMageClassName = Game.GetFormFromFile(0x00043BE4, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_A3_sRogueClassName = Game.GetFormFromFile(0x00043BE3, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_A3_sToUnlockThisClass = Game.GetFormFromFile(0x00043BE1, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_A3_sWarriorClassName = Game.GetFormFromFile(0x00043BE2, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_A3_sYouNeedSkillpoints = Game.GetFormFromFile(0x00043BDF, "Skyrim.esm") as Message + QuestFunctionsScript._00E_FS_NQ02_Esme = Game.GetFormFromFile(0x0101F0D0, "Enderal - Forgotten Stories.esm") as ActorBase + QuestFunctionsScript._00E_FS_NQR05_SlowMotionSP = Game.GetFormFromFile(0x0102E2BD, "Enderal - Forgotten Stories.esm") as Spell + QuestFunctionsScript._00E_FS_NQR05_SlowMotion_IntroM = Game.GetFormFromFile(0x0102E2BF, "Enderal - Forgotten Stories.esm") as Sound + QuestFunctionsScript._00E_FS_NQR05_SlowMotion_OutroM = Game.GetFormFromFile(0x0102E2C1, "Enderal - Forgotten Stories.esm") as Sound + QuestFunctionsScript._00E_Levelsystem_sAbilityStanceQyrai = Game.GetFormFromFile(0x00046D9B, "Skyrim.esm") as Message + QuestFunctionsScript._00E_Levelsystem_sAbilityStanceSkaragg = Game.GetFormFromFile(0x00046D9C, "Skyrim.esm") as Message + QuestFunctionsScript._00E_PleaseRemoveMoney = Game.GetFormFromFile(0x000480DA, "Skyrim.esm") as Message + QuestFunctionsScript._00E_RemoveAllItems_TrashContainer = Game.GetFormFromFile(0x000469E7, "Skyrim.esm") as ObjectReference + QuestFunctionsScript._00E_SkillbookWarning = Game.GetFormFromFile(0x00031ACF, "Skyrim.esm") as Message + + + _00E_Game_SkillmenuSC SkillMenuScript = ((Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest).GetAliasByName("Player") as Alias) as _00E_Game_SkillmenuSC + SkillMenuScript._00E_FS_Game_Affinity_Spectralist = Game.GetFormFromFile(0x01029A35, "Skyrim.esm") as Message + + + _00E_PlayerHousing_CellNameSC CellNameScript = ((Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest).GetAliasByName("Player") as Alias) as _00E_PlayerHousing_CellNameSC + CellNameScript.FS_NQR03 = Game.GetFormFromFile(0x0014CEA2, "Skyrim.esm") as Quest + CellNameScript.FS_NQR03_RhalataTemple = Game.GetFormFromFile(0x0010D1C2, "Skyrim.esm") as Cell + CellNameScript._00E_sPlayerHouseMarketQuarterName = Game.GetFormFromFile(0x00047CA5, "Skyrim.esm") as Message + CellNameScript._00E_sPlayerHouseNobleQuarterName = Game.GetFormFromFile(0x00047CA6, "Skyrim.esm") as Message + CellNameScript._00E_sRhalataTempleName = Game.GetFormFromFile(0x00047C29, "Skyrim.esm") as Message + + + _00E_WeatherControlScriptSC WeatherControlScript = ((Game.GetFormFromFile(0x00010AA2, "Skyrim.esm") as Quest).GetAliasByName("Player") as Alias) as _00E_WeatherControlScriptSC + WeatherControlScript.CapitalCityCastleWorld = Game.GetFormFromFile(0x00070729, "Skyrim.esm") as WorldSpace + WeatherControlScript.CapitalCityLocation = Game.GetFormFromFile(0x000A1A12, "Skyrim.esm") as Location + WeatherControlScript.MQ09 = Game.GetFormFromFile(0x0007FA91, "Skyrim.esm") as Quest + WeatherControlScript.MQ12b = Game.GetFormFromFile(0x0002EBAD, "Skyrim.esm") as Quest + WeatherControlScript.MQ17 = Game.GetFormFromFile(0x0007FA93, "Skyrim.esm") as Quest + WeatherControlScript.SkyrimOvercastRain = Game.GetFormFromFile(0x000C821F, "Skyrim.esm") as Weather + WeatherControlScript.Vyn = Game.GetFormFromFile(0x00001D3C, "Skyrim.esm") as WorldSpace + WeatherControlScript._00E_EnderalOvercast = Game.GetFormFromFile(0x00072785, "Skyrim.esm") as Weather + WeatherControlScript._00E_MQ11c_SilberhainDeadWeather = Game.GetFormFromFile(0x00096807, "Skyrim.esm") as GlobalVariable + WeatherControlScript._00E_SuntempleLocations = Game.GetFormFromFile(0x0003BB5B, "Skyrim.esm") as FormList + + Utility.Wait(1) + Debug.Messagebox("Scripts fixed. Make sure to save the game. Restart the client and reload the save that you just created.\n If you have set items equipped, unequip them all and re-equip them for potential set bonuses to apply.") + EndIf + +EndFunction + +;===================================================================================== +; MAINTENANCE +;===================================================================================== + +Function Maintenance() + + If fPatchVersion <= 1.25 && !bdoOnce + int iButton01 = _00E_Game_OldSaves_01.Show() + If iButton01 == 0 + Game.QuitToMainMenu() + ElseIf iButton01 == 1 + int iButton02 = _00E_Game_OldSaves_02.Show() + If iButton02 == 0 + Game.QuitToMainMenu() + ElseIf iButton02 == 1 + bdoOnce = true + EndIf + EndIf + ElseIf fPatchVersion >= 1.5 && fPatchVersion < CURRENT_PATCH_VERSION + + ; only do this once when update 1.5.6.0 is applied + If fPatchVersion < 1.56 + ResetFSNQR05Temple() + EndIf + ; only do this once when update 1.5.7.0 is applied + If fPatchVersion < 1.57 + CleanMQ12bGhostFlags() + EndIf + ; only do this once when update 1.5.8.0 is applied + If fPatchVersion < 1.58 + ResetAuroraOnLoad() + DisableMQ12bPanicTriggerbox() + ReAddDarkKeeperAffinity() + ReAddFuryDrivenPerk() + UpdateLivingTempleTrigger() + UpdateMQ11a() + EndIf + ; only do this once when update 1.6.0.0 is applied + If fPatchVersion < 1.60 + UpdatePhasmalistContainer() + UpdatePassengerBookAtShipwreck() + ResetMQ02Riddle() + EndIf + ; only do this once when update 1.6.1.0 is applied + If fPatchVersion < 1.61 + UpdateMQ02() + EndIf + ; only do this once when update 1.6.2.0 is applied + If fPatchVersion < 1.62 + UpdateItemHandler() + EndIf + ; only do this once when update 2.0.6 (SE) is applied + If fPatchVersion < 2.06 + UpdateMQ12b_206() + EndIf + ; only do this once when update 2.0.8 (SE) is applied + If fPatchVersion < 2.08 + Update_208() + EndIf + ; only do this once when update 2.0.9 (SE) is applied + If fPatchVersion < 2.09 + Update_209() + EndIf + fPatchVersion = CURRENT_PATCH_VERSION + EndIf + + ; changes to the actor value healrate will not persist in consecutive saves + ; every time a save gets loaded the healrate needs to be set to 0, otherwise it will go back again to default at 0.7 + ; this is called before active magic effects of potions or spells are applied to the player which could also alter the value + PlayerREF.SetActorValue("Healrate", 0) + + EnableDisableKillmove() + + ResetArmorWeightPerks() + + SetAmountAutosaves() + + SetAutoSaveInterval() + + FailsafeMQ05PrologueAliases() + + RefreshMountNamesOnLoad() + + ; fixes properties that were accidentally set to NONE by the "More Affinities" mod + If Game.GetModByName("Enderal_FS_More_Affinities.esp") != 255 + FixMoreAffinitiesMod() + EndIf + +EndFunction + +;===================================================================================== +; PROPERTIES +;===================================================================================== + +float fPatchVersion +bool bdoOnce = false +bool bFSWasNotLoadedBefore = false + +_00E_MQ05Prologue_Functions Property MQ05PrologueFunctions Auto + +Perk Property _00E_FS_Alchemy_BalancingPerk Auto +Perk Property _00E_FS_Alchemy_BalancingPerk_RestorePotions Auto + +Spell Property _00E_AbBlockWaiting Auto +Actor Property PlayerREF Auto + +FormList Property QuestsToStart Auto +FormList Property FSQuestsToStartFailsafePatch1560 Auto + +Message Property _00E_Game_OldSaves_01 Auto +Message Property _00E_Game_OldSaves_02 Auto +Message Property _00E_Game_ForgottenStoriesNotLoaded Auto + +GlobalVariable Property KillMove Auto + +Perk Property _00E_Class_Keeper_P05_C_Conditioning Auto +Perk Property _00E_Class_Vagrant_P05_B_Lightweight Auto