diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-001.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-001.sub new file mode 100644 index 0000000..6a5b537 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-001.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c577c1b2ef5d14328622d72f6d6a4b31a3d6cdfb070b52bc2b9cd0498156f5aa +size 35903 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-002.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-002.sub new file mode 100644 index 0000000..9ed7156 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-002.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b51f7c09e2e42aa4fdf2405e84248fd4b8b6c98f3de56d8b239ff307da714998 +size 24542 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-003.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-003.sub new file mode 100644 index 0000000..8639f0a --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-003.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6990d76ba0c9dd2c72dff4dd813ac3d83f54be090ea8180a580f1c7e8bb9e348 +size 46780 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-004.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-004.sub new file mode 100644 index 0000000..cd60894 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-004.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93de6e4ab219c26bfae34568cb14a85932753c40e72e328debbe298499a552d7 +size 26073 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-005.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-005.sub new file mode 100644 index 0000000..e581185 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-005.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c6bfbaf2dd88a1cca78087a3019ba35ef4e70714027507300945303b86218f0 +size 47225 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-006.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-006.sub new file mode 100644 index 0000000..a05ccdc --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-006.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed48a7fe59c45816c60b24bd92b0e4fdc9cd4a5790e05199c0c866e0f533ba3c +size 22325 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-007.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-007.sub new file mode 100644 index 0000000..921cf92 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-007.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cf92e975b9f5d4088b8c6ae208ea66d1ca3d9604ba8b0b237cdfeb17928d4b7 +size 26200 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-008.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-008.sub new file mode 100644 index 0000000..b0c37db --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-008.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9b3ec68f2625bf732f581f83fe8093249a05da5dcf97af4ddcda44998e335f1 +size 37950 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-009.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-009.sub new file mode 100644 index 0000000..f798110 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-009.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf616b80d7b90d77c9f8158405a23c50ff1cb1e283a016f653aa4e8773862aae +size 49736 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-010.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-010.sub new file mode 100644 index 0000000..03323be --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-010.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16def624006639abf1a4bddd7a7aed4be1878005c516e99b35b86d81c035647c +size 46662 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-011.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-011.sub new file mode 100644 index 0000000..7c3bdfa --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-011.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f0061a0ee04005e0671d174503aadef03941b5c6ad437e0c05277e73a42df5d +size 38071 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-012.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-012.sub new file mode 100644 index 0000000..28b96ac --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-012.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b4f51c95c018a46ae3c987339015a715398003f13f58268591787805b692a75 +size 19686 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-013.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-013.sub new file mode 100644 index 0000000..ac3991c --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-013.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ab3e29dac7879ba650e11bd7f2575bb0205eadbdb56fb7badbe6c8f954bc38 +size 57089 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-014.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-014.sub new file mode 100644 index 0000000..0703a25 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-014.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a569a78649003611edf3d2d06b485773458eb5dac7b3a034cb56a6c510119b36 +size 62910 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-015.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-015.sub new file mode 100644 index 0000000..4d87d70 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-015.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:283b5487d3e3655f2f7ccf1497bec202c6e13600ab05da3e57f4c62ac1a10e08 +size 37391 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-016.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-016.sub new file mode 100644 index 0000000..cbfd1ba --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-016.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17209d919425f61fdd9c21edf03c61741c168d3846bafaef1dc205e76e169470 +size 47376 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-017.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-017.sub new file mode 100644 index 0000000..43cd7bd --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-017.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bba2bc753df186b45c62dee5029637422974b752bed35cf69cfab4c31a4f4e81 +size 75036 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-018.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-018.sub new file mode 100644 index 0000000..9b392ac --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-018.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10365d0987f7b5411e08eec51819cd2b4df4fcd394d2d737832146f5b9f6e2f9 +size 98203 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-019.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-019.sub new file mode 100644 index 0000000..7119406 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-019.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06a957a6aedc81782c9b76d85089a2754cd368e9a3407f5085e7a79f575dc583 +size 160268 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-020.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-020.sub new file mode 100644 index 0000000..65cdb60 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-020.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fe4e5dc696591188d15b2be38c145263f8d967b28e5ffe60bb0da2eb7bdc80a +size 98799 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-021.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-021.sub new file mode 100644 index 0000000..1cb8771 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-021.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1953e17c07945ae793b19297750b13b7991de3cd3fe9811f159b62f0e389bed9 +size 32361 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-022.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-022.sub new file mode 100644 index 0000000..75f7ccb --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-022.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35d2c9d2e7f99f346b91a9f677aa1654125ec9a19887b6606f2547f579245b0f +size 83238 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-023.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-023.sub new file mode 100644 index 0000000..df8e0c2 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-023.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08c7a28225a40170facf6f033c3f281e6d9497dfdc920f9e8ea3b53878cf968b +size 176144 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-024.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-024.sub new file mode 100644 index 0000000..25bd16e --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-024.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac103d0f4326bfaa8e14381292c3e0081f5205445b6834e1a687dadca666e15f +size 39053 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-025.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-025.sub new file mode 100644 index 0000000..a2e7b51 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-025.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74623b078421b869c3ebcbc89239db983a47194f8d9a8318705b04af8729ae02 +size 23550 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-026_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-026_bandit.sub new file mode 100644 index 0000000..c8554e7 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-026_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0701f927829d7badff82db8f361272ca0d6ff504c213dcd4efab6f0f5ed29001 +size 57444 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-027.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-027.sub new file mode 100644 index 0000000..6eb7d09 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-027.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c2b49d2f763b19162e44785cdbad5a487fa92417873e7845ae09546e3d0253b +size 38983 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-028.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-028.sub new file mode 100644 index 0000000..2cc7183 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-028.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c93193008e9b8ecc8b0021b34f00143173138f24e55e19cd623e9582fa116a97 +size 37134 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-029.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-029.sub new file mode 100644 index 0000000..701d78f --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-029.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01f63b3eb30abbed72f49d19061c6ac966cc5eab6dd17dddccb728b6e96bedc8 +size 25633 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-030.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-030.sub new file mode 100644 index 0000000..91fc050 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-030.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df79bc67e53570c58eb255517d01db328cf7d436809d33002864bec8262c5b5a +size 26082 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-031.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-031.sub new file mode 100644 index 0000000..f6b54dd --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-031.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed705b7250c13e33a09af16aa63f91d0db725f1ebe3c1506b1de0ee5269702ba +size 29011 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-032.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-032.sub new file mode 100644 index 0000000..7efeca9 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-032.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a2e801b091029b81d8f4710994cad57283c96a0d6a26bf7adcb77b0a27f4f28 +size 24394 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-033.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-033.sub new file mode 100644 index 0000000..6b10706 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-033.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa1740f85e96b0467d0179e6c1500467c24640ec9928fbe3bb0b0d5abb768029 +size 26700 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-034.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-034.sub new file mode 100644 index 0000000..5693502 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-034.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96b61416d6271d792a48c3d76fb86bd0500845bae9d206abd0360122fedbaf6d +size 34258 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-035.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-035.sub new file mode 100644 index 0000000..93b1256 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-035.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf46528d367fa46e2c87b9f3124ddf84906e8cfe9a362d99b04a3a95adec848b +size 29776 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-036.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-036.sub new file mode 100644 index 0000000..a55bbe8 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-036.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6927832b98e64c3d42da42a1ccf3d7a4f08b323752a907b7a9f449a5e387e45 +size 44881 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-037_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-037_bandit.sub new file mode 100644 index 0000000..6d5bc58 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-037_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37584f491ec215bc55e8fd27ce23699f1ba13eb0dc8fc22f8bc74b6aee00308d +size 62084 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-038_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-038_bandit.sub new file mode 100644 index 0000000..f5ac76f --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-038_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec3eff2d16c1ddba56fb930c00f708c3ab8729c47cbd67d0cec95fc5464abee3 +size 43301 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-039_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-039_bandit.sub new file mode 100644 index 0000000..eaa06e2 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-039_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51b7635f9b766287d2648a7afdd968619b4ff10f77f5be9de2e0e58e1e3d5090 +size 33817 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-040.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-040.sub new file mode 100644 index 0000000..edd3db4 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-040.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a594ce03f0602868cca0310ad79c828c174226da6c715da09e2865d24e12bae1 +size 54839 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-041.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-041.sub new file mode 100644 index 0000000..080601b --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-041.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4b6715defba8fc91884114f1b287d9868226c0e5348016f7523620803cf1583 +size 43569 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-042.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-042.sub new file mode 100644 index 0000000..5a35429 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-042.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5e791dd5ed4933ffeee33f0163db85e5b591f2756d7511196b4a019979afe49 +size 19099 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-043.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-043.sub new file mode 100644 index 0000000..6bebe28 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-043.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7684accbc886c2234131b324e31ee35182cab1af01047566ae928e207e1701a +size 34675 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-044.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-044.sub new file mode 100644 index 0000000..4b5acdb --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-044.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4060404961372945c4c0ec4f9149abeacf036e7a6cf8cca096a1d42b47cd038 +size 46755 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-045_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-045_bandit.sub new file mode 100644 index 0000000..a932485 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-045_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65663a1fb4b4877ba16ccf8f890a429c8512a7a9583040dea7680f1e0d931d45 +size 28017 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-046_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-046_bandit.sub new file mode 100644 index 0000000..0c711de --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-046_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:533c5fadaacb12005ee221688b3698866633a7b1a0ee497aa27758442b9ae26f +size 62977 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-047.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-047.sub new file mode 100644 index 0000000..6058ed2 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-047.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a1d238acfb7d3b05f4adc5c4ff37704c09f968369f3b5bbb2d6289e07020551 +size 50643 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-048.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-048.sub new file mode 100644 index 0000000..d083413 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-048.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:775856d83d69145ba03d1f9a98c97db1a56ba2872a813f3c3f9a1b65a48b8d53 +size 25712 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-049.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-049.sub new file mode 100644 index 0000000..4104c3a --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-049.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:886e94d94b1f601ae988d387dfdb876474a2fe4b8c7fdad9e736d90be771567e +size 32310 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-050_bandit.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-050_bandit.sub new file mode 100644 index 0000000..5021822 --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-050_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a283b135d406816081878655589a19c208eb4539ec26c1aac59f2a0833ee37 +size 40850 diff --git a/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-051.sub b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-051.sub new file mode 100644 index 0000000..694d4fe --- /dev/null +++ b/ADV Beacon Stations/BeaconStations/BeaconStation_ADVBS-051.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf64d03ad4efbd06b3e5e5ac803288c4d4d63faae9cae7bed3cc28c6db51700c +size 45964 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_A1Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_A1Shuttle.sub new file mode 100644 index 0000000..0556f47 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_A1Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:731c2d3ac7d0513e889a9bedf5a5c6d1b8821752a073937d56617a053ef28795 +size 295509 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E1Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E1Shuttle.sub new file mode 100644 index 0000000..b4883e9 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E1Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3a7f366025404f600ad74d48f79f94418d5a1c4167d0deb78390ea307e33e96 +size 299611 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E2Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E2Shuttle.sub new file mode 100644 index 0000000..1dbc7a8 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E2Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8d01fda05004683a64788531e891252b312886d5154424348b2dc7b8a470f6b +size 320694 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E3Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E3Shuttle.sub new file mode 100644 index 0000000..15a2625 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E3Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7a8ae9092149cfc610187689e1ee5f436f2e6d2af378dcbb41497282f78d956 +size 298723 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E4Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E4Shuttle.sub new file mode 100644 index 0000000..96630cb --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E4Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb6a5ab047a554a7c84712401bcd751f0aa81f15f2050b2cbe96ac757066f3a3 +size 320561 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E5Shuttle.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E5Shuttle.sub new file mode 100644 index 0000000..8bcba89 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_E5Shuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb03703c3bd736bc9fb50f149d63b63313e104a45ae580d8e9a57c4bb2c54baa +size 299039 diff --git a/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_S-1_Drone.sub b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_S-1_Drone.sub new file mode 100644 index 0000000..3d4b3b4 --- /dev/null +++ b/ADV Beacon Stations/Shuttles/BeaconStation_ADVBS_S-1_Drone.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4127db985c5cc9a6e0a2e6d57259fb71aa1fb74a96f406c580a77fb3f213349 +size 105789 diff --git a/ADV Beacon Stations/filelist.xml b/ADV Beacon Stations/filelist.xml new file mode 100644 index 0000000..5f6f436 --- /dev/null +++ b/ADV Beacon Stations/filelist.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Altmark MKIV/Altmark MKIV.sub b/Altmark MKIV/Altmark MKIV.sub new file mode 100644 index 0000000..41e446c --- /dev/null +++ b/Altmark MKIV/Altmark MKIV.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65ca83ea3eb35d0d07faed1950481bbe2acd0c7e2bb7eaf145f5cd6e21d7ffb0 +size 367128 diff --git a/Altmark MKIV/filelist.xml b/Altmark MKIV/filelist.xml new file mode 100644 index 0000000..78aa679 --- /dev/null +++ b/Altmark MKIV/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Apo-4A Saber/Apo-4A Saber.sub b/Apo-4A Saber/Apo-4A Saber.sub new file mode 100644 index 0000000..12f9d03 --- /dev/null +++ b/Apo-4A Saber/Apo-4A Saber.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbe6708b1cc5e72bcd60a96cf297f6dacfa91368d5579c8159ca81ad8460ae05 +size 339426 diff --git a/Apo-4A Saber/Apo-4Drone.sub b/Apo-4A Saber/Apo-4Drone.sub new file mode 100644 index 0000000..be98f64 --- /dev/null +++ b/Apo-4A Saber/Apo-4Drone.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1306374d5586faa39be2b78b24bac84eb2cd8eef49212c03f96c94e22ac1a964 +size 183302 diff --git a/Apo-4A Saber/Apo-4Gate.sub b/Apo-4A Saber/Apo-4Gate.sub new file mode 100644 index 0000000..9d77576 --- /dev/null +++ b/Apo-4A Saber/Apo-4Gate.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de50e84ee3ee9f922c5841c2e5ae37f03b7cc53b932f03edf0dbdde046839b33 +size 61112 diff --git a/Apo-4A Saber/Texts/English_Apo-4A Saber.xml b/Apo-4A Saber/Texts/English_Apo-4A Saber.xml new file mode 100644 index 0000000..9cd07cd --- /dev/null +++ b/Apo-4A Saber/Texts/English_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + Tools + Deconstruction Product + Raw Materials + Discharge Coil + Coil Capacitor + Battery Capacity + Switch Discharge Coil + Depth Charge + Decoy + Switch Alternate Line + Alternate Power + Ammo Materials + Mineral Scanner + Switch Type + Safety + Depth Charge Control + Hangar + Restricted Area + Unlocked + Lock/Unlock + It's normal to start up slowly for the first time + Switch Waterlevel + Dynamite + Safety On + Safety Off + Drone Battery + Gate State + Drone Power + Gate Switch + ON + OFF + MainGun-Up + MainGun-Down + Ahead + Top Back + Bottom Back + Top Front + Bottom Front + Normal + Out Of Fuel + Drone Reload + + Ammo Depot + Fire Control Room + Ammo Production + Alternate Line + Planting Room + \ No newline at end of file diff --git a/Apo-4A Saber/Texts/Japanese_Apo-4A Saber.xml b/Apo-4A Saber/Texts/Japanese_Apo-4A Saber.xml new file mode 100644 index 0000000..2d6a3b9 --- /dev/null +++ b/Apo-4A Saber/Texts/Japanese_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + 道具類 + 不要物 + 原材料 + 放電コイル + コイル用バッテリ + バッテリ容量 + 放電コイル動作切り替え + 爆雷 + デコイ + 別系統切り替え + 別系統動力 + 弾薬素材 + 鉱物スキャナ + 種類切り替え + 安全装置 + 爆雷制御 + 格納庫 + 制限区域 + アンロック + ロック/アンロック + 初回起動時動作は低速 + 水レベル切り替え + 爆薬類 + 安全装置 ON + 安全装置 OFF + 無人機バッテリ + ゲート状態 + 無人機動力 + ゲート切り替え + ON + OFF + 上部砲 + 下部砲 + 前方砲 + 上後部砲 + 下後部砲 + 上前部砲 + 下前部砲 + 通常 + 燃料切れ + 無人機弾薬 + + 弾薬庫 + 火器管制所 + 弾薬製造室 + 別系統 + 栽培室 + \ No newline at end of file diff --git a/Apo-4A Saber/Texts/Polish_Apo-4A Saber.xml b/Apo-4A Saber/Texts/Polish_Apo-4A Saber.xml new file mode 100644 index 0000000..2ddd407 --- /dev/null +++ b/Apo-4A Saber/Texts/Polish_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + Sprzęt + Produkty Niszczarki + Materiały + Cewka + Kondensator Cewki + Bateria + Przełącz Cewkę + Bomba + Wabik + Przełącz Zasilanie Awaryjne + Zapas. Bateria + Materiały Amunicji + Skaner + Ładunek + Zabezpieczenie + Kontrola ładunków głębinowych + Hangar + Obszar Zastrzeżony + Odblokowany + Zablokuj/Odblokuj + Nie rozpędzaj się za bardzo + Przełącz poziom wody + C4 + Zabezpieczenie WŁ + Zabezpieczenie WYŁ + Bateria Drona + Stan Grodzi + Zasilanie Drona + Przełącz Grodzie + + WYŁ + Działo-Góra + Działo-Dół + Przód + Góra Tył + Dół Tył + Góra Przód + Dół Przód + Normalny + Brak Paliwa + Ładowanie Drona + + Skład amunicji + Kontrolnia dział + Produkcja amunicji + Zasilanie awaryjne + Ogród + \ No newline at end of file diff --git a/Apo-4A Saber/Texts/Russian_Apo-4A Saber.xml b/Apo-4A Saber/Texts/Russian_Apo-4A Saber.xml new file mode 100644 index 0000000..fd69fd4 --- /dev/null +++ b/Apo-4A Saber/Texts/Russian_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + Инструменты + Продукт деконструкции + Сырье + Катушка разряда + Катушка Конденсатор + Емкость батареи + Катушка разряда переключателя + Глубинный заряд + Приманка + Переключить альтернативную линию + Альтернативная мощность + Боеприпасы + Минеральный сканер + Минеральный сканер + Безопасность + Контроль глубины заряда + Ангар + Запретная зона + Разблокирован + Заблокировать / Разблокировать + Медленный запуск в первый раз - это нормально + Переключатель уровня воды + Динамит + Безопасность включена + Безопасность выключена + Аккумулятор для дрона + Состояние ворот + Дрон Мощность + Переключатель ворот + ON + OFF + MainGun-Up + MainGun-Down + Предстоящий + Вверху назад + Внизу Назад + Вверху спереди + Снизу спереди + Нормальный + Нет топлива + Перезарядка дрона + + Склад боеприпасов + Комната управления огнем + Производство боеприпасов + Альтернативная линия + Посадочная комната + \ No newline at end of file diff --git a/Apo-4A Saber/Texts/SimplifiedChinese_Apo-4A Saber.xml b/Apo-4A Saber/Texts/SimplifiedChinese_Apo-4A Saber.xml new file mode 100644 index 0000000..6fc8d73 --- /dev/null +++ b/Apo-4A Saber/Texts/SimplifiedChinese_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + 工具 + 解构产物 + 原材料 + 电磁线圈 + 线圈电容 + 电池电量 + 切换自动线圈 + 深水炸弹 + 诱饵弹 + 切换备用线路 + 备用电量 + 弹药原材料 + 矿物扫描 + 切换弹种 + 保险 + 深水炸弹控制 + 机库 + 限制区域 + 已解锁 + 解锁/上锁 + 第一次启动较慢是正常现象 + 切换水位 + 炸药 + 保险开启 + 保险关闭 + 无人机电量 + 机库门状态 + 无人机电源 + 机库门操作 + 开启 + 关闭 + 上方主炮 + 下方主炮 + 前方 + 后上方 + 后下方 + 前上方 + 前下方 + 正常 + 燃料耗尽 + 无人机装填 + + 弹药库 + 火控室 + 弹药制作舱 + 备用线路舱 + 种植室 + \ No newline at end of file diff --git a/Apo-4A Saber/Texts/TraditionalChinese_Apo-4A Saber.xml b/Apo-4A Saber/Texts/TraditionalChinese_Apo-4A Saber.xml new file mode 100644 index 0000000..130ad21 --- /dev/null +++ b/Apo-4A Saber/Texts/TraditionalChinese_Apo-4A Saber.xml @@ -0,0 +1,51 @@ + + + + 工具 + 解構產物 + 原材料 + 電磁線圈 + 線圈電容 + 電池電量 + 切換自動線圈 + 深水炸彈 + 誘餌彈 + 切換備用線路 + 備用電量 + 彈藥原材料 + 礦物掃描 + 切換彈種 + 保險 + 深水炸彈控製 + 機庫 + 限製區域 + 已解鎖 + 解鎖/上鎖 + 第一次啟動較慢是正常現象 + 切換水位 + 炸藥 + 保險開啟 + 保險關閉 + 無人機電量 + 機庫門狀態 + 無人機電源 + 機庫門操作 + 開啟 + 關閉 + 上方主炮 + 下方主炮 + 前方 + 後上方 + 後下方 + 前上方 + 前下方 + 正常 + 燃料耗盡 + 無人機裝填 + + 彈藥庫 + 火控室 + 彈藥製作艙 + 備用線路艙 + 種植室 + \ No newline at end of file diff --git a/Apo-4A Saber/filelist.xml b/Apo-4A Saber/filelist.xml new file mode 100644 index 0000000..b51bf35 --- /dev/null +++ b/Apo-4A Saber/filelist.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Arlcliff Raider/Arlcliff.sub b/Arlcliff Raider/Arlcliff.sub new file mode 100644 index 0000000..ac11a9b --- /dev/null +++ b/Arlcliff Raider/Arlcliff.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d68b7465685f2d5edcf7e2ee0189bea0e28eeac13d8354dc9ea97c3fef6acdd +size 252917 diff --git a/Arlcliff Raider/filelist.xml b/Arlcliff Raider/filelist.xml new file mode 100644 index 0000000..fdb7024 --- /dev/null +++ b/Arlcliff Raider/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Beacons Extended/BeaconStations/BeaconCRO01.sub b/Beacons Extended/BeaconStations/BeaconCRO01.sub new file mode 100644 index 0000000..6dec718 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconCRO01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d8ad40334e949558b910a822ba75b0060b5289bf82b8a1943280b802368e22 +size 49506 diff --git a/Beacons Extended/BeaconStations/BeaconCRO02.sub b/Beacons Extended/BeaconStations/BeaconCRO02.sub new file mode 100644 index 0000000..5422965 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconCRO02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b440179bf8bec55584c1a3b5a8abafa8906b19c78769da0a2bbbc5d335a0a3e +size 26991 diff --git a/Beacons Extended/BeaconStations/BeaconCRO02_Bandit.sub b/Beacons Extended/BeaconStations/BeaconCRO02_Bandit.sub new file mode 100644 index 0000000..6f0ec30 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconCRO02_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c57d19d167ab94d4a253db4b48d9030ae7ed2007633b0f7f7e6122ee398f370 +size 28341 diff --git a/Beacons Extended/BeaconStations/BeaconDUC01.sub b/Beacons Extended/BeaconStations/BeaconDUC01.sub new file mode 100644 index 0000000..2bfb06c --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconDUC01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae23558c885e8e53c59a7281cfd5d91db08bc2231a0a276229ec2d641cfa5332 +size 17096 diff --git a/Beacons Extended/BeaconStations/BeaconEK01.sub b/Beacons Extended/BeaconStations/BeaconEK01.sub new file mode 100644 index 0000000..566c783 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconEK01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80dc3c2741b058e03e03040dbeb2e3c89d6bd376372520b2558df910cfcae8a5 +size 20563 diff --git a/Beacons Extended/BeaconStations/BeaconEK02.sub b/Beacons Extended/BeaconStations/BeaconEK02.sub new file mode 100644 index 0000000..7613be4 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconEK02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2784e8d1698cd161a2f0b7ac16b1988de15a7096fee2bc20c5a35e8e87ec5c10 +size 21516 diff --git a/Beacons Extended/BeaconStations/BeaconEK03.sub b/Beacons Extended/BeaconStations/BeaconEK03.sub new file mode 100644 index 0000000..6441607 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconEK03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cde6ae26e32526986a803d1dd8c0288f9344e74b2d1cf0a598070e3bfbd3bc6 +size 39745 diff --git a/Beacons Extended/BeaconStations/BeaconEK03_Bandit.sub b/Beacons Extended/BeaconStations/BeaconEK03_Bandit.sub new file mode 100644 index 0000000..7fca8aa --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconEK03_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2152e8bee63042dfca959aa534fc3cdee69f35b4af635dc4c47d1c18ef2cf14 +size 43457 diff --git a/Beacons Extended/BeaconStations/BeaconEK04.sub b/Beacons Extended/BeaconStations/BeaconEK04.sub new file mode 100644 index 0000000..c65dbe7 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconEK04.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72ddf2d64976b441ce18d0d5984c4ac2f4a95099059c3db81f3a3139f129ff27 +size 28867 diff --git a/Beacons Extended/BeaconStations/BeaconFRG01.sub b/Beacons Extended/BeaconStations/BeaconFRG01.sub new file mode 100644 index 0000000..339d550 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconFRG01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22d998f7ab64ff6a2b8b1a973a681162d56eb6797b297050c32fff3bdd68caea +size 21379 diff --git a/Beacons Extended/BeaconStations/BeaconFRG01_Bandit.sub b/Beacons Extended/BeaconStations/BeaconFRG01_Bandit.sub new file mode 100644 index 0000000..8be258d --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconFRG01_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7f0c1e99535cd53decfe73b89cbff8710c33ba0a285ec78bdde0b0ec4833d98 +size 23322 diff --git a/Beacons Extended/BeaconStations/BeaconGM01.sub b/Beacons Extended/BeaconStations/BeaconGM01.sub new file mode 100644 index 0000000..793810e --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconGM01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8d630f9bee87ae3fb8f39d9a622d64354ca19a4322890d43322a834a2271421 +size 17234 diff --git a/Beacons Extended/BeaconStations/BeaconGM03.sub b/Beacons Extended/BeaconStations/BeaconGM03.sub new file mode 100644 index 0000000..447b1d9 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconGM03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca600e066f7f5fc1096bdc7f7d4a4d5cd1f95601473c4fd02984e96152494cdf +size 35951 diff --git a/Beacons Extended/BeaconStations/BeaconMOR01.sub b/Beacons Extended/BeaconStations/BeaconMOR01.sub new file mode 100644 index 0000000..38a3ff5 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconMOR01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2db5c5928620182d1764793a067adf12a9b3ee85ee9f8e1c113fd3decabe8b60 +size 32496 diff --git a/Beacons Extended/BeaconStations/BeaconMOR01_Bandit.sub b/Beacons Extended/BeaconStations/BeaconMOR01_Bandit.sub new file mode 100644 index 0000000..e09753f --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconMOR01_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:980a48cf09e7ba56e5aad2e42e1e337e58b909689ecd92dc63eb60e4a0151bb9 +size 36558 diff --git a/Beacons Extended/BeaconStations/BeaconMS01.sub b/Beacons Extended/BeaconStations/BeaconMS01.sub new file mode 100644 index 0000000..96aee59 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconMS01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f062e3e0782abe7e63c15d3062682821e8095f468192d834a22ef7c2da4b68f +size 15004 diff --git a/Beacons Extended/BeaconStations/BeaconRAV01.sub b/Beacons Extended/BeaconStations/BeaconRAV01.sub new file mode 100644 index 0000000..cf31674 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRAV01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fe6281cf2075ef18c2e214ce1ed601de14ceae48fce5357f136f4bd956fd1bd +size 20350 diff --git a/Beacons Extended/BeaconStations/BeaconRAV02.sub b/Beacons Extended/BeaconStations/BeaconRAV02.sub new file mode 100644 index 0000000..0e9eafa --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRAV02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bfec0eac1b52b3abfbbcea982dd400b754c8cd0b0f43956f47f4b0f16c898cf +size 29451 diff --git a/Beacons Extended/BeaconStations/BeaconRD01.sub b/Beacons Extended/BeaconStations/BeaconRD01.sub new file mode 100644 index 0000000..8f5ff8c --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRD01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89f26ca3f6cf1b24fd9cfd9e199ba7bd55d7227f248ce8df1b9fa9502359bf8a +size 20316 diff --git a/Beacons Extended/BeaconStations/BeaconRD02.sub b/Beacons Extended/BeaconStations/BeaconRD02.sub new file mode 100644 index 0000000..01fcacd --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRD02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4431756577e1de23c3b623d86b843931b987968fe7824a67de0dc5c2edbe452 +size 20185 diff --git a/Beacons Extended/BeaconStations/BeaconRD03.sub b/Beacons Extended/BeaconStations/BeaconRD03.sub new file mode 100644 index 0000000..7a1f3a2 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRD03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca6acf47ff0ac537749cdc299b1bcf5f4bbce1f7b9ee2956980b4cd9f47c3af4 +size 24480 diff --git a/Beacons Extended/BeaconStations/BeaconRYR01.sub b/Beacons Extended/BeaconStations/BeaconRYR01.sub new file mode 100644 index 0000000..8d140fa --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88ca14625c278d8f51a49146dea2e8c35bd20c3cf993b185bb10ba6ab3305a5d +size 29300 diff --git a/Beacons Extended/BeaconStations/BeaconRYR01_Bandit.sub b/Beacons Extended/BeaconStations/BeaconRYR01_Bandit.sub new file mode 100644 index 0000000..d3fb408 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR01_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96ac8c8b587f22c7212b687f541e2fbba0719bafda1e17877b75a377325e0fd4 +size 32146 diff --git a/Beacons Extended/BeaconStations/BeaconRYR02.sub b/Beacons Extended/BeaconStations/BeaconRYR02.sub new file mode 100644 index 0000000..999eb01 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0978768061111acaef6a159b038a0cf19f2b4dab0b3dd8dfdacabd24e08cbf08 +size 28538 diff --git a/Beacons Extended/BeaconStations/BeaconRYR03.sub b/Beacons Extended/BeaconStations/BeaconRYR03.sub new file mode 100644 index 0000000..64b5e4a --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcd125a0ed1a9f4f6edafe8dce25bb9f198f61092fc76a1778f574a62a9e280c +size 43412 diff --git a/Beacons Extended/BeaconStations/BeaconRYR04.sub b/Beacons Extended/BeaconStations/BeaconRYR04.sub new file mode 100644 index 0000000..2216477 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR04.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b19421b6e400a7e0687a0f85992fa8a9c7b4a94c1c943c8e1055888b3c004fc +size 38141 diff --git a/Beacons Extended/BeaconStations/BeaconRYR05.sub b/Beacons Extended/BeaconStations/BeaconRYR05.sub new file mode 100644 index 0000000..784726a --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR05.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a597708b6656bcf7e928f860358caf78113097ff0ebd3c91139ee78b72a3a19 +size 25475 diff --git a/Beacons Extended/BeaconStations/BeaconRYR06A.sub b/Beacons Extended/BeaconStations/BeaconRYR06A.sub new file mode 100644 index 0000000..5e6b64d --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR06A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64e1b7e649717f98e2ec414561b6009d19e2eb4b7eff8a07923e1119433413d4 +size 43686 diff --git a/Beacons Extended/BeaconStations/BeaconRYR07.sub b/Beacons Extended/BeaconStations/BeaconRYR07.sub new file mode 100644 index 0000000..c1b6924 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR07.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4985d43bad1e4d6f496d388377f46c2484b66d60b3519f9a1937555b59f7e4fd +size 42817 diff --git a/Beacons Extended/BeaconStations/BeaconRYR08.sub b/Beacons Extended/BeaconStations/BeaconRYR08.sub new file mode 100644 index 0000000..c37bab6 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconRYR08.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62cc0b26ed75d0b12aa8c28f995d2603401d1a31c144dfeb242a0f0700c12113 +size 23924 diff --git a/Beacons Extended/BeaconStations/BeaconSB01.sub b/Beacons Extended/BeaconStations/BeaconSB01.sub new file mode 100644 index 0000000..7f57def --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSB01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44b785ff1a0c1d2509150e8edf73bd9ebf94b150dc16dde5121191b136f3684a +size 16409 diff --git a/Beacons Extended/BeaconStations/BeaconSB02.sub b/Beacons Extended/BeaconStations/BeaconSB02.sub new file mode 100644 index 0000000..c1419c8 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSB02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a64d4d3eaf4752c5c185fd49e970b7f218df284eaca128a394fa06e3932e8dc1 +size 19041 diff --git a/Beacons Extended/BeaconStations/BeaconSB03.sub b/Beacons Extended/BeaconStations/BeaconSB03.sub new file mode 100644 index 0000000..f2a884c --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSB03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a605471cb2aaef6a5ae9cba1709f706c2dfc5c8c4366830db63b073729754ccb +size 16279 diff --git a/Beacons Extended/BeaconStations/BeaconSB04.sub b/Beacons Extended/BeaconStations/BeaconSB04.sub new file mode 100644 index 0000000..92d13f0 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSB04.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac6925e38ab63adbdd3737bcdfc48e6258ce695d8c62c0044ba3fda00eb84e63 +size 16375 diff --git a/Beacons Extended/BeaconStations/BeaconSB05.sub b/Beacons Extended/BeaconStations/BeaconSB05.sub new file mode 100644 index 0000000..280636b --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSB05.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:094c2c9b0c4bbdf2ac0694f4e124d880328517c1033a65b6ce4ced32e09bb969 +size 15192 diff --git a/Beacons Extended/BeaconStations/BeaconSING01A.sub b/Beacons Extended/BeaconStations/BeaconSING01A.sub new file mode 100644 index 0000000..a61d94c --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING01A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0d77a4d01d3394eaa5159ea80627c3093d931bc76c97b380380bad07bf639cb +size 29308 diff --git a/Beacons Extended/BeaconStations/BeaconSING01B.sub b/Beacons Extended/BeaconStations/BeaconSING01B.sub new file mode 100644 index 0000000..0dd29ec --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING01B.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:041c54ca8877827676c9f09c40b3049684bb83816c912d61e12d2ee63e428756 +size 31966 diff --git a/Beacons Extended/BeaconStations/BeaconSING01B_Bandit.sub b/Beacons Extended/BeaconStations/BeaconSING01B_Bandit.sub new file mode 100644 index 0000000..6d6be69 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING01B_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64ec97d361a21b73295d7ff9ca291538f12dcec3a0ddfee4e2e9f9968fa53839 +size 33388 diff --git a/Beacons Extended/BeaconStations/BeaconSING02.sub b/Beacons Extended/BeaconStations/BeaconSING02.sub new file mode 100644 index 0000000..54196a4 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e534eb9f4e4f834945e5194c764eb612c5d8223ca41ede537737e5e096ee2f6e +size 19789 diff --git a/Beacons Extended/BeaconStations/BeaconSING03.sub b/Beacons Extended/BeaconStations/BeaconSING03.sub new file mode 100644 index 0000000..87cc73b --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3db5673a61e0111bf811323ecc74ae4d2b404ffbb62b96fc0b09d51726b1bec7 +size 15690 diff --git a/Beacons Extended/BeaconStations/BeaconSING04.sub b/Beacons Extended/BeaconStations/BeaconSING04.sub new file mode 100644 index 0000000..c6d049a --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING04.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a6942518257f5adc42e7230bbe99b4d82dd1ed9e7dbe3321cd329aacb366b06 +size 20293 diff --git a/Beacons Extended/BeaconStations/BeaconSING04_Bandit.sub b/Beacons Extended/BeaconStations/BeaconSING04_Bandit.sub new file mode 100644 index 0000000..f7b4f4b --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING04_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:730bde2edb71fee4be193e157f0a7fd6ccec2594e79fcc59ee24a31823a00ea2 +size 20496 diff --git a/Beacons Extended/BeaconStations/BeaconSING05.sub b/Beacons Extended/BeaconStations/BeaconSING05.sub new file mode 100644 index 0000000..0d8b551 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING05.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:991684108893a1ade5b3ef9f1c17c2484824583858cf7e585cee2f5079859968 +size 16639 diff --git a/Beacons Extended/BeaconStations/BeaconSING06.sub b/Beacons Extended/BeaconStations/BeaconSING06.sub new file mode 100644 index 0000000..13bdea2 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING06.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:556f4c0fa5e239a77de1a69e5ad068698d9ca5c2a9a6f385b55a591131850ae5 +size 24068 diff --git a/Beacons Extended/BeaconStations/BeaconSING07.sub b/Beacons Extended/BeaconStations/BeaconSING07.sub new file mode 100644 index 0000000..1d153a7 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING07.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75353af38626f4671878532e3686ad9490a7ad70b49c805f46f3767e85196943 +size 24177 diff --git a/Beacons Extended/BeaconStations/BeaconSING08A.sub b/Beacons Extended/BeaconStations/BeaconSING08A.sub new file mode 100644 index 0000000..449d89c --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING08A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:776f2d41dfe8665a2a2c60637d365cae994cf241b795278d27b012aa4faafda1 +size 25696 diff --git a/Beacons Extended/BeaconStations/BeaconSING08B.sub b/Beacons Extended/BeaconStations/BeaconSING08B.sub new file mode 100644 index 0000000..a2447b7 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING08B.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1e7408262d6bd37fb0e57800a859274c2f863618bd7ec5a4ede94ea36c79ef5 +size 22829 diff --git a/Beacons Extended/BeaconStations/BeaconSING09A.sub b/Beacons Extended/BeaconStations/BeaconSING09A.sub new file mode 100644 index 0000000..fe55544 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING09A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06b4d464cbe83b424d86e93ccf81cb05496b5e22816064b6a2195acf373edbfc +size 20135 diff --git a/Beacons Extended/BeaconStations/BeaconSING09B.sub b/Beacons Extended/BeaconStations/BeaconSING09B.sub new file mode 100644 index 0000000..14b815a --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING09B.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c58e86c3c698f2f218d45c747073dbcc0e6f15b1649fc15d24ae8e4d0cb0c09 +size 21299 diff --git a/Beacons Extended/BeaconStations/BeaconSING10A.sub b/Beacons Extended/BeaconStations/BeaconSING10A.sub new file mode 100644 index 0000000..d5ed9e5 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING10A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57542f0a5f974abb3717464dbb1b2fe7828ba866bd55296498347f1369d94e82 +size 34225 diff --git a/Beacons Extended/BeaconStations/BeaconSING10A_Bandit.sub b/Beacons Extended/BeaconStations/BeaconSING10A_Bandit.sub new file mode 100644 index 0000000..298e59e --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING10A_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d3750674344039b23c62d335dcb9df8e10c34136b81d61058a9dce9f08d7707 +size 36971 diff --git a/Beacons Extended/BeaconStations/BeaconSING10B.sub b/Beacons Extended/BeaconStations/BeaconSING10B.sub new file mode 100644 index 0000000..54444ee --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING10B.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05196a0c8fc48d5e8fb7e06d476442bbe9544fb94d60a3cd29881e1198c2f1b9 +size 33728 diff --git a/Beacons Extended/BeaconStations/BeaconSING10B_Bandit.sub b/Beacons Extended/BeaconStations/BeaconSING10B_Bandit.sub new file mode 100644 index 0000000..d389f49 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING10B_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a64f03ad79ff1a3b4f803087871e47cc73a3507786656fdea3fe5fc8cf74b708 +size 40297 diff --git a/Beacons Extended/BeaconStations/BeaconSING11A.sub b/Beacons Extended/BeaconStations/BeaconSING11A.sub new file mode 100644 index 0000000..ba60209 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING11A.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:230570610e37846a3a112b7875327dd2e17f83572283b33e412501fa71ec150a +size 31494 diff --git a/Beacons Extended/BeaconStations/BeaconSING11B.sub b/Beacons Extended/BeaconStations/BeaconSING11B.sub new file mode 100644 index 0000000..2bad25a --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING11B.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f06610ec7b0332f53b278e32baf91015e92a880916bc13b37434b4458232180 +size 26256 diff --git a/Beacons Extended/BeaconStations/BeaconSING11B_Bandit.sub b/Beacons Extended/BeaconStations/BeaconSING11B_Bandit.sub new file mode 100644 index 0000000..39f87db --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconSING11B_Bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48f6e2bd9ca23e1e0f8d595d80d895d6f277a8dd6a6e5f139440ccd5194465e1 +size 27585 diff --git a/Beacons Extended/BeaconStations/BeaconT01.sub b/Beacons Extended/BeaconStations/BeaconT01.sub new file mode 100644 index 0000000..f38c96d --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconT01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be03259b3166f6621b86aad5cdc11e74e5f66ce0838624c90dd5651d62893c0d +size 18688 diff --git a/Beacons Extended/BeaconStations/BeaconUBER01.sub b/Beacons Extended/BeaconStations/BeaconUBER01.sub new file mode 100644 index 0000000..995db9e --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconUBER01.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6da9cffaf3c74ebf7ca7d10495c7278d1054bcbba0c694b6686c8de00ea07d7b +size 27408 diff --git a/Beacons Extended/BeaconStations/BeaconUBER02.sub b/Beacons Extended/BeaconStations/BeaconUBER02.sub new file mode 100644 index 0000000..4f1d1b5 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconUBER02.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3ac979aa83e845ebfba609bfd858d14e567a964bf0b71ade41b1bffbd852d7 +size 22612 diff --git a/Beacons Extended/BeaconStations/BeaconUBER03.sub b/Beacons Extended/BeaconStations/BeaconUBER03.sub new file mode 100644 index 0000000..f6dcea1 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconUBER03.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23f57e0a2ad96723166b68aba4683ccfbcdd8cfc517c666fb890c954fc17b6ef +size 23117 diff --git a/Beacons Extended/BeaconStations/BeaconUBER03_bandit.sub b/Beacons Extended/BeaconStations/BeaconUBER03_bandit.sub new file mode 100644 index 0000000..73728f8 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconUBER03_bandit.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96f2d4dc4a7e2a68ba5a0539f06fcd43d205ca7b398cd48c5b0b9c5069f1f13e +size 26832 diff --git a/Beacons Extended/BeaconStations/BeaconUBER04.sub b/Beacons Extended/BeaconStations/BeaconUBER04.sub new file mode 100644 index 0000000..8d4ba94 --- /dev/null +++ b/Beacons Extended/BeaconStations/BeaconUBER04.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:480a430e72172810fef1fb7deb44064741767e13349b0262b9b56897896fbec6 +size 21347 diff --git a/Beacons Extended/BeaconStations/Modules/Beacon_BoardingShuttle.sub b/Beacons Extended/BeaconStations/Modules/Beacon_BoardingShuttle.sub new file mode 100644 index 0000000..96454cb --- /dev/null +++ b/Beacons Extended/BeaconStations/Modules/Beacon_BoardingShuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bee1bf1893c1a3caabce1ae1edba2fb98647078391ce6e3054be75338f9cf7c +size 5152 diff --git a/Beacons Extended/BeaconStations/Modules/Beacon_Deco_Cargo18E.sub b/Beacons Extended/BeaconStations/Modules/Beacon_Deco_Cargo18E.sub new file mode 100644 index 0000000..d73df69 --- /dev/null +++ b/Beacons Extended/BeaconStations/Modules/Beacon_Deco_Cargo18E.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1e491903c112fc6d37e4eb6669810abf0bc1d7ada48c333447803a97ccd4fc0 +size 4370 diff --git a/Beacons Extended/BeaconStations/Modules/Beacon_PowerPod.sub b/Beacons Extended/BeaconStations/Modules/Beacon_PowerPod.sub new file mode 100644 index 0000000..0bfb933 --- /dev/null +++ b/Beacons Extended/BeaconStations/Modules/Beacon_PowerPod.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33ee6097bfec189144308ebc54eb11050657640f993fd59c1fa76ac5a924e373 +size 2697 diff --git a/Beacons Extended/BeaconStations/Modules/Beacon_SupplyShuttle.sub b/Beacons Extended/BeaconStations/Modules/Beacon_SupplyShuttle.sub new file mode 100644 index 0000000..c99f595 --- /dev/null +++ b/Beacons Extended/BeaconStations/Modules/Beacon_SupplyShuttle.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e78578d3f2fe471abadceda3ce801d5e56eefbb51cb914d568dc0d2d544e415e +size 11932 diff --git a/Beacons Extended/Localisation/Beacons_Brazilian_Portuguese.xml b/Beacons Extended/Localisation/Beacons_Brazilian_Portuguese.xml new file mode 100644 index 0000000..2e48b33 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Brazilian_Portuguese.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Chinese_Simplified.xml b/Beacons Extended/Localisation/Beacons_Chinese_Simplified.xml new file mode 100644 index 0000000..4ca801a --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Chinese_Simplified.xml @@ -0,0 +1,47 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + 废气 + 冷却液 + 通讯 + + 实验对象行为:友好 + 能源电池已对接 + 能源电池未对接 + 能源开启 + 能源关闭 + 需要密码 + 数据发送已激活 + 错误 - 无效代码 + 尝试定位补给穿梭艇……距离: + 米远 + 信标站紧急代码: + 求救信号 + + 摄像机 + 放电线圈 + + + + + + 禁止入内 + 维修通道 + + 在范围内检测到信标。\n输入 !code 生成信标激活代码。 + 需要发送器密码 - 等待穿梭艇\n错误 - 与穿梭艇失去联系……须取回密码\n……\n错误\n……\n错误\n…… + 能量屏障控制\n可用指令:on / off + 联合欧罗巴联盟\n用户:Niel Stewart\nID#:225138693\n收件箱:\n寄件人:Karin Provsky\n嗨Niel,Darnell出了那样的事真令人难过,尽量对Becky温柔点,虽然有时候她是很难管教。我理解你的忧虑,知道你在乎我很是宽慰。\n发件箱:\n收件人:Karin Provsky\n嗨Karin,Darnell的情况还是不怎么好,Becky开始让我头疼了。不管怎样希望你一切安好,我很担心你和那群极端分子一起工作,保重。 + [1] - 开门\n[0] - 关门 + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + 钥匙卡在天线底下的维护面板后面。 + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Chinese_Traditional.xml b/Beacons Extended/Localisation/Beacons_Chinese_Traditional.xml new file mode 100644 index 0000000..a378249 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Chinese_Traditional.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_English.xml b/Beacons Extended/Localisation/Beacons_English.xml new file mode 100644 index 0000000..5d17f5d --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_English.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Finnish.xml b/Beacons Extended/Localisation/Beacons_Finnish.xml new file mode 100644 index 0000000..01ee519 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Finnish.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_French.xml b/Beacons Extended/Localisation/Beacons_French.xml new file mode 100644 index 0000000..a07a5c4 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_French.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_German.xml b/Beacons Extended/Localisation/Beacons_German.xml new file mode 100644 index 0000000..ecf9ceb --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_German.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Japanese.xml b/Beacons Extended/Localisation/Beacons_Japanese.xml new file mode 100644 index 0000000..6f1446d --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Japanese.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Korean.xml b/Beacons Extended/Localisation/Beacons_Korean.xml new file mode 100644 index 0000000..7dabfd3 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Korean.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Polish.xml b/Beacons Extended/Localisation/Beacons_Polish.xml new file mode 100644 index 0000000..8b53a9f --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Polish.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Russian.xml b/Beacons Extended/Localisation/Beacons_Russian.xml new file mode 100644 index 0000000..ebfdf6e --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Russian.xml @@ -0,0 +1,48 @@ + + + + [[use]] Повернуть + [[use]] Отсоединить (Отвертка) + [[use]] Отсоединить (Нож) + [[shoot]] Резать (Нож) + [[use]] Вскрыть (Нож) + [[use]] Дышать + Этот объект нельзя вскрыть с помощью лома. + + + ВЫПУСК + ОХЛАДИТЕЛЬ + ПУНКТ СВЯЗИ + Радиопередатчик активирован + Радиопередатчик отключен. Необходимо активировать передатчик на вершине антенны. + + Поведение особи: дружелюбное + ЭНЕРГОЯЧЕЙКА ПРИСТЫКОВАНА + ЭНЕРГОЯЧЕЙКА ОТСТЫКОВАНА + ПИТАНИЕ ВКЛЮЧЕНО + ПИТАНИЕ ОТКЛЮЧЕНО + Требуется код + Передача данных активирована + ОШИБКА - Неверный код + Поиск челнока снабжения... Расстояние: + метров + АВАРИЙНЫЙ КОД МАЯКА: + СИГНАЛ БЕДСТВИЯ + + КАМЕРА + РАЗРЯДНАЯ КАТУШКА + ВКЛ + вкл + ВЫКЛ + выкл + + БЛОКИРОВКА + СЕРВИСНЫЙ ШЛЮЗ + В зоне действия обнаружен маяк.\nВведите команду !code для генерации кода активации маяка. + ТРЕБУЕТСЯ КОД ПЕРЕДАТЧИКА - ОЖИДАНИЕ ЧЕЛНОКА\nОШИБКА - КОНТАКТ С ЧЕЛНОКОМ ПОТЕРЯН... ТРЕБУЕТСЯ КОД АКТИВАЦИИ\n...\nОШИБКА\n...\nОШИБКА\n... + УПРАВЛЕНИЕ ЭНЕРГОЩИТОМ\nДОСТУПНЫЕ КОМАНДЫ: on / off + ОБЪЕДИНЁННАЯ КОАЛИЦИЯ ЕВРОПЫ\nПОЛЬЗОВАТЕЛЬ: Ньель Стюарт\nИД#: 225138693\nВходящие:\nОт: Карин Провски\nПривет Ньель, Печально было узнать о том, что случилось с Дарнеллом, я знаю что Бекки порой может быть сплошная головной болью, но постарайся быть с ней помягче. Я понимаю твоё беспокойство и мне приятно что тебе не всё равно.\nИсходящие:\nКому: Карин Провски\nПривет Карин, Дарнеллу всё ещё не хорошо, а от Бекки у меня уже начинает болеть голова. В любом случае надеюсь что ответ застал тебя в добром здравии. Я беспокоюсь за тебя, из-за тех радикалов с которыми ты работаешь, будь осторожна. + [1] - ОТКРЫТЬ ДВЕРЬ\n[0] - ЗАКРЫТЬ ДВЕРЬ + =======СТАЦИОНАРНЫЙ РЕЖИМ=======\nМОБИЛЬНАЯ СОНАРНАЯ СТАНЦИЯ 'ШМЕЛЬ' АКТИВИРОВАНА В СТАЦИОНАРНОМ РЕЖИМЕ\nФУНКЦИИ ДВИЖЕНИЯ НЕДОСТУПНЫ + Ключ-карта за тех. панелью в основании антенны. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Spanish_Castilian.xml b/Beacons Extended/Localisation/Beacons_Spanish_Castilian.xml new file mode 100644 index 0000000..00c613d --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Spanish_Castilian.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Spanish_LatinAmerican.xml b/Beacons Extended/Localisation/Beacons_Spanish_LatinAmerican.xml new file mode 100644 index 0000000..99fd39d --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Spanish_LatinAmerican.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/Localisation/Beacons_Turkish.xml b/Beacons Extended/Localisation/Beacons_Turkish.xml new file mode 100644 index 0000000..d9a5709 --- /dev/null +++ b/Beacons Extended/Localisation/Beacons_Turkish.xml @@ -0,0 +1,46 @@ + + + + [[use]] Rotate + [[use]] Detach (Screwdriver) + [[use]] Detach (Knife) + [[use]] Cut (Knife) + [[use]] Force open (Knife) + [[use]] Breathe + This object cannot be pried with crowbar. + + + EXHAUST + COOLANT + COMMUNICATIONS + + Subject behavior: Friendly + POWER CELL DOCKED + POWER CELL UNDOCKED + POWER ON + POWER OFF + Code required + Transmission Activated + ERROR - Wrong code + Trying to locate supply shuttle... Disantce: + meters away + BEACON DISTRESS CODE: + DISTRESS + + CAMERA + ELECTRIC COILS + ON + on + OFF + off + + LOCKDOWN + MAINTENANCE ACCESS + Beacon in range detected.\nType !code to generate a beacon activation code + TRANSMITTER CODE REQUIRED - AWAITING SHUTTLE\nERROR - LOST CONTACT WITH SHUTTLE... CODES MUST BE RECOVERED\n...\nERROR\n...\nERROR\n... + SHIELD GENERATOR\nCOMMANDS: on / off + UNITED EUROPAN COALITION\nUSER: Niel Stewart\nID#: 225138693\nInbox:\nFrom: Karin Provsky\nHi Niel, I'm sorry to hear about Darnell, and try not to be to hard on Becky I know she can be a handfull at times. I understand your concern, and its comforting to know you care.\nOutbox:\nTo: Karin Provsky\nHi Karin, Darnell is still not doing so good and Becky is starting to give me a headache. Anyway i hope this message finds you in good health, I worry about you working with those radicals, stay safe. + [1] - OPEN THE DOOR\n[0] - CLOSE THE DOOR + =======STATIONARY MODE=======\nMOBILE BEACON STATION 'BUMBLEBEE' ACTIVATED IN STATIONARY MODE\nMOVEMENT FUNCTIONS ARE UNAVAILABLE + Key is behid maintenance pannel at the base of the antenna. + \ No newline at end of file diff --git a/Beacons Extended/filelist.xml b/Beacons Extended/filelist.xml new file mode 100644 index 0000000..15d2499 --- /dev/null +++ b/Beacons Extended/filelist.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BetterHealthUI (Updated)/CSharp/Client/BetterHealthUIMod.cs b/BetterHealthUI (Updated)/CSharp/Client/BetterHealthUIMod.cs new file mode 100644 index 0000000..bd51d5a --- /dev/null +++ b/BetterHealthUI (Updated)/CSharp/Client/BetterHealthUIMod.cs @@ -0,0 +1,1889 @@ +using System.Reflection; +using System.Collections.Generic; +using System; +using Barotrauma; +using Barotrauma.Sounds; +using Barotrauma.Extensions; +using Barotrauma.Items.Components; +using Barotrauma.Networking; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System.Linq; + +namespace BetterHealthUI { + partial class BetterHealthUIMod { + + private int healthGUIRefreshTimer = 0; + public static bool NeurotraumaEnabled = false; + private static Random rnd = new Random(); + private static CharacterHealth prevOpenHealthWindow = null; + + public void InitClient() { + + // Check if Neurotrauma is enabled + foreach (ContentPackage package in ContentPackageManager.EnabledPackages.All) + { + if (package.NameMatches("Neurotrauma")) + { + NeurotraumaEnabled = true; + break; + } + } + if (NeurotraumaEnabled) + { + ecgCurve = new CCurve(); + ecgCurve.Keys.Add(new CCurveKey(0,0)); // start + ecgCurve.Keys.Add(new CCurveKey(0.1f,-0.1f)); // first low + ecgCurve.Keys.Add(new CCurveKey(0.2f,1f)); // high + ecgCurve.Keys.Add(new CCurveKey(0.3f,-0.3f)); // second low + ecgCurve.Keys.Add(new CCurveKey(0.4f, 0f)); // end + + ecgCurveFib = new CCurve(); + ecgCurveFib.Keys.Add(new CCurveKey(0, -0.9f)); + ecgCurveFib.Keys.Add(new CCurveKey(0.05f, -0.2f)); + ecgCurveFib.Keys.Add(new CCurveKey(0.1f, 0.3f)); + ecgCurveFib.Keys.Add(new CCurveKey(0.15f, -0.2f)); + ecgCurveFib.Keys.Add(new CCurveKey(0.2f, -0.9f)); + } + + //LuaCsSetup.PrintCsMessage("BetterHealthUIMod.InitClient"); + foreach (Character character in Character.CharacterList) + { + CharacterHealth charHealth = character.CharacterHealth; + ForceCustomized(charHealth); + } + + void ForceCustomized(CharacterHealth selfHealth) + { + GUIListBox afflictionIconContainer = (GUIListBox)((typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance)).GetValue(selfHealth)); + + var afflictionIconContainer2 = afflictionIconContainer != null ? (afflictionIconContainer.Parent.GetChildByUserData("afflictionIconContainer2")) : null; + if (afflictionIconContainer2 == null && afflictionIconContainer!= null) + { + // we havent added our custom stuff yet, do it NOW! + LuaCsSetup.PrintCsMessage("Forcing customization on " + selfHealth.Character.Name); + + Dictionary args = new Dictionary(); + args.Add("character", selfHealth.Character); + InitProjSpecific(selfHealth, args); + } + } + + // health window init + // changes dimensions of the health window + // changes job icon, character portrait and name layout and color + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_InitProjSpecific", + typeof(CharacterHealth).GetMethod("InitProjSpecific", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + InitProjSpecific(self, args); + return null; + }, LuaCsHook.HookMethodType.After, this); + void InitProjSpecific(object self, Dictionary args) + { + #region Reflection crap + // get arguments + Character character = (Character)(args["character"]); + // get members + CharacterHealth selfHealth = (CharacterHealth)self; + GUITextBlock characterName = (GUITextBlock)(typeof(CharacterHealth).GetField("characterName", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + GUIFrame healthWindow = (GUIFrame)(typeof(CharacterHealth).GetField("healthWindow", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + #endregion + + var healthWindowVerticalLayout = (GUILayoutGroup)(healthWindow.GetChild(0)); + var characterIndicatorArea = (GUILayoutGroup)(healthWindowVerticalLayout.GetChild(3)); + + // set size of health window + healthWindow.RectTransform.RelativeSize = new Vector2(0.8f, 0.6f); + + // clear portrait, name and icon + var topContainer = characterName.RectTransform.Parent; + topContainer.ClearChildren(); + + // create own layout + topContainer.Parent.RelativeSize = new Vector2(0.975f, 0.95f); + + // job icon + var jobIcon = new GUICustomComponent(new RectTransform(new Vector2(0.2f, 1.0f), topContainer), + onDraw: (spriteBatch, component) => + { + character.Info?.DrawJobIcon(spriteBatch, component.Rect, character != Character.Controlled); + }); + //jobIcon.RectTransform.RelativeSize *= 1f; + //jobIcon.RectTransform.SetPosition(Anchor.TopLeft); + + // char portrait + var characterPortrait = new GUICustomComponent(new RectTransform(new Vector2(0.2f, 1.0f), topContainer, Anchor.CenterLeft), + onDraw: (spriteBatch, component) => + { + character.Info?.DrawPortrait(spriteBatch, new Vector2(component.Rect.X, component.Rect.Center.Y - component.Rect.Width / 2), new Vector2(-40, 15), component.Rect.Width, false, character != Character.Controlled); + }); + characterPortrait.RectTransform.RelativeSize *= 0.7f; + //characterPortrait.RectTransform.Anchor = Anchor.TopLeft; + //characterPortrait.RectTransform.RelativeOffset = new Vector2(0f, 0.3f); + + // char name + characterName = new GUITextBlock(new RectTransform(new Vector2(0.6f, 1f), topContainer, anchor: Anchor.CenterLeft), "", textAlignment: Alignment.CenterLeft, font: GUIStyle.LargeFont) + { + AutoScaleHorizontal = true, + AutoScaleVertical = true + }; + characterName.TextOffset = new Vector2(-50, 0); + + // color the name according to the job + if (character.Info?.Job?.Prefab.UIColor != null) + characterName.TextColor = character.Info.Job.Prefab.UIColor; + + // resize the gene splicer slot + selfHealth.InventorySlotContainer.RectTransform.RelativeSize *= 0.5f; + + // resize the cpr button + var cprButton = (GUIButton)(characterIndicatorArea.GetChild(1)); + cprButton.RectTransform.RelativeSize = new Vector2(0.17f, 0.17f); + + // resize the limb man area + var limbSelection = (GUICustomComponent)(characterIndicatorArea.GetChild(2)); + limbSelection.RectTransform.RelativeSize = new Vector2(0.3f, 1.0f); + + // resize the first affliction info list (non-buff) + afflictionIconContainer.RectTransform.RelativeSize = new Vector2(0.4f, 1); + // create the second affliction info list (buff) + var afflictionIconContainer2 = new GUIListBox(new RectTransform(new Vector2(0.4f, 1.0f), characterIndicatorArea.RectTransform), style: null) + { + UserData = "afflictionIconContainer2", + }; + + // not sure why i need to do this twice but if i dont then the inventoryslot isnt at the right place + // the first time the health window is opened + // nvm, even then it doesnt if in singleplayer + characterIndicatorArea.Recalculate(); + + // Neurotrauma specific elements + if (NeurotraumaEnabled && !BetterHealthUIMod.DisableHeartbeatBar) + { + var children = healthWindow.RectTransform.Children; + List newChildren = new List(); + + var graphArea = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 0.15f), healthWindow.RectTransform, anchor : Anchor.TopRight)) + { + Stretch = true, + RelativeSpacing = 0.02f, + }; + + // rearrange the health windows children so that the graph gets rendered behind the name + newChildren.Add(graphArea.RectTransform); + foreach(RectTransform child in healthWindow.RectTransform.Children) + { + if (child == graphArea.RectTransform) continue; + newChildren.Add(child); + } + + ((List)(healthWindow.RectTransform.Children)).Clear(); + foreach (RectTransform child in newChildren) + { + ((List)(healthWindow.RectTransform.Children)).Add(child); + } + + var graph = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.9f), graphArea.RectTransform), style: "GUIFrameListBox"); + new GUICustomComponent(new RectTransform(new Vector2(0.9f, 0.98f), graph.RectTransform, Anchor.Center), DrawGraph, null); + + void DrawGraph(SpriteBatch spriteBatch, GUICustomComponent container) + { + //if (item.Removed) { return; } + float maxLoad = 100;// loadGraph.Max(); + float xOffset = 0;// graphTimer / updateGraphInterval; + Rectangle graphRect = new Rectangle(container.Rect.X, container.Rect.Y, container.Rect.Width, container.Rect.Height - (int)(5 * GUI.yScale)); + DrawHeartGraph(heartGraph, spriteBatch, graphRect, xOffset); + } + + void DrawHeartGraph(IList graph, SpriteBatch spriteBatch, Rectangle rect, float xOffset) + { + Color color = Color.Green; + const float maxVal = 2; + + Rectangle prevScissorRect = spriteBatch.GraphicsDevice.ScissorRectangle; + spriteBatch.End(); + spriteBatch.GraphicsDevice.ScissorRectangle = rect; + spriteBatch.Begin(SpriteSortMode.Deferred, rasterizerState: GameMain.ScissorTestEnable); + + float lineWidth = (float)rect.Width / (float)(graph.Count - 2); + float yScale = (float)rect.Height / maxVal; + + Vector2 prevPoint = new Vector2(rect.Left, rect.Bottom - (graph[1] + (graph[0] - graph[1]) * xOffset) * yScale); + + float currX = rect.Left + ((xOffset - 1.0f) * lineWidth); + + for (int i = 1; i < graph.Count - 1; i++) + { + float age = 1 - ((i - heartGraphProgress + graph.Count) % graph.Count) / (float)graph.Count; + + currX += lineWidth; + + Vector2 newPoint = new Vector2(currX, rect.Bottom - graph[i] * yScale); + + color = age < 0.025 ? Color.White:Color.Lerp(Color.LimeGreen, Color.Black, age); + GUI.DrawLine(spriteBatch, prevPoint, newPoint + new Vector2(1.0f, 0), color,0,age < 0.025?4:2); + + prevPoint = newPoint; + } + + Vector2 lastPoint = new Vector2(rect.Right, + rect.Bottom - (graph[graph.Count - 1] + (graph[graph.Count - 2] - graph[graph.Count - 1]) * xOffset) * yScale); + + + GUI.DrawLine(spriteBatch, prevPoint, lastPoint, color); + + + spriteBatch.End(); + spriteBatch.GraphicsDevice.ScissorRectangle = prevScissorRect; + spriteBatch.Begin(SpriteSortMode.Deferred); + } + } + + // reflection apply + typeof(CharacterHealth).GetField("characterName", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(self, characterName); + } + + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_UpdateOxygenProjSpecific", + typeof(CharacterHealth).GetMethod("UpdateOxygenProjSpecific", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + // prevent heart sounds through low oxygen if neurotrauma is enabled + if(NeurotraumaEnabled) + { + if (CharacterHealth.OpenHealthWindow == null&& flatlineSoundChannel!=null) + { + flatlineSoundChannel.Dispose(); + flatlineSoundChannel = null; + } + return true; + } + return null; + }, LuaCsHook.HookMethodType.Before, this); + + // CreateRecommendedTreatments override + // sets the max amount of displayed treatments to 10 + const int maxDisplayedSuitableTreatments = 10; + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_CreateRecommendedTreatments", + typeof(CharacterHealth).GetMethod("CreateRecommendedTreatments", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + // get members + CharacterHealth selfHealth = (CharacterHealth)self; + GUIListBox recommendedTreatmentContainer = (GUIListBox)(typeof(CharacterHealth).GetField("recommendedTreatmentContainer", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + int selectedLimbIndex = (int)(typeof(CharacterHealth).GetField("selectedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + //GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconContainer", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + + // override begins + ItemPrefab prevHighlightedItem = null; + if (GUI.MouseOn?.UserData is ItemPrefab && recommendedTreatmentContainer.Content.IsParentOf(GUI.MouseOn)) + { + prevHighlightedItem = (ItemPrefab)GUI.MouseOn.UserData; + } + + recommendedTreatmentContainer.Content.ClearChildren(); + + float characterSkillLevel = Character.Controlled == null ? 0.0f : Character.Controlled.GetSkillLevel("medical"); + + //key = item identifier + //float = suitability + Dictionary treatmentSuitability = new Dictionary(); + selfHealth.GetSuitableTreatments(treatmentSuitability, + ignoreHiddenAfflictions: true, + limb: selectedLimbIndex == -1 ? null : selfHealth.Character.AnimController.Limbs.Find(l => l.HealthIndex == selectedLimbIndex), + user : Character.Controlled); + + foreach (Identifier treatment in treatmentSuitability.Keys.ToList()) + { + //prefer suggestions for items the player has + if (Character.Controlled.Inventory.FindItemByIdentifier(treatment, recursive: true) != null) + { + treatmentSuitability[treatment] *= 10.0f; + } + } + + if (!treatmentSuitability.Any()) + { + new GUITextBlock(new RectTransform(Vector2.One, recommendedTreatmentContainer.Content.RectTransform), TextManager.Get("none"), textAlignment: Alignment.Center) + { + CanBeFocused = false + }; + recommendedTreatmentContainer.ScrollBarVisible = false; + recommendedTreatmentContainer.AutoHideScrollBar = false; + } + else + { + recommendedTreatmentContainer.ScrollBarVisible = true; + recommendedTreatmentContainer.AutoHideScrollBar = true; + } + + List> treatmentSuitabilities = treatmentSuitability.OrderByDescending(t => t.Value).ToList(); + + int count = 0; + foreach (KeyValuePair treatment in treatmentSuitabilities) + { + if (treatment.Value < 0) { continue; } + count++; + if (count > maxDisplayedSuitableTreatments) { break; } + if (!(MapEntityPrefab.Find(name: null, identifier: treatment.Key, showErrorMessages: false) is ItemPrefab item)) { continue; } + + var itemSlot = new GUIFrame(new RectTransform(new Vector2(1.0f / (maxDisplayedSuitableTreatments+1.0f), 1.0f), recommendedTreatmentContainer.Content.RectTransform, Anchor.TopLeft), + style: null) + { + UserData = item + }; + + var innerFrame = new GUIButton(new RectTransform(Vector2.One, itemSlot.RectTransform, Anchor.Center, Pivot.Center, scaleBasis: ScaleBasis.Smallest), style: "SubtreeHeader") + { + UserData = item, + DisabledColor = Color.White * 0.1f, + OnClicked = (btn, userdata) => + { + if (!(userdata is ItemPrefab itemPrefab)) { return false; } + var item = Character.Controlled.Inventory.FindItem(it => it.Prefab == itemPrefab, recursive: true); + if (item == null) { return false; } + Limb targetLimb = selfHealth.Character.AnimController.Limbs.FirstOrDefault(l => l.HealthIndex == selectedLimbIndex); + item.ApplyTreatment(Character.Controlled, selfHealth.Character, targetLimb); + return true; + } + }; + + new GUIImage(new RectTransform(Vector2.One, innerFrame.RectTransform, Anchor.Center), style: "TalentBackgroundGlow") + { + CanBeFocused = false, + Color = GUIStyle.Green, + HoverColor = Color.White, + PressedColor = Color.DarkGray, + SelectedColor = Color.Transparent, + DisabledColor = Color.Transparent + }; + + Sprite itemSprite = item.InventoryIcon ?? item.Sprite; + Color itemColor = itemSprite == item.Sprite ? item.SpriteColor : item.InventoryIconColor; + var itemIcon = new GUIImage(new RectTransform(new Vector2(0.8f, 0.8f), innerFrame.RectTransform, Anchor.Center), + itemSprite, scaleToFit: true) + { + CanBeFocused = false, + Color = itemColor * 0.9f, + HoverColor = itemColor, + SelectedColor = itemColor, + DisabledColor = itemColor * 0.8f + }; + + if (item == prevHighlightedItem) + { + innerFrame.State = GUIComponent.ComponentState.Hover; + innerFrame.Children.ForEach(c => c.State = GUIComponent.ComponentState.Hover); + } + } + + recommendedTreatmentContainer.RecalculateChildren(); + + // got rid of this because it makes the afflictions spazz around + /*afflictionIconContainer.Content.RectTransform.SortChildren((r1, r2) => + { + var first = r1.GUIComponent.UserData as Affliction; + var second = r2.GUIComponent.UserData as Affliction; + int dmgPerSecond = Math.Sign(second.DamagePerSecond - first.DamagePerSecond); + return dmgPerSecond != 0 ? dmgPerSecond : Math.Sign(second.Strength - first.Strength); + });*/ + + if (count > 0) + { + var treatmentIconSize = recommendedTreatmentContainer.Content.Children.Sum(c => c.Rect.Width + recommendedTreatmentContainer.Spacing); + if (treatmentIconSize < recommendedTreatmentContainer.Content.Rect.Width) + { + var spacing = new GUIFrame(new RectTransform(new Point((recommendedTreatmentContainer.Content.Rect.Width - treatmentIconSize) / 2, 0), recommendedTreatmentContainer.Content.RectTransform), style: null) + { + CanBeFocused = false + }; + spacing.RectTransform.SetAsFirstChild(); + } + } + + return true; + }, LuaCsHook.HookMethodType.Before, this); + + // CreateAfflictionInfoElements override + // The method responsible for the little info box that appears when hovering over an affliction in the health interface + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_CreateAfflictionInfoElements", + typeof(CharacterHealth).GetMethod("CreateAfflictionInfoElements", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + // get arguments + GUIComponent parent = (GUIComponent)(args["parent"]); + Affliction affliction = (Affliction)(args["affliction"]); + + // get members + CharacterHealth selfHealth = (CharacterHealth)self; + //LocalizedString[] strengthTexts = (LocalizedString[])(typeof(CharacterHealth).GetField("strengthTexts", BindingFlags.NonPublic | BindingFlags.Static).GetValue(self)); + + // override begins + var labelContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.2f), parent.RectTransform), isHorizontal: true) + { + Stretch = true, + AbsoluteSpacing = 10, + UserData = "label", + CanBeFocused = false + }; + + var afflictionName = new GUITextBlock(new RectTransform(new Vector2(0.65f, 1.0f), labelContainer.RectTransform), affliction.Prefab.Name, textAlignment: Alignment.CenterLeft, font: GUIStyle.LargeFont) + { + CanBeFocused = false, + AutoScaleHorizontal = true + }; + var afflictionStrength = new GUITextBlock(new RectTransform(new Vector2(0.35f, 0.6f), labelContainer.RectTransform), "", textAlignment: Alignment.TopRight, font: GUIStyle.SubHeadingFont) + { + UserData = "strength", + CanBeFocused = false + }; + var vitality = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.4f), labelContainer.RectTransform, Anchor.BottomRight), "", textAlignment: Alignment.BottomRight) + { + Padding = afflictionStrength.Padding, + IgnoreLayoutGroups = true, + UserData = "vitality", + CanBeFocused = false + }; + + var description = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), parent.RectTransform), + affliction.Prefab.GetDescription( + affliction.Strength, + selfHealth.Character == Character.Controlled ? AfflictionPrefab.Description.TargetType.Self : AfflictionPrefab.Description.TargetType.OtherCharacter) + , textAlignment: Alignment.TopLeft, wrap: true) + { + CanBeFocused = false + }; + + if (description.Font.MeasureString(description.WrappedText).Y > description.Rect.Height) + { + description.Font = GUIStyle.SmallFont; + } + + Point nameDims = new Point(afflictionName.Rect.Width, (int)(GUIStyle.LargeFont.Size * 1.5f)); + + afflictionStrength.Text = affliction.GetStrengthText(); + + Vector2 strengthDims = GUIStyle.SubHeadingFont.MeasureString(afflictionStrength.Text); + + labelContainer.RectTransform.Resize(new Point(labelContainer.Rect.Width, nameDims.Y)); + afflictionName.RectTransform.Resize(new Point((int)(labelContainer.Rect.Width - strengthDims.X * 0.99f), nameDims.Y)); + afflictionStrength.RectTransform.Resize(new Point(labelContainer.Rect.Width - afflictionName.Rect.Width, nameDims.Y)); + + afflictionStrength.TextColor = Color.Lerp(GUIStyle.Orange, GUIStyle.Red, + affliction.Strength / affliction.Prefab.MaxStrength); + + description.RectTransform.Resize(new Point(description.Rect.Width, (int)(description.TextSize.Y + 10))); + + int vitalityDecrease = (int)affliction.GetVitalityDecrease(selfHealth); + if (vitalityDecrease == 0) + { + vitality.Visible = false; + } + else + { + vitality.Visible = true; + vitality.Text = TextManager.Get("Vitality") + " -" + vitalityDecrease; + vitality.TextColor = vitalityDecrease <= 0 ? GUIStyle.Green : + Color.Lerp(GUIStyle.Orange, GUIStyle.Red, affliction.Strength / affliction.Prefab.MaxStrength); + } + + vitality.AutoDraw = true; + + return true; + }, LuaCsHook.HookMethodType.Before, this); + + // DrawHealthWindow override + // makes it so more than the most severe affliction is displayed (like in legacy (good)) + // also responsible for the limbs color in the health interface + Vector2 limbGuyOffset = new Vector2(0, 0); + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_DrawHealthWindow", + typeof(CharacterHealth).GetMethod("DrawHealthWindow", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + // get arguments + SpriteBatch spriteBatch = (SpriteBatch)(args["spriteBatch"]); + Rectangle drawArea = (Rectangle)(args["drawArea"]); + bool allowHighlight = (bool)(args["allowHighlight"]); + + DrawHealthWindow(spriteBatch, drawArea, allowHighlight,self); + return true; + }, LuaCsHook.HookMethodType.Before, this); + void DrawHealthWindow(SpriteBatch spriteBatch, Rectangle drawArea, bool allowHighlight,object self) + { + #region Reflection crap + // get members + CharacterHealth selfHealth = (CharacterHealth)self; + ForceCustomized(selfHealth); + //LocalizedString[] strengthTexts = (LocalizedString[])(typeof(CharacterHealth).GetField("strengthTexts", BindingFlags.NonPublic | BindingFlags.Static).GetValue(self)); + List limbHealths = (List)(typeof(CharacterHealth).GetField("limbHealths", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + Dictionary afflictions = (Dictionary)(typeof(CharacterHealth).GetField("afflictions", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + SpriteSheet limbIndicatorOverlay = (SpriteSheet)(typeof(CharacterHealth).GetField("limbIndicatorOverlay", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + float limbIndicatorOverlayAnimState = (float)(typeof(CharacterHealth).GetField("limbIndicatorOverlayAnimState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + int highlightedLimbIndex = (int)(typeof(CharacterHealth).GetField("highlightedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + int selectedLimbIndex = (int)(typeof(CharacterHealth).GetField("selectedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + List afflictionsDisplayedOnLimb = (List)(typeof(CharacterHealth).GetField("afflictionsDisplayedOnLimb", BindingFlags.NonPublic | BindingFlags.Static).GetValue(self)); + GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + GUIListBox afflictionIconContainer2 = (GUIListBox)(afflictionIconContainer.Parent.GetChildByUserData("afflictionIconContainer2")); + #endregion + // override begins + + // clear heart graph if the open window changed + if (prevOpenHealthWindow!= CharacterHealth.OpenHealthWindow) + { + prevOpenHealthWindow = CharacterHealth.OpenHealthWindow; + if (NeurotraumaEnabled) + { + for (int j = 0; j < heartGraph.Length; j++) heartGraph[j] = 0; + heartGraphProgress = 0; + } + } + + if (selfHealth.Character.Removed) { return; } + + spriteBatch.End(); + spriteBatch.Begin(SpriteSortMode.Immediate, blendState: BlendState.NonPremultiplied, rasterizerState: GameMain.ScissorTestEnable, effect: GameMain.GameScreen.GradientEffect); + + int i = 0; + foreach (CharacterHealth.LimbHealth limbHealth in limbHealths) + { + if (limbHealth.IndicatorSprite == null) { continue; } + + Rectangle limbEffectiveArea = new Rectangle(limbHealth.IndicatorSprite.SourceRect.X + limbHealth.HighlightArea.X, + limbHealth.IndicatorSprite.SourceRect.Y + limbHealth.HighlightArea.Y, + limbHealth.HighlightArea.Width, + limbHealth.HighlightArea.Height); + + float totalDamage = GetTotalDamage(limbHealth, afflictions, selfHealth); + + //float negativeEffect = 0.0f, positiveEffect = 0.0f; + + List bottomcolors = new List(); + bottomcolors.Add(new object[] { Color.Gray/*new Color(50 / 255f, 66 / 255f, 168 / 255f)*/, 0.02f }); + List topcolors = new List(); + topcolors.Add(new object[] { Color.Gray/*new Color(50/255f, 66/255f, 168/255f)*/, 0.02f }); + + float topstrength = 0.02f; + float bottomstrength = 0.02f; + + foreach (KeyValuePair kvp in afflictions) + { + var affliction = kvp.Key; + if (affliction.Prefab.LimbSpecific) + { + if (kvp.Value != limbHealth) continue; + } + else + { + LimbType displayedType = LimbHealthToLimbType(limbHealth, limbHealths, selfHealth.Character.AnimController.Limbs); + if (NormalizeLimbType(affliction.Prefab.IndicatorLimb) != NormalizeLimbType(displayedType)) continue; + } + + if (!affliction.ShouldShowIcon(selfHealth.Character)) { continue; } + + float strength = MathHelper.Lerp(0.2f, 1, MathHelper.Clamp(affliction.Strength / affliction.Prefab.MaxStrength * 2, 0, 1)); + + if (affliction.Prefab.IsBuff) + { + topcolors.Add(new object[] { CharacterHealth.GetAfflictionIconColor(affliction), strength }); + topstrength += strength; + } + else + { + bottomcolors.Add(new object[] { CharacterHealth.GetAfflictionIconColor(affliction), strength }); + bottomstrength += strength; + } + } + + float midPoint = (float)(limbEffectiveArea.Center.Y - limbEffectiveArea.Height / 4) / (float)limbHealth.IndicatorSprite.Texture.Height; + float fadeDist = 0.3f * (float)limbEffectiveArea.Height / (float)limbHealth.IndicatorSprite.Texture.Height; + + Color color1 = topstrength < bottomstrength ? AverageColor(bottomcolors) : Color.Lerp(AverageColor(topcolors), AverageColor(bottomcolors), bottomstrength); + Color color2 = Color.Lerp(color1, AverageColor(topcolors), topstrength); + + GameMain.GameScreen.GradientEffect.Parameters["color1"].SetValue(color1.ToVector4()); + GameMain.GameScreen.GradientEffect.Parameters["color2"].SetValue(color2.ToVector4()); + GameMain.GameScreen.GradientEffect.Parameters["midPoint"].SetValue(midPoint); + GameMain.GameScreen.GradientEffect.Parameters["fadeDist"].SetValue(fadeDist); + + float scale = Math.Min(drawArea.Width / (float)limbHealth.IndicatorSprite.SourceRect.Width, drawArea.Height / (float)limbHealth.IndicatorSprite.SourceRect.Height); + + limbHealth.IndicatorSprite.Draw(spriteBatch, + drawArea.Center.ToVector2()+limbGuyOffset, Color.White, + limbHealth.IndicatorSprite.Origin, + 0, scale); + + if (GameMain.DebugDraw) + { + Rectangle highlightArea = GetLimbHighlightArea(limbHealth, drawArea,selfHealth); + + GUI.DrawRectangle(spriteBatch, highlightArea, Color.Red, false); + GUI.DrawRectangle(spriteBatch, drawArea, Color.Red, false); + } + + i++; + } + + spriteBatch.End(); + + spriteBatch.Begin(SpriteSortMode.Deferred, Barotrauma.Lights.CustomBlendStates.Multiplicative); + + if (limbIndicatorOverlay != null) + { + float overlayScale = Math.Min( + drawArea.Width / (float)limbIndicatorOverlay.FrameSize.X, + drawArea.Height / (float)limbIndicatorOverlay.FrameSize.Y); + + int frame; + int frameCount = 17; + if (limbIndicatorOverlayAnimState >= frameCount * 2) limbIndicatorOverlayAnimState = 0.0f; + if (limbIndicatorOverlayAnimState < frameCount) + { + frame = (int)limbIndicatorOverlayAnimState; + } + else + { + frame = frameCount - (int)(limbIndicatorOverlayAnimState - (frameCount - 1)); + } + + limbIndicatorOverlay.Draw(spriteBatch, frame, drawArea.Center.ToVector2()+ limbGuyOffset, Color.Gray, origin: limbIndicatorOverlay.FrameSize.ToVector2() / 2, rotate: 0.0f, + scale: Vector2.One * overlayScale); + } + + if (allowHighlight) + { + i = 0; + foreach (CharacterHealth.LimbHealth limbHealth in limbHealths) + { + if (limbHealth.HighlightSprite == null) { continue; } + + float scale = Math.Min(drawArea.Width / (float)limbHealth.HighlightSprite.SourceRect.Width, drawArea.Height / (float)limbHealth.HighlightSprite.SourceRect.Height); + + int drawCount = 0; + if (i == highlightedLimbIndex) { drawCount++; } + if (i == selectedLimbIndex) { drawCount++; } + for (int j = 0; j < drawCount; j++) + { + limbHealth.HighlightSprite.Draw(spriteBatch, + drawArea.Center.ToVector2()+limbGuyOffset, Color.White, + limbHealth.HighlightSprite.Origin, + 0, scale); + } + i++; + } + } + spriteBatch.End(); + spriteBatch.Begin(SpriteSortMode.Deferred, blendState: BlendState.NonPremultiplied, rasterizerState: GameMain.ScissorTestEnable); + + // drawing the preview icons on the limbs + i = 0; + foreach (CharacterHealth.LimbHealth limbHealth in limbHealths) + { + afflictionsDisplayedOnLimb.Clear(); + int negativecount = 0; + int positivecount = 0; + int undrawncount = 0; + foreach (var affliction in afflictions) + { + if (ShouldDisplayAfflictionOnLimb(affliction, limbHealth,selfHealth,limbHealths)) + { + if (affliction.Key.Prefab.IsBuff) + { + if (positivecount >= 4) { undrawncount++; continue; } + positivecount++; + } + else + { + if (negativecount >= 4) { undrawncount++; continue; } + negativecount++; + } + + afflictionsDisplayedOnLimb.Add(affliction.Key); + + } + } + + if (!afflictionsDisplayedOnLimb.Any()) { i++; continue; } + if (limbHealth.IndicatorSprite == null) { continue; } + + float scale = Math.Min(drawArea.Width / (float)limbHealth.IndicatorSprite.SourceRect.Width, drawArea.Height / (float)limbHealth.IndicatorSprite.SourceRect.Height); + + Rectangle highlightArea = GetLimbHighlightArea(limbHealth, drawArea,selfHealth); + + float iconScale = 0.25f * scale; + + int drawnPositve = 0; + int drawnNegative = 0; + foreach (Affliction affliction in afflictionsDisplayedOnLimb) + { + bool isBuff = affliction.Prefab.IsBuff; + Vector2 iconPos = highlightArea.Center.ToVector2(); + if (negativecount > 0 && positivecount > 0) + iconPos += new Vector2(10 * (isBuff ? 1 : -1), 0); + + float spacing = MathHelper.Clamp(40 / (Math.Max(negativecount, positivecount) / 1.5f), 10, 40); + + iconPos += new Vector2(0, spacing * ((isBuff ? drawnPositve : drawnNegative) - 0.5f * (Math.Max(negativecount, positivecount) - 1))); + + DrawLimbAfflictionIcon(spriteBatch, affliction, iconScale, ref iconPos); + + if (isBuff) drawnPositve++; + else drawnNegative++; + } + + // draw the "+x" if theres too many afflictions + if (undrawncount > 0) + { + string additionalAfflictionCount = $"+{undrawncount}"; + Vector2 displace = GUIStyle.SubHeadingFont.MeasureString(additionalAfflictionCount); + + Vector2 iconPos = highlightArea.Center.ToVector2(); + if (negativecount > 0 && positivecount > 0) + iconPos += new Vector2(10, 0); + + GUIStyle.SubHeadingFont.DrawString(spriteBatch, additionalAfflictionCount, iconPos + new Vector2(displace.X * 1.1f, -displace.Y * 0.45f), Color.Black * 0.75f); + GUIStyle.SubHeadingFont.DrawString(spriteBatch, additionalAfflictionCount, iconPos + new Vector2(displace.X, -displace.Y * 0.5f), Color.White); + } + + i++; + } + + if (selectedLimbIndex > -1 && (afflictionIconContainer.Content.CountChildren > 0 || afflictionIconContainer2.Content.CountChildren > 0)) + { + CharacterHealth.LimbHealth limbHealth = limbHealths[selectedLimbIndex]; + if (limbHealth?.IndicatorSprite != null) + { + var target = afflictionIconContainer.Content.CountChildren > 0 ? afflictionIconContainer : afflictionIconContainer2; + Rectangle selectedLimbArea = GetLimbHighlightArea(limbHealth, drawArea,selfHealth); + GUI.DrawLine(spriteBatch, + new Vector2(target.Rect.X, target.Rect.Y), + selectedLimbArea.Center.ToVector2(), + Color.LightGray * 0.5f, width: 4); + } + } + + if (NeurotraumaEnabled) + UpdateGraph(); + + void DrawLimbAfflictionIcon(SpriteBatch spriteBatch, Affliction affliction, float iconScale, ref Vector2 iconPos) + { + if (!affliction.ShouldShowIcon(selfHealth.Character) || affliction.Prefab.Icon == null) { return; } + Vector2 iconSize = affliction.Prefab.Icon.size * iconScale; + + float showIconThreshold = Character.Controlled?.CharacterHealth == selfHealth ? affliction.Prefab.ShowIconThreshold : affliction.Prefab.ShowIconToOthersThreshold; + + //afflictions that have a strength of less than 10 are faded out slightly + float alpha = MathHelper.Lerp(0.3f, 1.0f, + (affliction.Strength - showIconThreshold) / Math.Min(affliction.Prefab.MaxStrength - showIconThreshold, 10.0f)); + + affliction.Prefab.Icon.Draw(spriteBatch, iconPos - iconSize / 2.0f, CharacterHealth.GetAfflictionIconColor(affliction) * alpha, 0, iconScale); + iconPos += new Vector2(10.0f, 20.0f) * iconScale; + } + } + + bool ShouldDisplayAfflictionOnLimb(KeyValuePair kvp, CharacterHealth.LimbHealth limbHealth, CharacterHealth selfHealth, List limbHealths) + { + if (!kvp.Key.ShouldShowIcon(selfHealth.Character)) { return false; } + if (kvp.Value == limbHealth) + { + return true; + } + else if (kvp.Value == null) + { + Limb indicatorLimb = selfHealth.Character.AnimController.GetLimb(kvp.Key.Prefab.IndicatorLimb); + return indicatorLimb != null && indicatorLimb.HealthIndex == limbHealths.IndexOf(limbHealth); + } + return false; + } + + // CreateAfflictionInfos override + // makes it so the affliction descriptions are next to each other if buffs are present + // also makes them smaller so theres room for more of them + const int displayedAfflictionCountMax = 8; + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_CreateAfflictionInfos", + typeof(CharacterHealth).GetMethod("CreateAfflictionInfos", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + CreateAfflictionInfos(self, args); + return true; + }, LuaCsHook.HookMethodType.Before, this); + void CreateAfflictionInfos(object self, Dictionary args) + { + ForceCustomized((CharacterHealth)self); + + #region Reflection crap + // get arguments + IEnumerable afflictions = (IEnumerable)(args["afflictions"]); + // get members + GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + GUIListBox afflictionIconContainer2 = (GUIListBox)(afflictionIconContainer.Parent.GetChildByUserData("afflictionIconContainer2")); + List<(Affliction affliction, float strength)> displayedAfflictions = (List<(Affliction affliction, float strength)>)(typeof(CharacterHealth).GetField("displayedAfflictions", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + #endregion + // override begins + afflictionIconContainer.ClearChildren(); + afflictionIconContainer2.ClearChildren(); + displayedAfflictions.Clear(); + + afflictions = CharacterHealth.SortAfflictionsBySeverity(afflictions, false); + Affliction mostSevereAffliction = afflictions.FirstOrDefault(); + GUIButton buttonToSelect = null; + + foreach (Affliction affliction in afflictions) + { + displayedAfflictions.Add((affliction, affliction.Strength)); + + bool isBuff = affliction.Prefab.IsBuff; + var newParent = (isBuff ? afflictionIconContainer2 : afflictionIconContainer); + + var frame = new GUIButton(new RectTransform(new Vector2(1.0f, 1f / displayedAfflictionCountMax),newParent.Content.RectTransform), style: "ListBoxElement") + { + UserData = affliction, + OnClicked = SelectAffliction + }; + + new GUIFrame(new RectTransform(Vector2.One, frame.RectTransform), style: "GUIFrameListBox") { CanBeFocused = false }; + + // houses the progress bar + var content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.75f), frame.RectTransform, Anchor.Center), childAnchor: Anchor.CenterLeft) + { + Stretch = true, + CanBeFocused = false, + IsHorizontal = true + }; + // spacing + new GUIFrame(new RectTransform(new Vector2(0.1f, 1f), content.RectTransform), style: "GUIFrameListBox") { CanBeFocused = false }; + + // houses the affliction icon and text + var content2 = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.95f), frame.RectTransform, Anchor.Center), childAnchor: Anchor.CenterLeft) + { + Stretch = true, + CanBeFocused = false, + IsHorizontal = true + }; + + var progressbarBg = new GUIProgressBar(new RectTransform(new Vector2(0.5f, 1), content.RectTransform), 0.0f, GUIStyle.Green, style: "GUIAfflictionBar") + { + UserData = "afflictionstrengthprediction", + CanBeFocused = false, + IsHorizontal = true + }; + var afflictionStrengthBar = new GUIProgressBar(new RectTransform(Vector2.One, progressbarBg.RectTransform), 0.0f, Color.Transparent, showFrame: false, style: "GUIAfflictionBar") + { + UserData = "afflictionstrength", + CanBeFocused = false, + IsHorizontal = true + }; + afflictionStrengthBar.BarSize = affliction.Strength / affliction.Prefab.MaxStrength; + + //spacing + //new GUIFrame(new RectTransform(new Vector2(1.0f, 0.15f), content.RectTransform), style: null) { CanBeFocused = false }; + + if (affliction == mostSevereAffliction) + { + buttonToSelect = frame; + } + + var afflictionIcon = new GUIImage(new RectTransform(Vector2.One * 1f, content2.RectTransform, anchor: Anchor.CenterLeft, pivot: Pivot.CenterLeft, scaleBasis: ScaleBasis.BothHeight), affliction.Prefab.Icon, scaleToFit: true) + { + Color = CharacterHealth.GetAfflictionIconColor(affliction), + CanBeFocused = false + }; + afflictionIcon.PressedColor = afflictionIcon.Color; + afflictionIcon.HoverColor = Color.Lerp(afflictionIcon.Color, Color.White, 0.6f); + afflictionIcon.SelectedColor = Color.Lerp(afflictionIcon.Color, Color.White, 0.5f); + + var nameText = new GUITextBlock(new RectTransform(new Vector2(1.1f, 0.0f), content2.RectTransform), + $"{affliction.Prefab.Name}\n({Math.Round(affliction.Strength / affliction.Prefab.MaxStrength * 100)}% | {Math.Round(affliction.Strength)}/{Math.Round(affliction.Prefab.MaxStrength)})", font: GUIStyle.SmallFont, textAlignment: Alignment.CenterLeft) + { + UserData = "afflictionname", + CanBeFocused = false, + OutlineColor = Color.Black, + Shadow = true + }; + nameText.Text = ToolBox.LimitString(nameText.Text, nameText.Font, nameText.Rect.Width); + nameText.RectTransform.MinSize = new Point(0, (int)(nameText.TextSize.Y)); + nameText.RectTransform.SizeChanged += () => + { + nameText.Text = ToolBox.LimitString(nameText.Text, nameText.Font, nameText.Rect.Width); + }; + + content.Recalculate(); + content2.Recalculate(); + } + + buttonToSelect?.OnClicked(buttonToSelect, buttonToSelect.UserData); + afflictionIconContainer.RecalculateChildren(); + afflictionIconContainer.ForceLayoutRecalculation(); + afflictionIconContainer2.RecalculateChildren(); + afflictionIconContainer2.ForceLayoutRecalculation(); + + bool SelectAffliction(GUIButton button, object userData) + { + bool selected = button.Selected; + foreach (var child in afflictionIconContainer.Content.Children) + { + GUIButton btn = child.GetChild(); + if (btn != null) + { + btn.Selected = btn == button && !selected; + } + } + foreach (var child in afflictionIconContainer2.Content.Children) + { + GUIButton btn = child.GetChild(); + if (btn != null) + { + btn.Selected = btn == button && !selected; + } + } + + return false; + } + } + + // UpdateAfflictionContainer override + // got some custom double list crap going on here + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_UpdateAfflictionContainer", + typeof(CharacterHealth).GetMethod("UpdateAfflictionContainer", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + UpdateAfflictionContainer((CharacterHealth.LimbHealth)(args["selectedLimb"]), (CharacterHealth)self); + return true; + }, LuaCsHook.HookMethodType.Before, this); + void UpdateAfflictionContainer(CharacterHealth.LimbHealth selectedLimb,CharacterHealth selfHealth) + { + ForceCustomized(selfHealth); + GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + GUIListBox afflictionIconContainer2 = (GUIListBox)(afflictionIconContainer.Parent.GetChildByUserData("afflictionIconContainer2")); + List<(Affliction affliction, float strength)> displayedAfflictions = (List<(Affliction affliction, float strength)>)(typeof(CharacterHealth).GetField("displayedAfflictions", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + Dictionary afflictions = (Dictionary)(typeof(CharacterHealth).GetField("afflictions", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + CharacterHealth.LimbHealth currentDisplayedLimb = (CharacterHealth.LimbHealth)(typeof(CharacterHealth).GetField("currentDisplayedLimb", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + List limbHealths = (List)(typeof(CharacterHealth).GetField("limbHealths", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + + if (selectedLimb == null) + { + afflictionIconContainer.Content.ClearChildren(); + afflictionIconContainer2.Content.ClearChildren(); + return; + } + + if (afflictionsDirty() || selectedLimb != currentDisplayedLimb) + { + var currentAfflictions = afflictions.Where(a => ShouldDisplayAfflictionOnLimb(a, selectedLimb,selfHealth,limbHealths)).Select(a => a.Key); + Dictionary args = new Dictionary(); + args.Add("afflictions", currentAfflictions); + CreateAfflictionInfos(selfHealth, args); + CreateRecommendedTreatments(); + } + //update recommended treatments if the strength of some displayed affliction has changed by > 1 + else if (displayedAfflictions.Any(d => Math.Abs(d.strength - d.affliction.Strength) > 1.0f)) + { + CreateRecommendedTreatments(); + } + + bool afflictionsDirty() + { + //not displaying one of the current afflictions -> dirty + foreach (KeyValuePair kvp in afflictions) + { + if (!ShouldDisplayAfflictionOnLimb(kvp, selectedLimb,selfHealth,limbHealths)) { continue; } + if (!displayedAfflictions.Any(d => d.affliction == kvp.Key)) { return true; } + } + //displaying an affliction we no longer have -> dirty + foreach ((Affliction affliction, float strength) in displayedAfflictions) + { + if (!afflictions.Any(a => a.Key == affliction)) { return true; } + } + return false; + } + + void CreateRecommendedTreatments() + { + typeof(CharacterHealth).GetMethod("CreateRecommendedTreatments", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(selfHealth, null); + } + } + + // UpdateAfflictionInfos override + // makes it so the affliction progress bar is nicely colored + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_UpdateAfflictionInfos", + typeof(CharacterHealth).GetMethod("UpdateAfflictionInfos", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + try + { + #region Reflection crap + // get arguments + IEnumerable afflictions = (IEnumerable)(args["afflictions"]); + // get members + CharacterHealth selfHealth = (CharacterHealth)self; + ForceCustomized(selfHealth); + GUIListBox afflictionIconContainer = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionIconList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + GUIListBox afflictionIconContainer2 = (GUIListBox)(afflictionIconContainer.Parent.GetChildByUserData("afflictionIconContainer2")); + GUIListBox afflictionTooltip = (GUIListBox)(typeof(CharacterHealth).GetField("afflictionTooltip", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(self)); + //LocalizedString[] strengthTexts = (LocalizedString[])(typeof(CharacterHealth).GetField("strengthTexts", BindingFlags.NonPublic | BindingFlags.Static).GetValue(self)); + #endregion + // override begins + + var potentialTreatment = Inventory.DraggingItems.FirstOrDefault(); + if (potentialTreatment == null && GUI.MouseOn?.UserData is ItemPrefab itemPrefab) + { + potentialTreatment = Character.Controlled.Inventory.FindItem(it => it.Prefab == itemPrefab, recursive: true); + } + potentialTreatment ??= Inventory.SelectedSlot?.Item; + + foreach (Affliction affliction in afflictions) + { + float afflictionVitalityDecrease = affliction.GetVitalityDecrease(selfHealth); + Color afflictionEffectColor = Color.Lerp(CharacterHealth.GetAfflictionIconColor(affliction), Color.Black, 0.5f); + + bool isBuff = affliction.Prefab.IsBuff; + + var child = (isBuff ? afflictionIconContainer2 : afflictionIconContainer).Content.FindChild(affliction); + + var afflictionName = child.FindChild("afflictionname", true) as GUITextBlock; + afflictionName.Text = $"{affliction.Prefab.Name}\n({Math.Round(affliction.Strength / affliction.Prefab.MaxStrength * 100)}% | {Math.Round(affliction.Strength)}/{Math.Round(affliction.Prefab.MaxStrength)})"; + + var afflictionStrengthPredictionBar = child.FindChild("afflictionstrengthprediction", true) as GUIProgressBar; + afflictionStrengthPredictionBar.BarSize = 0.0f; + var afflictionStrengthBar = afflictionStrengthPredictionBar.GetChildByUserData("afflictionstrength") as GUIProgressBar; + afflictionStrengthBar.BarSize = MathHelper.Lerp(afflictionStrengthBar.BarSize, affliction.Strength / affliction.Prefab.MaxStrength, 0.1f); + afflictionStrengthBar.Color = afflictionEffectColor; + + float afflictionStrengthPrediction = GetAfflictionStrengthPrediction(potentialTreatment, affliction); + if (!MathUtils.NearlyEqual(afflictionStrengthPrediction, affliction.Strength)) + { + float t = (float)Math.Max(0.5f, (Math.Sin(Timing.TotalTime * 5) + 1.0f) / 2.0f); + if (afflictionStrengthPrediction < affliction.Strength) + { + afflictionStrengthBar.Color = afflictionEffectColor; + afflictionStrengthPredictionBar.Color = GUIStyle.Blue * t; + afflictionStrengthPredictionBar.BarSize = afflictionStrengthBar.BarSize; + afflictionStrengthBar.BarSize = afflictionStrengthPrediction / affliction.Prefab.MaxStrength; + } + else + { + afflictionStrengthPredictionBar.Color = Color.Red * t; + afflictionStrengthPredictionBar.BarSize = afflictionStrengthPrediction / affliction.Prefab.MaxStrength; + } + } + + if (afflictionTooltip != null && afflictionTooltip.UserData == affliction) + { + UpdateAfflictionInfo(afflictionTooltip.Content, affliction); + } + } + + void UpdateAfflictionInfo(GUIComponent parent, Affliction affliction) + { + var labelContainer = parent.GetChildByUserData("label"); + + var strengthText = labelContainer.GetChildByUserData("strength") as GUITextBlock; + + strengthText.Text = affliction.GetStrengthText(); + + strengthText.TextColor = Color.Lerp(GUIStyle.Orange, GUIStyle.Red, + affliction.Strength / affliction.Prefab.MaxStrength); + + var vitalityText = labelContainer.GetChildByUserData("vitality") as GUITextBlock; + int vitalityDecrease = (int)affliction.GetVitalityDecrease(selfHealth); + if (vitalityDecrease == 0) + { + vitalityText.Visible = false; + } + else + { + vitalityText.Visible = true; + vitalityText.Text = TextManager.Get("Vitality") + " -" + vitalityDecrease; + vitalityText.TextColor = vitalityDecrease <= 0 ? GUIStyle.Green : + Color.Lerp(GUIStyle.Orange, GUIStyle.Red, affliction.Strength / affliction.Prefab.MaxStrength); + } + } + + float GetAfflictionStrengthPrediction(Item item, Affliction affliction) + { + float strength = affliction.Strength; + if (item == null) { return strength; } + + foreach (ItemComponent ic in item.Components) + { + if (ic.statusEffectLists == null) { continue; } + if (!ic.statusEffectLists.TryGetValue(ActionType.OnUse, out List statusEffects)) { continue; } + foreach (StatusEffect effect in statusEffects) + { + foreach (var reduceAffliction in effect.ReduceAffliction) + { + if (reduceAffliction.AfflictionIdentifier != affliction.Identifier && reduceAffliction.AfflictionIdentifier != affliction.Prefab.AfflictionType) { continue; } + strength -= reduceAffliction.ReduceAmount * (effect.Duration > 0 ? effect.Duration : 1.0f); + } + foreach (var addAffliction in effect.Afflictions) + { + if (addAffliction.Prefab != affliction.Prefab) { continue; } + strength += addAffliction.Strength * (effect.Duration > 0 ? effect.Duration : 1.0f); + } + } + } + return strength; + } + + healthGUIRefreshTimer--; + if (healthGUIRefreshTimer <= 0) + { + healthGUIRefreshTimer = 60; + afflictionIconContainer.Content.RectTransform.SortChildren((r1, r2) => + { + var first = r1.GUIComponent.UserData as Affliction; + var second = r2.GUIComponent.UserData as Affliction; + return Math.Sign(second.Strength / second.Prefab.MaxStrength - first.Strength / first.Prefab.MaxStrength); + }); + afflictionIconContainer2.Content.RectTransform.SortChildren((r1, r2) => + { + var first = r1.GUIComponent.UserData as Affliction; + var second = r2.GUIComponent.UserData as Affliction; + return Math.Sign(second.Strength / second.Prefab.MaxStrength - first.Strength / first.Prefab.MaxStrength); + }); + } + + } + catch (Exception e) + { + LuaCsSetup.PrintCsMessage("shit. " + e); + } + + + + + return true; + }, LuaCsHook.HookMethodType.Before, this); + + // UpdateLimbIndicators override + // makes it so i can move the funny limb man + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_UpdateLimbIndicators", + typeof(CharacterHealth).GetMethod("UpdateLimbIndicators", BindingFlags.Instance | BindingFlags.NonPublic), + (object self, Dictionary args) => { + // get arguments + float deltaTime = (float)(args["deltaTime"]); + Rectangle drawArea = (Rectangle)(args["drawArea"]); + + CharacterHealth selfHealth = (CharacterHealth)self; + + UpdateLimbIndicators(deltaTime, drawArea, selfHealth); + + return true; + }, LuaCsHook.HookMethodType.Before, this); + void UpdateLimbIndicators(float deltaTime, Rectangle drawArea, CharacterHealth selfHealth) + { + // get members + float limbIndicatorOverlayAnimState = (float)(typeof(CharacterHealth).GetField("limbIndicatorOverlayAnimState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + int highlightedLimbIndex = (int)(typeof(CharacterHealth).GetField("highlightedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + int selectedLimbIndex = (int)(typeof(CharacterHealth).GetField("selectedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + List limbHealths = (List)(typeof(CharacterHealth).GetField("limbHealths", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selfHealth)); + // override begins + + if (!GameMain.Instance.Paused) + { + limbIndicatorOverlayAnimState += deltaTime * 8.0f; + // reflection apply + typeof(CharacterHealth).GetField("limbIndicatorOverlayAnimState", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(selfHealth, limbIndicatorOverlayAnimState); + } + + highlightedLimbIndex = -1; + int i = 0; + foreach (CharacterHealth.LimbHealth limbHealth in limbHealths) + { + if (limbHealth.IndicatorSprite == null) { continue; } + + float scale = Math.Min(drawArea.Width / (float)limbHealth.IndicatorSprite.SourceRect.Width, drawArea.Height / (float)limbHealth.IndicatorSprite.SourceRect.Height); + + Rectangle highlightArea = GetLimbHighlightArea(limbHealth, drawArea, selfHealth); + + if (highlightArea.Contains(PlayerInput.MousePosition)) + { + highlightedLimbIndex = i; + } + i++; + } + // reflection apply + typeof(CharacterHealth).GetField("highlightedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(selfHealth, highlightedLimbIndex); + + if (PlayerInput.PrimaryMouseButtonClicked() && highlightedLimbIndex > -1) + { + selectedLimbIndex = highlightedLimbIndex; + // reflection apply + typeof(CharacterHealth).GetField("selectedLimbIndex", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(selfHealth, selectedLimbIndex); + } + } + + // SortAfflictionsBySeverity override + // makes it so the afflictions dont spazz around + GameMain.LuaCs.Hook.HookMethod("BetterHealthUIMod_SortAfflictionsBySeverity", + typeof(CharacterHealth).GetMethod("SortAfflictionsBySeverity", BindingFlags.Static | BindingFlags.Public), + (object self, Dictionary args) => { + #region Reflection crap + // get arguments + IEnumerable afflictions = (IEnumerable)(args["afflictions"]); + bool excludeBuffs = (bool)(args["excludeBuffs"]); + #endregion + // override begins + return afflictions.Where(a => !excludeBuffs || !a.Prefab.IsBuff).OrderByDescending(a => a.Strength / a.Prefab.MaxStrength); + }, LuaCsHook.HookMethodType.Before, this); + + float GetTotalDamage(CharacterHealth.LimbHealth limbHealth, Dictionary afflictions,CharacterHealth self) + { + float totalDamage = 0.0f; + foreach (KeyValuePair kvp in afflictions) + { + if (kvp.Value != limbHealth) { continue; } + var affliction = kvp.Key; + totalDamage += affliction.GetVitalityDecrease(self); + } + return totalDamage; + } + + Rectangle GetLimbHighlightArea(CharacterHealth.LimbHealth limbHealth, Rectangle drawArea, CharacterHealth selfHealth) + { + float scale = Math.Min(drawArea.Width / (float)limbHealth.IndicatorSprite.SourceRect.Width, drawArea.Height / (float)limbHealth.IndicatorSprite.SourceRect.Height); + return new Rectangle( + (int)(drawArea.Center.X + limbGuyOffset.X - (limbHealth.IndicatorSprite.SourceRect.Width / 2 - limbHealth.HighlightArea.X) * scale), + (int)(drawArea.Center.Y + limbGuyOffset.Y - (limbHealth.IndicatorSprite.SourceRect.Height / 2 - limbHealth.HighlightArea.Y) * scale), + (int)(limbHealth.HighlightArea.Width * scale), + (int)(limbHealth.HighlightArea.Height * scale)); + } + + Color AverageColor(List colors) + { + float num = 0; + float r = 0; + float g = 0; + float b = 0; + + foreach (object[] colarr in colors) + { + Color col = (Color)colarr[0]; + float strength = (float)colarr[1]; + r += col.R * col.R * strength; + g += col.G * col.G * strength; + b += col.B * col.B * strength; + num += strength; + } + + return new Color((float)Math.Sqrt(r / num)/255f, (float)Math.Sqrt(g / num) / 255f, (float)Math.Sqrt(b / num) / 255f); + } + + LimbType NormalizeLimbType(LimbType type) + { + switch (type) + { + case LimbType.Waist: return LimbType.Torso; + case LimbType.LeftHand: + case LimbType.LeftForearm: + return LimbType.LeftArm; + case LimbType.RightHand: + case LimbType.RightForearm: + return LimbType.RightArm; + case LimbType.LeftFoot: + case LimbType.LeftThigh: + return LimbType.LeftLeg; + case LimbType.RightFoot: + case LimbType.RightThigh: + return LimbType.RightLeg; + } + + return type; + } + + LimbType LimbHealthToLimbType(CharacterHealth.LimbHealth limbHealth, List limbHealths, Limb[] Limbs) + { + int healthIndex = limbHealths.IndexOf(limbHealth); + Limb l = Limbs.Find(l => l.HealthIndex == healthIndex); + if (l == null) return LimbType.None; + return l.type; + } + + } + + // update heartrate monitor (Neurotrauma) + const int GraphSize = 256; + const float updateGraphInterval = 1 / 60f; // update at 60 fps + const float NormalHeartrate = 60; + const float MaxTachycardiaHeartrate = 180; + const float MaxFibrillationHeartrate = 300; + + private static float graphTimer = 0; + private static float[] heartGraph = new float[GraphSize]; + private static int heartGraphProgress = 0; + private static float timeSinceBeat = 0; + private static CCurve ecgCurve = null; + private static CCurve ecgCurveFib = null; + private static SoundChannel flatlineSoundChannel = null; + + private static void UpdateGraph() + { + const float deltaTime = 1 / 60f; + + graphTimer += deltaTime; + timeSinceBeat += deltaTime; + + if (graphTimer >= updateGraphInterval) + { + Character character = CharacterHealth.OpenHealthWindow?.Character; + UpdateHeartrateGraphData(heartGraph, GetHeartbeatAmplitude(character)+1); + + graphTimer = 0.0f; + } + } + private static float GetHeartbeatAmplitude(Character character) + { + if (character == null) return 0.0f; + + // Проверяем, отключен ли звук пульса в конфигурации или частота равна 0 + if (BetterHealthUIMod.DisableHeartbeatSound || character.IsDead) + { + // Останавливаем плоский звук, если он включен + if (flatlineSoundChannel != null) + { + flatlineSoundChannel.Dispose(); + flatlineSoundChannel = null; + } + return 0; + } + + (float rate, float stability) heartrate = GetHeartrate(character); + float chaos = MathHelper.Lerp(1, rnd.Next(0, 1000) / 1000f, Math.Min(1, (1 - heartrate.stability) * 2)); + + float timePerBeat = heartrate.rate > 0 + ? 1 / (heartrate.rate / 60 * (1 + (1 - heartrate.stability) * 2 * (rnd.Next(0, 1000) / 1000f))) + : float.PositiveInfinity; + + // Плоская линия, если частота сердцебиения равна 0 + if (heartrate.rate <= 0) + { + if (flatlineSoundChannel == null) + { + flatlineSoundChannel = SoundPlayer.PlaySound("flatline2", 0.06f); + if (flatlineSoundChannel != null) flatlineSoundChannel.Looping = true; + } + return 0; + } + + // Остановка звука плоской линии, если частота нормализовалась + if (flatlineSoundChannel != null) + { + flatlineSoundChannel.Dispose(); + flatlineSoundChannel = null; + } + + // Звук "бип" при каждом ударе сердца + if (timeSinceBeat > timePerBeat) + { + timeSinceBeat -= timePerBeat; + if (heartrate.rate > NormalHeartrate + 10 && rnd.Next(0, 1000) / 1000f < heartrate.stability) + { + SoundPlayer.PlaySound("ecg1", 0.1f * Math.Min((heartrate.rate - NormalHeartrate) / 80, 1)); + } + } + + return MathHelper.Lerp(ecgCurve.Evaluate(timeSinceBeat * 1.5f) * chaos, ecgCurveFib.Evaluate(timeSinceBeat * 1.5f), 1 - heartrate.stability); + } + + private static (float rate,float stability) GetHeartrate(Character character) + { + if (character == null || character.CharacterHealth==null || character.IsDead) return (0,0); + + float rate = NormalHeartrate; + float stability = 1; + + Affliction cardiacarrest = character.CharacterHealth.GetAffliction("cardiacarrest"); + + // return 0 rate and stability if in cardiac arrest + if (cardiacarrest != null && cardiacarrest.Strength >= 0.5f) return (0,0); + + Affliction tachycardia = character.CharacterHealth.GetAffliction("tachycardia"); + Affliction fibrillation = character.CharacterHealth.GetAffliction("fibrillation"); + + if (fibrillation!=null) + { + rate = MathHelper.Lerp(MaxTachycardiaHeartrate, MaxFibrillationHeartrate, fibrillation.Strength/100 * (0.25f+(rnd.Next(0, 1000) / 1000f))); + stability = 1 - fibrillation.Strength / 100; + } + else if (tachycardia != null) + { + rate = MathHelper.Lerp(NormalHeartrate, MaxTachycardiaHeartrate, tachycardia.Strength / 100); + } + + return (rate,stability); + } + + private static void UpdateHeartrateGraphData(IList graph, float newValue) + { + graph[heartGraphProgress] = newValue*0.8f; + heartGraphProgress = (heartGraphProgress + 1) % graph.Count; + } + } + + // i hate this + // trying to use the already existing curve class throws an error that its in two assemblies + // i dont know how to fix it so here comes the duplicate classes! + + public enum CCurveLoopType + { + Constant, + Cycle, + CycleOffset, + Oscillate, + Linear + } + + public enum CCurveContinuity + { + Smooth, + Step + } + + public enum CCurveTangent + { + Flat, + Linear, + Smooth + } + + public class CCurve + { + #region Private Fields + + private CCurveKeyCollection keys; + private CCurveLoopType postLoop; + private CCurveLoopType preLoop; + + #endregion Private Fields + + #region Public Properties + + public bool IsConstant + { + get { return keys.Count <= 1; } + } + + public CCurveKeyCollection Keys + { + get { return keys; } + } + + public CCurveLoopType PostLoop + { + get { return postLoop; } + set { postLoop = value; } + } + + public CCurveLoopType PreLoop + { + get { return preLoop; } + set { preLoop = value; } + } + + #endregion Public Properties + + #region Public Constructors + + public CCurve() + { + keys = new CCurveKeyCollection(); + } + + #endregion Public Constructors + + #region Public Methods + + public CCurve Clone() + { + CCurve curve = new CCurve(); + + curve.keys = keys.Clone(); + curve.preLoop = preLoop; + curve.postLoop = postLoop; + + return curve; + } + + public float Evaluate(float position) + { + CCurveKey first = keys[0]; + CCurveKey last = keys[keys.Count - 1]; + + if (position < first.Position) + { + switch (PreLoop) + { + case CCurveLoopType.Constant: + //constant + return first.Value; + + case CCurveLoopType.Linear: + // linear y = a*x +b with a tangeant of last point + return first.Value - first.TangentIn * (first.Position - position); + + case CCurveLoopType.Cycle: + //start -> end / start -> end + int cycle = GetNumberOfCycle(position); + float virtualPos = position - (cycle * (last.Position - first.Position)); + return GetCurvePosition(virtualPos); + + case CCurveLoopType.CycleOffset: + //make the curve continue (with no step) so must up the curve each cycle of delta(value) + cycle = GetNumberOfCycle(position); + virtualPos = position - (cycle * (last.Position - first.Position)); + return (GetCurvePosition(virtualPos) + cycle * (last.Value - first.Value)); + + case CCurveLoopType.Oscillate: + //go back on curve from end and target start + // start-> end / end -> start + cycle = GetNumberOfCycle(position); + if (0 == cycle % 2f) //if pair + virtualPos = position - (cycle * (last.Position - first.Position)); + else + virtualPos = last.Position - position + first.Position + + (cycle * (last.Position - first.Position)); + return GetCurvePosition(virtualPos); + } + } + else if (position > last.Position) + { + int cycle; + switch (PostLoop) + { + case CCurveLoopType.Constant: + //constant + return last.Value; + + case CCurveLoopType.Linear: + // linear y = a*x +b with a tangeant of last point + return last.Value + first.TangentOut * (position - last.Position); + + case CCurveLoopType.Cycle: + //start -> end / start -> end + cycle = GetNumberOfCycle(position); + float virtualPos = position - (cycle * (last.Position - first.Position)); + return GetCurvePosition(virtualPos); + + case CCurveLoopType.CycleOffset: + //make the curve continue (with no step) so must up the curve each cycle of delta(value) + cycle = GetNumberOfCycle(position); + virtualPos = position - (cycle * (last.Position - first.Position)); + return (GetCurvePosition(virtualPos) + cycle * (last.Value - first.Value)); + + case CCurveLoopType.Oscillate: + //go back on curve from end and target start + // start-> end / end -> start + cycle = GetNumberOfCycle(position); + virtualPos = position - (cycle * (last.Position - first.Position)); + if (0 == cycle % 2f) //if pair + virtualPos = position - (cycle * (last.Position - first.Position)); + else + virtualPos = last.Position - position + first.Position + + (cycle * (last.Position - first.Position)); + return GetCurvePosition(virtualPos); + } + } + + //in curve + return GetCurvePosition(position); + } + + #endregion Public Methods + + #region Private Methods + + private int GetNumberOfCycle(float position) + { + float cycle = (position - keys[0].Position) / (keys[keys.Count - 1].Position - keys[0].Position); + if (cycle < 0f) + cycle--; + return (int)cycle; + } + + private float GetCurvePosition(float position) + { + //only for position in curve + CCurveKey prev = keys[0]; + CCurveKey next; + for (int i = 1; i < keys.Count; i++) + { + next = Keys[i]; + if (next.Position >= position) + { + if (prev.Continuity == CCurveContinuity.Step) + { + if (position >= 1f) + { + return next.Value; + } + return prev.Value; + } + float t = (position - prev.Position) / (next.Position - prev.Position); //to have t in [0,1] + float ts = t * t; + float tss = ts * t; + //After a lot of search on internet I have found all about spline function + // and bezier (phi'sss ancien) but finaly use hermite curve + //http://en.wikipedia.org/wiki/Cubic_Hermite_spline + //P(t) = (2*t^3 - 3t^2 + 1)*P0 + (t^3 - 2t^2 + t)m0 + (-2t^3 + 3t^2)P1 + (t^3-t^2)m1 + //with P0.value = prev.value , m0 = prev.tangentOut, P1= next.value, m1 = next.TangentIn + return (2 * tss - 3 * ts + 1f) * prev.Value + (tss - 2 * ts + t) * prev.TangentOut + (3 * ts - 2 * tss) * next.Value + + (tss - ts) * next.TangentIn; + } + prev = next; + } + return 0f; + } + + #endregion + } + + public class CCurveKey : IEquatable, IComparable + { + #region Private Fields + + private CCurveContinuity continuity; + private float position; + private float tangentIn; + private float tangentOut; + private float value; + + #endregion Private Fields + + #region Properties + + public CCurveContinuity Continuity + { + get { return continuity; } + set { continuity = value; } + } + + public float Position + { + get { return position; } + } + + public float TangentIn + { + get { return tangentIn; } + set { tangentIn = value; } + } + + public float TangentOut + { + get { return tangentOut; } + set { tangentOut = value; } + } + + public float Value + { + get { return value; } + set { this.value = value; } + } + + #endregion + + #region Constructors + + public CCurveKey(float position, float value) + : this(position, value, 0, 0, CCurveContinuity.Smooth) + { + } + + public CCurveKey(float position, float value, float tangentIn, float tangentOut) + : this(position, value, tangentIn, tangentOut, CCurveContinuity.Smooth) + { + } + + public CCurveKey(float position, float value, float tangentIn, float tangentOut, CCurveContinuity continuity) + { + this.position = position; + this.value = value; + this.tangentIn = tangentIn; + this.tangentOut = tangentOut; + this.continuity = continuity; + } + + #endregion Constructors + + #region Public Methods + + #region IComparable Members + + public int CompareTo(CCurveKey other) + { + return position.CompareTo(other.position); + } + + #endregion + + #region IEquatable Members + + public bool Equals(CCurveKey other) + { + return (this == other); + } + + #endregion + + public static bool operator !=(CCurveKey a, CCurveKey b) + { + return !(a == b); + } + + public static bool operator ==(CCurveKey a, CCurveKey b) + { + if (Equals(a, null)) + return Equals(b, null); + + if (Equals(b, null)) + return Equals(a, null); + + return (a.position == b.position) + && (a.value == b.value) + && (a.tangentIn == b.tangentIn) + && (a.tangentOut == b.tangentOut) + && (a.continuity == b.continuity); + } + + public CCurveKey Clone() + { + return new CCurveKey(position, value, tangentIn, tangentOut, continuity); + } + + public override bool Equals(object obj) + { + return (obj is CCurveKey) ? ((CCurveKey)obj) == this : false; + } + + public override int GetHashCode() + { + return position.GetHashCode() ^ value.GetHashCode() ^ tangentIn.GetHashCode() ^ + tangentOut.GetHashCode() ^ continuity.GetHashCode(); + } + + #endregion + } + + public class CCurveKeyCollection + { + #region Private Fields + + private List innerlist; + private bool isReadOnly = false; + + #endregion Private Fields + + #region Properties + + public CCurveKey this[int index] + { + get { return innerlist[index]; } + set + { + if (value == null) + throw new ArgumentNullException(); + + if (index >= innerlist.Count) + throw new IndexOutOfRangeException(); + + if (innerlist[index].Position == value.Position) + innerlist[index] = value; + else + { + innerlist.RemoveAt(index); + innerlist.Add(value); + } + } + } + + public int Count + { + get { return innerlist.Count; } + } + + public bool IsReadOnly + { + get { return isReadOnly; } + } + + #endregion Properties + + #region Constructors + + public CCurveKeyCollection() + { + innerlist = new List(); + } + + #endregion Constructors + + #region Public Methods + + public void Add(CCurveKey item) + { + if (item == null) + throw new ArgumentNullException("Value cannot be null.", (Exception)null); + + if (innerlist.Count == 0) + { + innerlist.Add(item); + return; + } + + for (int i = 0; i < innerlist.Count; i++) + { + if (item.Position < innerlist[i].Position) + { + innerlist.Insert(i, item); + return; + } + } + + innerlist.Add(item); + } + + public void Clear() + { + innerlist.Clear(); + } + + public bool Contains(CCurveKey item) + { + return innerlist.Contains(item); + } + + public void CopyTo(CCurveKey[] array, int arrayIndex) + { + innerlist.CopyTo(array, arrayIndex); + } + + public IEnumerator GetEnumerator() + { + return innerlist.GetEnumerator(); + } + + public bool Remove(CCurveKey item) + { + return innerlist.Remove(item); + } + + + + public CCurveKeyCollection Clone() + { + CCurveKeyCollection ckc = new CCurveKeyCollection(); + foreach (CCurveKey key in innerlist) + ckc.Add(key); + return ckc; + } + + public int IndexOf(CCurveKey item) + { + return innerlist.IndexOf(item); + } + + public void RemoveAt(int index) + { + if (index != Count && index > -1) + innerlist.RemoveAt(index); + else + throw new ArgumentOutOfRangeException( + "Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index", + (Exception)null); + } + + #endregion Public Methods + } +} \ No newline at end of file diff --git a/BetterHealthUI (Updated)/CSharp/RunConfig.xml b/BetterHealthUI (Updated)/CSharp/RunConfig.xml new file mode 100644 index 0000000..7bdeb84 --- /dev/null +++ b/BetterHealthUI (Updated)/CSharp/RunConfig.xml @@ -0,0 +1,5 @@ + + + Standard + Forced + \ No newline at end of file diff --git a/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIConfig.xml b/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIConfig.xml new file mode 100644 index 0000000..97ea3b1 --- /dev/null +++ b/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIConfig.xml @@ -0,0 +1,5 @@ + + + false + false + \ No newline at end of file diff --git a/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIMod.cs b/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIMod.cs new file mode 100644 index 0000000..5d4f66b --- /dev/null +++ b/BetterHealthUI (Updated)/CSharp/Shared/BetterHealthUIMod.cs @@ -0,0 +1,93 @@ +using System; +using System.IO; +using System.Xml.Linq; +using Barotrauma; +using Barotrauma.Networking; + +namespace BetterHealthUI +{ + partial class BetterHealthUIMod : ACsMod + { + public static bool DisableHeartbeatSound { get; private set; } = false; + public static bool DisableHeartbeatBar { get; private set; } = false; + + private const string ConfigFolderName = "BHUConfig"; + private const string ConfigFileName = "BetterHealthUIConfig.xml"; + + public BetterHealthUIMod() + { + LuaCsSetup.PrintCsMessage("BetterHealthUIMod initialized."); + EnsureConfigExists(); + LoadConfig(); + #if CLIENT + InitClient(); + #endif + } + + private void EnsureConfigExists() + { + string gameDirectory = Directory.GetCurrentDirectory(); + string configFolderPath = Path.Combine(gameDirectory, ConfigFolderName); + string configFilePath = Path.Combine(configFolderPath, ConfigFileName); + + if (!Directory.Exists(configFolderPath)) + { + Directory.CreateDirectory(configFolderPath); + LuaCsSetup.PrintCsMessage($"Created config folder at: {configFolderPath}"); + } + + if (!File.Exists(configFilePath)) + { + XDocument defaultConfig = new XDocument( + new XElement("Config", + new XElement("DisableHeartbeatSound", false), + new XElement("DisableHeartbeatBar", false) + ) + ); + + defaultConfig.Save(configFilePath); + LuaCsSetup.PrintCsMessage($"Created default config file at: {configFilePath}"); + } + } + + private void LoadConfig() + { + string gameDirectory = Directory.GetCurrentDirectory(); + string configFilePath = Path.Combine(gameDirectory, ConfigFolderName, ConfigFileName); + + if (!File.Exists(configFilePath)) + { + LuaCsSetup.PrintCsMessage($"Config file not found: {configFilePath}"); + return; + } + + try + { + var doc = XDocument.Load(configFilePath); + var root = doc.Root; + if (root == null) + { + LuaCsSetup.PrintCsMessage("Config file has no root element."); + return; + } + + bool.TryParse(root.Element("DisableHeartbeatSound")?.Value, out bool disableSound); + bool.TryParse(root.Element("DisableHeartbeatBar")?.Value, out bool disableBar); + + DisableHeartbeatSound = disableSound; + DisableHeartbeatBar = disableBar; + + LuaCsSetup.PrintCsMessage($"Config loaded: DisableHeartbeatSound={disableSound}, DisableHeartbeatBar={disableBar}"); + } + catch (Exception ex) + { + LuaCsSetup.PrintCsMessage($"Error loading config file: {ex.Message}"); + } + } + + public override void Stop() + { + LuaCsSetup.PrintCsMessage("BetterHealthUIMod stopped."); + } + } +} diff --git a/BetterHealthUI (Updated)/filelist.xml b/BetterHealthUI (Updated)/filelist.xml new file mode 100644 index 0000000..77f51e2 --- /dev/null +++ b/BetterHealthUI (Updated)/filelist.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Blueprints/Lua/Autorun/init.lua b/Blueprints/Lua/Autorun/init.lua new file mode 100644 index 0000000..b106a56 --- /dev/null +++ b/Blueprints/Lua/Autorun/init.lua @@ -0,0 +1,47 @@ +--this is the entry point for the code. This runs all other scripts. + +--get the local path and save it as a global. only autorun files can get the path in this way! +blue_prints = {} +blue_prints.path = ... +-- Always use forward slashes internally, both Windows and Linux can handle this +blue_prints.path = blue_prints.path and blue_prints.path:gsub("\\", "/") or "" + +-- Set up save path - will be normalized in read_write.lua functions +blue_prints.save_path = "LocalMods/Blueprints_saved_blueprints" + +blue_prints.most_recent_circuitbox = nil +blue_prints.time_delay_between_loops = 150 +blue_prints.component_batch_size = 10 +blue_prints.current_gui_page = nil +blue_prints.most_recently_used_blueprint_name = nil +blue_prints.most_recent_folder = "[Root Directory]" -- Default to root directory +blue_prints.unit_tests_enabled = false + +dofile(blue_prints.path .. "/Lua/gui/cs_required_warning.lua") + +if CSActive then --CSActive is if csharp scripts are enabled. This mod requires them. + --setup + dofile(blue_prints.path .. "/Lua/register_types.lua") + dofile(blue_prints.path .. "/Lua/utilities/read_write.lua") -- Load read_write before first_time_setup + dofile(blue_prints.path .. "/Lua/first_time_setup.lua") + + --utilities + dofile(blue_prints.path .. "/Lua/utilities/utilities.lua") + dofile(blue_prints.path .. "/Lua/utilities/safety_checks.lua") + + --core logic + dofile(blue_prints.path .. "/Lua/save_blueprint.lua") + dofile(blue_prints.path .. "/Lua/load_blueprint.lua") + dofile(blue_prints.path .. "/Lua/delete_blueprint.lua") + dofile(blue_prints.path .. "/Lua/commands.lua") + dofile(blue_prints.path .. "/Lua/unit_tests.lua") + + --gui + dofile(blue_prints.path .. "/Lua/gui/gui_buttons_frame.lua") + dofile(blue_prints.path .. "/Lua/gui/load_gui.lua") + dofile(blue_prints.path .. "/Lua/gui/save_gui.lua") + dofile(blue_prints.path .. "/Lua/gui/clear_gui.lua") + dofile(blue_prints.path .. "/Lua/gui/delay_slider.lua") + dofile(blue_prints.path .. "/Lua/gui/popup_gui.lua") + --dofile(blue_prints.path .. "/Lua/gui/custom_gui_example.lua") +end \ No newline at end of file diff --git a/Blueprints/Lua/commands.lua b/Blueprints/Lua/commands.lua new file mode 100644 index 0000000..32cf2db --- /dev/null +++ b/Blueprints/Lua/commands.lua @@ -0,0 +1,115 @@ +if SERVER then return end --prevents it from running on the server + + +local configDescriptions = {} +configDescriptions["commands"] = "you can use blueprints or bp" +configDescriptions["load"] = "load a blueprint. EX: bp load reactor_controller" +configDescriptions["save"] = "save a blueprint. EX: bp save reactor_controller" +configDescriptions["need"] = "get requirements for a blueprint. EX: bp need reactor_controller" +configDescriptions["delete"] = "delete a blueprint. EX: bp delete reactor_controller" +configDescriptions["list"] = "list all saved files. EX: bp list" +configDescriptions["toggle"] = "toggle things on and off. EX: bp toggle tests" +configDescriptions["clear"] = "Remove all components and labels from a circuitbox. EX: bp clear" + + + +local function checkStringAgainstTags(targetString, tags) --this is needed to run the command line args + for tag, _ in pairs(tags) do + if targetString == tag then + return true -- Match found + end + end + return false -- No match found +end + + + + +local function runCommand(command) + if command[1] == nil or command[1] == "help" or command[1] == "commands" then + for key, value in pairs(configDescriptions) do + print(key .. ": " .. value) + end + end + + + if command[1] == "load" then + if command[2] ~= nil then + print("Attempting to build blueprint") + blue_prints.construct_blueprint(command[2]) + else + print("No filename given. EX: bp load file_name.txt") + end + end + + + if command[1] == "save" then + if command[2] ~= nil then + print("Attempting to save blueprint") + blue_prints.save_blueprint(command[2]) + else + print("No filename given. EX: bp save file_name.txt") + end + end + + if command[1] == "need" then + if command[2] ~= nil then + print("Attempting to get blueprint requirements") + blue_prints.print_requirements_of_circuit(command[2]) + blue_prints.check_what_is_needed_for_blueprint(command[2]) + else + print("No filename given. EX: bp need file_name.txt") + end + end + + if command[1] == "delete" then + if command[2] ~= nil then + print("Attempting to delete blueprint") + blue_prints.delete_blueprint(command[2]) + else + print("No filename given. EX: bp delete file_name.txt") + end + end + + if command[1] == "clear" then + blue_prints.clear_circuitbox() + end + + if command[1] == "list" then + blue_prints.print_all_saved_files() + end + + if command[1] == "unit_tests" then + blue_prints.unit_tests_enabled = true + blue_prints.unit_test_all_blueprint_files() + end + + if command[1] == "toggle" then + if command[2] == "tests" then + blue_prints.unit_tests_enabled = not blue_prints.unit_tests_enabled + print("tests enabled: " .. tostring(blue_prints.unit_tests_enabled)) + end + end + + + if checkStringAgainstTags(command[1], configDescriptions) then + --print("Match found!") + else + print("Command not recognized. type bp to see available commands.") + end + +end + +Game.AddCommand("blueprints", "configures blueprints", function (command) + runCommand(command) +end) + + +Game.AddCommand("bp", "configures blueprints abbreviated", function (command) + runCommand(command) +end) + + + + + diff --git a/Blueprints/Lua/delete_blueprint.lua b/Blueprints/Lua/delete_blueprint.lua new file mode 100644 index 0000000..8425fb6 --- /dev/null +++ b/Blueprints/Lua/delete_blueprint.lua @@ -0,0 +1,31 @@ +if SERVER then return end --prevents it from running on the server + +function blue_prints.delete_blueprint(provided_path) + -- Check if the filename already ends with .txt + if not string.match(provided_path, "%.txt$") then + -- Add .txt if it's not already present + provided_path = provided_path .. ".txt" + end + + local file_path = blue_prints.normalizePath(blue_prints.save_path .. "/" .. provided_path) + + if File.Exists(file_path) then + local success = blue_prints.safeFileOperation(os.remove, file_path) + if success then + print("File deleted successfully.") + else + -- Try alternate path if first attempt fails + local alt_path = file_path:gsub("LocalMods/", "local_mods/") + success = blue_prints.safeFileOperation(os.remove, alt_path) + if success then + print("File deleted successfully.") + else + print("Error deleting file") + end + end + else + print("file not found") + print("saved designs:") + blue_prints.print_all_saved_files() + end +end \ No newline at end of file diff --git a/Blueprints/Lua/first_time_setup.lua b/Blueprints/Lua/first_time_setup.lua new file mode 100644 index 0000000..7b7a29d --- /dev/null +++ b/Blueprints/Lua/first_time_setup.lua @@ -0,0 +1,81 @@ +if SERVER then return end --prevents it from running on the server + +-- Function to write text to a file +local function writeFile(path, text) + return blue_prints.writeFile(path, text) +end + +-- Recursively copy a directory structure +local function copy_directory_structure(source, destination) + -- Normalize paths + source = blue_prints.normalizePath(source) + destination = blue_prints.normalizePath(destination) + + -- Ensure destination exists + if not blue_prints.createFolder(destination) then + print("Failed to create destination directory: " .. destination) + return false + end + + -- Get all files and directories using our safe functions + local files = blue_prints.getFiles(source) + local directories = blue_prints.getDirectories(source) + + -- Copy files + for _, filepath in pairs(files) do + if string.match(filepath, "%.txt$") then + local filename = filepath:match("([^/\\]+)$") + local file_content = blue_prints.readFileContents(filepath) + if file_content then + local dest_path = blue_prints.normalizePath(destination .. "/" .. filename) + if not File.Exists(dest_path) then + writeFile(dest_path, file_content) + end + end + end + end + + -- Recursively copy subdirectories + for _, dir in pairs(directories) do + local dir_name = dir:match("([^/\\]+)$") + if dir_name then + local source_subdir = blue_prints.normalizePath(source .. "/" .. dir_name) + local dest_subdir = blue_prints.normalizePath(destination .. "/" .. dir_name) + copy_directory_structure(source_subdir, dest_subdir) + end + end + + return true +end + +-- Create base directory first +if not blue_prints.ensureBaseDirectory() then + print("Failed to create blueprint directory") + return nil +end + +-- Check if this is first run by looking for existing content +local existing_files = blue_prints.getFiles(blue_prints.save_path) +local existing_dirs = blue_prints.getDirectories(blue_prints.save_path) +local is_first_run = #existing_files == 0 and #existing_dirs == 0 + +if is_first_run then + -- Look for starter_blueprints directory + local starter_blueprints_path = blue_prints.normalizePath(blue_prints.path .. "/starter_blueprints") + if File.DirectoryExists(starter_blueprints_path) then + -- Copy the entire directory structure + if copy_directory_structure(starter_blueprints_path, blue_prints.save_path) then + print("Successfully copied starter blueprints") + else + print("Failed to copy starter blueprints") + end + else + print("No starter_blueprints directory found at: " .. starter_blueprints_path) + -- Create default folders if no starter blueprints exist + local defaultFolders = {"General", "Reactor", "Navigation", "Weapons", "Medical"} + for _, folder in ipairs(defaultFolders) do + local folderPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folder) + blue_prints.createFolder(folderPath) + end + end +end \ No newline at end of file diff --git a/Blueprints/Lua/gui/clear_gui.lua b/Blueprints/Lua/gui/clear_gui.lua new file mode 100644 index 0000000..040d020 --- /dev/null +++ b/Blueprints/Lua/gui/clear_gui.lua @@ -0,0 +1,54 @@ +if SERVER then return end -- we don't want server to run GUI code. + +local resolution = blue_prints.getScreenResolution() +local run_once_at_start = false + +local function check_and_rebuild_frame() + local new_resolution = blue_prints.getScreenResolution() + if new_resolution ~= resolution or run_once_at_start == false then + + local spacer = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.04), blue_prints.gui_button_frame_list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), blue_prints.gui_button_frame_list.Content.RectTransform), "Clear Circuitbox", GUI.Alignment.Center, "GUIButtonSmall") + + button.OnClicked = function () + + local message_box = GUI.MessageBox('Are you sure you want to clear the box?', 'This will remove all components, labels and wires.', {'Cancel', 'Clear Box'}) + + local cancel_button = nil + local clear_button = nil + + if message_box.Buttons[0] == nil then --this is if no one has registered it. If some other mod registers it I dont want it to break. + cancel_button = message_box.Buttons[1] + clear_button = message_box.Buttons[2] + else --if its been registered, it will behave as a csharp table + cancel_button = message_box.Buttons[0] + clear_button = message_box.Buttons[1] + end + + clear_button.Color = Color(160, 160, 255) -- Base color (more blue) + clear_button.HoverColor = Color(190, 190, 255) -- Lighter blue when hovering + + cancel_button.OnClicked = function () + message_box.Close() + end + + clear_button.OnClicked = function () + blue_prints.clear_circuitbox() + GUI.AddMessage('Circuitbox Cleared', Color.White) + message_box.Close() + end + + + + end + + resolution = new_resolution + run_once_at_start = true + end +end + + +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function() + check_and_rebuild_frame() +end, Hook.HookMethodType.After) diff --git a/Blueprints/Lua/gui/cs_required_warning.lua b/Blueprints/Lua/gui/cs_required_warning.lua new file mode 100644 index 0000000..0deb1c0 --- /dev/null +++ b/Blueprints/Lua/gui/cs_required_warning.lua @@ -0,0 +1,43 @@ +if SERVER then return end -- we don't want server to run GUI code. + +if CSActive then return end -- dont show the warning if CS is on + +-- our main frame where we will put our custom GUI +local frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) +frame.CanBeFocused = false + +-- popup frame +local popup = GUI.Frame(GUI.RectTransform(Vector2(1, 1), frame.RectTransform, GUI.Anchor.Center), nil) +popup.CanBeFocused = false +popup.Visible = true + +local popupContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), popup.RectTransform, GUI.Anchor.Center)) +local popupList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), popupContent.RectTransform, GUI.Anchor.BottomCenter)) + +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.15), popupList.Content.RectTransform), "WARNING", nil, nil, GUI.Alignment.Center) +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), popupList.Content.RectTransform), "You are using Blueprints without enabling csharp scripting.", nil, nil, GUI.Alignment.Center) +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), popupList.Content.RectTransform), 'Go to the main menu. (which has singleplayer, multiplayer, etc)', nil, nil, GUI.Alignment.Center) +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), popupList.Content.RectTransform), 'In the main menu, click the "Open LuaCs Settings" button in the top left.', nil, nil, GUI.Alignment.Center) +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), popupList.Content.RectTransform), 'Then hit the "enable csharp scripting" check box.', nil, nil, GUI.Alignment.Center) +local coloredText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.10), popupList.Content.RectTransform), "Blueprints will not function without this.", nil, nil, GUI.Alignment.Center) +coloredText.TextColor = Color(255, 0, 0) --red + +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.10), popupList.Content.RectTransform), '', nil, nil, GUI.Alignment.Center) + +local closeButton = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), popupList.Content.RectTransform), "Close", GUI.Alignment.Center, "GUIButtonSmall") +closeButton.OnClicked = function () + popup.Visible = not popup.Visible +end + + +Hook.Patch("Barotrauma.GameScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) + +Hook.Patch("Barotrauma.NetLobbyScreen", "AddToGUIUpdateList", function(self, ptable) + frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) + +Hook.Patch("Barotrauma.SubEditorScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) \ No newline at end of file diff --git a/Blueprints/Lua/gui/custom_gui_example.lua b/Blueprints/Lua/gui/custom_gui_example.lua new file mode 100644 index 0000000..bd47dc6 --- /dev/null +++ b/Blueprints/Lua/gui/custom_gui_example.lua @@ -0,0 +1,108 @@ +--[[ + This example shows how to create a basic custom GUI. The GUI will appear top right of your in game screen. +--]] + +if SERVER then return end -- we don't want server to run GUI code. + +local modPath = ... + +-- our main frame where we will put our custom GUI +local frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) +frame.CanBeFocused = false + +-- menu frame +local menu = GUI.Frame(GUI.RectTransform(Vector2(1, 1), frame.RectTransform, GUI.Anchor.Center), nil) +menu.CanBeFocused = false +menu.Visible = false + +-- put a button that goes behind the menu content, so we can close it when we click outside +local closeButton = GUI.Button(GUI.RectTransform(Vector2(1, 1), menu.RectTransform, GUI.Anchor.Center), "", GUI.Alignment.Center, nil) +closeButton.OnClicked = function () + menu.Visible = not menu.Visible +end + +-- a button top right of our screen to open a sub-frame menu +local button = GUI.Button(GUI.RectTransform(Vector2(0.2, 0.2), frame.RectTransform, GUI.Anchor.TopRight), "Custom GUI Example", GUI.Alignment.Center, "GUIButtonSmall") +button.RectTransform.AbsoluteOffset = Point(25, 200) +button.OnClicked = function () + menu.Visible = not menu.Visible +end + +local menuContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), menu.RectTransform, GUI.Anchor.Center)) +local menuList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), menuContent.RectTransform, GUI.Anchor.BottomCenter)) + +GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), "This is a sample text!", nil, nil, GUI.Alignment.Center) + +for i = 1, 10, 1 do + local coloredText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.025), menuList.Content.RectTransform), "This is some colored text!", nil, nil, GUI.Alignment.Center) + coloredText.TextColor = Color(math.random(0, 255), math.random(0, 255), math.random(0, 255)) +end + +local textBox = GUI.TextBox(GUI.RectTransform(Vector2(1, 0.2), menuList.Content.RectTransform), "This is a text box") +textBox.OnTextChangedDelegate = function (textBox) + print(textBox.Text) +end + +local tickBox = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), menuList.Content.RectTransform), "This is a tick box") +tickBox.Selected = true +tickBox.OnSelected = function () + print(tickBox.Selected) +end + +local numberInput = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), NumberType.Float) +numberInput.MinValueFloat = 0 +numberInput.MaxValueFloat = 1000 +numberInput.valueStep = 1 +numberInput.OnValueChanged = function () + print(numberInput.FloatValue) +end + +local scrollBar = GUI.ScrollBar(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), 0.1, nil, "GUISlider") +scrollBar.Range = Vector2(0, 100) +scrollBar.BarScrollValue = 50 +scrollBar.OnMoved = function () + print(scrollBar.BarScrollValue) +end + +local someButton = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), "This is a button", GUI.Alignment.Center, "GUIButtonSmall") +someButton.OnClicked = function () + print("button") +end + +local dropDown = GUI.DropDown(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), "This is a dropdown", 3, nil, false) +dropDown.AddItem("First Item", 0) +dropDown.AddItem("Second Item", 1) +dropDown.AddItem("Third Item", 2) +dropDown.OnSelected = function (guiComponent, object) + print(object) +end + +local multiDropDown = GUI.DropDown(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), "This is a multi-dropdown", 3, nil, true) +multiDropDown.AddItem("First Item", 0) +multiDropDown.AddItem("Second Item", 1) +multiDropDown.AddItem("Third Item", 2) +multiDropDown.OnSelected = function (guiComponent, object) + for value in multiDropDown.SelectedDataMultiple do + print(value) + end +end + +local imageFrame = GUI.Frame(GUI.RectTransform(Point(65, 65), menuList.Content.RectTransform), "GUITextBox") +imageFrame.RectTransform.MinSize = Point(0, 65) +local sprite = ItemPrefab.GetItemPrefab("bandage").InventoryIcon +local image = GUI.Image(GUI.RectTransform(Vector2(1, 1), imageFrame.RectTransform, GUI.Anchor.Center), sprite) +image.ToolTip = "Bandages are pretty cool" + + +local customImageFrame = GUI.Frame(GUI.RectTransform(Point(128, 128), menuList.Content.RectTransform), "GUITextBox") +customImageFrame.RectTransform.MinSize = Point(138, 138) +--local customSprite = Sprite(modPath .. "/luasmall.png") +GUI.Image(GUI.RectTransform(Point(65, 65), customImageFrame.RectTransform, GUI.Anchor.Center), customSprite) + +Hook.Patch("Barotrauma.GameScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() +end) + +Hook.Patch("Barotrauma.SubEditorScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() +end) \ No newline at end of file diff --git a/Blueprints/Lua/gui/delay_slider.lua b/Blueprints/Lua/gui/delay_slider.lua new file mode 100644 index 0000000..c29cae4 --- /dev/null +++ b/Blueprints/Lua/gui/delay_slider.lua @@ -0,0 +1,37 @@ +if SERVER then return end + +local resolution = blue_prints.getScreenResolution() +local run_once_at_start = false + +local function check_and_rebuild_frame() + local new_resolution = blue_prints.getScreenResolution() + if new_resolution ~= resolution or run_once_at_start == false then + + local spacer = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), blue_prints.gui_button_frame_list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + + -- Create the label + local label = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), blue_prints.gui_button_frame_list.Content.RectTransform), "Load/Clear Delay", nil, nil, GUI.Alignment.Center) + + local scrollBar = GUI.ScrollBar(GUI.RectTransform(Vector2(1, 0.1), blue_prints.gui_button_frame_list.Content.RectTransform), 0.1, nil, "GUISlider") + + scrollBar.Range = Vector2(150, 1000) + + if run_once_at_start == false then + scrollBar.BarScrollValue = blue_prints.time_delay_between_loops + run_once_at_start = true + end + + scrollBar.OnMoved = function () + local truncatedValue = math.floor(scrollBar.BarScrollValue) -- Truncate to nearest integer + scrollBar.ToolTip = "Delay for loading. Increase on laggier servers. Current Value: " .. truncatedValue .. "ms" + --print(truncatedValue) + blue_prints.time_delay_between_loops = truncatedValue + end + + resolution = new_resolution + end +end + +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function() + check_and_rebuild_frame() +end, Hook.HookMethodType.After) diff --git a/Blueprints/Lua/gui/gui_buttons_frame.lua b/Blueprints/Lua/gui/gui_buttons_frame.lua new file mode 100644 index 0000000..321ce49 --- /dev/null +++ b/Blueprints/Lua/gui/gui_buttons_frame.lua @@ -0,0 +1,33 @@ +if SERVER then return end -- we don't want server to run GUI code. + +local resolution = blue_prints.getScreenResolution() +local run_once_at_start = false + +--gui frame to hold the UI buttons that open the various GUIs +blue_prints.gui_button_frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) +blue_prints.gui_button_frame.CanBeFocused = false +blue_prints.gui_button_frame.Visible = true + +--this is needed to handle different resolutions +local function check_and_rebuild_frame() + local new_resolution = blue_prints.getScreenResolution() + if new_resolution ~= resolution or run_once_at_start == false then + blue_prints.gui_button_frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) + blue_prints.gui_button_frame.CanBeFocused = false + + blue_prints.gui_button_frame_content = GUI.Frame(GUI.RectTransform(Vector2(0.1, 0.15), blue_prints.gui_button_frame.RectTransform, GUI.Anchor.CenterRight)) + blue_prints.gui_button_frame_list = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), blue_prints.gui_button_frame_content.RectTransform, GUI.Anchor.BottomCenter)) + + local spacer = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.04), blue_prints.gui_button_frame_list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local title = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), blue_prints.gui_button_frame_list.Content.RectTransform), "Blueprints", nil, nil, GUI.Alignment.Center) + title.TextColor = Color(180, 180, 255) + + resolution = new_resolution + run_once_at_start = true + end +end + +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function() + check_and_rebuild_frame() + blue_prints.gui_button_frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) diff --git a/Blueprints/Lua/gui/load_gui.lua b/Blueprints/Lua/gui/load_gui.lua new file mode 100644 index 0000000..f57e428 --- /dev/null +++ b/Blueprints/Lua/gui/load_gui.lua @@ -0,0 +1,309 @@ +if SERVER then return end + +local resolution = blue_prints.getScreenResolution() +local run_once_at_start = false +local folder_states = {} -- Track collapsed state of folders +local button_height = 45 + +-- Function to move blueprints from a folder to root +local function moveFilesToRoot(folderPath) + if folderPath == "[Root Directory]" then return true end + + local fullFolderPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folderPath) + local rootPath = blue_prints.normalizePath(blue_prints.save_path) + local files = File.GetFiles(fullFolderPath) + local success = true + + if files then + for _, filepath in ipairs(files) do + if string.match(filepath, "%.txt$") then + -- Read file content + local content = blue_prints.readFileContents(filepath) + if content then + -- Get just the filename + local filename = filepath:match("([^/\\]+)$") + -- Create new path in root + local newPath = blue_prints.normalizePath(rootPath .. "/" .. filename) + -- Write to new location + if not blue_prints.writeFile(newPath, content) then + success = false + end + end + end + end + end + + return success +end + +-- Function to delete a folder and its contents +local function deleteFolder(folderPath) + if folderPath == "[Root Directory]" then return false end + + local fullFolderPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folderPath) + + -- Move all files to root first + if not moveFilesToRoot(folderPath) then + return false + end + + -- Try to delete the folder + local success = pcall(function() + File.DeleteDirectory(fullFolderPath) + end) + + -- If first attempt fails, try alternate path + if not success then + local altPath = fullFolderPath:gsub("LocalMods/", "local_mods/") + success = pcall(function() + File.DeleteDirectory(altPath) + end) + end + + return success +end + +local function count_blueprints_in_folder(folderPath) + local files = File.GetFiles(folderPath) + local count = 0 + if files then + for _, filepath in ipairs(files) do + if string.match(filepath, "%.txt$") then + count = count + 1 + end + end + end + return count +end + +local function formatFolderHeaderText(folderName, isExpanded, blueprintCount) + return string.format("%s %s (%d blueprints)", + isExpanded and "▼" or "▶", + folderName, + blueprintCount) +end + +local function generate_load_gui() + blue_prints.current_gui_page = GUI.Frame(GUI.RectTransform(Vector2(1, 1), blue_prints.gui_button_frame.RectTransform, GUI.Anchor.Center), + nil) + blue_prints.current_gui_page.CanBeFocused = false + blue_prints.current_gui_page.Visible = false + + -- Background close button + local closeButton = GUI.Button( + GUI.RectTransform(Vector2(1, 1), blue_prints.current_gui_page.RectTransform, GUI.Anchor.Center), "", + GUI.Alignment.Center, nil) + closeButton.OnClicked = function() + blue_prints.current_gui_page.Visible = not blue_prints.current_gui_page.Visible + end + + local menuContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), blue_prints.current_gui_page.RectTransform, + GUI.Anchor.Center)) + local mainList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), menuContent.RectTransform, GUI.Anchor.BottomCenter)) + + -- Title + local title_text = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), mainList.Content.RectTransform), + "LOAD BLUEPRINT", nil, nil, GUI.Alignment.Center) + title_text.TextScale = 1.5 + title_text.TextColor = Color(200, 200, 200) + + -- Instructions + local instruction_text = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.25), mainList.Content.RectTransform), + 'Click a button to load. Hover over the button to see its description. Click folder headers to expand/collapse.\n\n' .. + 'If the base component is not available, FPGAs will be used instead. These components must be in your main inventory, not a toolbelt/backpack etc.\n\n' .. + 'Click anywhere outside this box to cancel.', + nil, nil, GUI.Alignment.TopLeft) + instruction_text.Wrap = true + instruction_text.TextColor = Color(200, 200, 200) + instruction_text.Padding = Vector4(10, 5, 10, 5) + + local function createBlueprintButton(filename, filepath, description, componentCount, contentList) + local buttonContainer = GUI.Frame(GUI.RectTransform(Vector2(1, 0.10), contentList.Content.RectTransform, + GUI.Anchor.TopCenter)) + buttonContainer.RectTransform.MinSize = Point(0, button_height) + buttonContainer.RectTransform.MaxSize = Point(9999, button_height) + + local button_label = filename .. " - " .. tostring(componentCount) .. " FPGAs" + local leftButton = GUI.Button( + GUI.RectTransform(Vector2(0.90, 1), buttonContainer.RectTransform, GUI.Anchor.CenterLeft), + button_label, GUI.Alignment.CenterLeft, "GUIButtonSmall") + leftButton.TextBlock.Padding = Vector4(80, 0, 0, 0) + + if description then + description = description:gsub(" ", "\n"):gsub(" ", "\n") + leftButton.ToolTip = description + else + leftButton.ToolTip = "No description available" + end + + leftButton.OnClicked = function() + blue_prints.construct_blueprint(filepath) + blue_prints.current_gui_page.Visible = false + end + + local rightButton = GUI.Button( + GUI.RectTransform(Vector2(0.10, 1), buttonContainer.RectTransform, GUI.Anchor.CenterRight), + "Delete", GUI.Alignment.Center, "GUIButtonSmall") + rightButton.ToolTip = "Delete " .. filename + rightButton.Color = Color(255, 80, 80) + rightButton.HoverColor = Color(255, 120, 120) + + rightButton.OnClicked = function() + local message_box = GUI.MessageBox('Delete Blueprint?', + 'Are you sure you want to delete "' .. filename .. '"?', + { 'Cancel', 'Delete' }) + + local cancel_button = nil + local delete_button = nil + + if message_box.Buttons[0] == nil then + cancel_button = message_box.Buttons[1] + delete_button = message_box.Buttons[2] + else + cancel_button = message_box.Buttons[0] + delete_button = message_box.Buttons[1] + end + + delete_button.Color = Color(255, 80, 80) + delete_button.HoverColor = Color(255, 120, 120) + + cancel_button.OnClicked = function() message_box.Close() end + delete_button.OnClicked = function() + blue_prints.delete_blueprint(filepath) + blue_prints.current_gui_page.Visible = false + GUI.AddMessage('Blueprint Deleted', Color.White) + message_box.Close() + end + end + end + + -- Process folders + local folders = blue_prints.getFolderList() + for _, folderName in ipairs(folders) do + local folderPath = folderName == "[Root Directory]" and "" or folderName + local fullFolderPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folderPath) + local blueprintCount = count_blueprints_in_folder(fullFolderPath) + + folder_states[folderName] = folder_states[folderName] or false + + -- Create folder container + local folderContainer = GUI.Frame(GUI.RectTransform(Vector2(1, 0.10), mainList.Content.RectTransform, + GUI.Anchor.TopCenter)) + folderContainer.RectTransform.MinSize = Point(0, button_height) + folderContainer.RectTransform.MaxSize = Point(9999, button_height) + + -- Create folder button with 90% width + local headerButton = GUI.Button( + GUI.RectTransform(Vector2(0.90, 1), folderContainer.RectTransform, GUI.Anchor.CenterLeft), + formatFolderHeaderText(folderName, folder_states[folderName], blueprintCount), + GUI.Alignment.CenterLeft, "GUIButtonSmall") + headerButton.TextColor = Color(150, 150, 255) + headerButton.HoverColor = Color(180, 180, 255, 0.5) + headerButton.ForceUpperCase = 1 + headerButton.TextBlock.Padding = Vector4(0, 0, 0, 0) + + -- Add delete button for folder (except root) + if folderName ~= "[Root Directory]" then + local deleteButton = GUI.Button( + GUI.RectTransform(Vector2(0.10, 1), folderContainer.RectTransform, GUI.Anchor.CenterRight), + "Delete", GUI.Alignment.Center, "GUIButtonSmall") + deleteButton.ToolTip = "Delete folder and move contents to root" + deleteButton.Color = Color(255, 80, 80) + deleteButton.HoverColor = Color(255, 120, 120) + + deleteButton.OnClicked = function() + local message_box = GUI.MessageBox('Delete Folder?', + 'Are you sure you want to delete "' .. + folderName .. '"?\nAll blueprints will be moved to the root folder.', + { 'Cancel', 'Delete' }) + + local cancel_button = nil + local delete_button = nil + + if message_box.Buttons[0] == nil then + cancel_button = message_box.Buttons[1] + delete_button = message_box.Buttons[2] + else + cancel_button = message_box.Buttons[0] + delete_button = message_box.Buttons[1] + end + + delete_button.Color = Color(255, 80, 80) + delete_button.HoverColor = Color(255, 120, 120) + + cancel_button.OnClicked = function() message_box.Close() end + delete_button.OnClicked = function() + if deleteFolder(folderName) then + blue_prints.current_gui_page.Visible = false + GUI.AddMessage('Folder Deleted', Color.White) + message_box.Close() + -- Regenerate GUI to show updated folder structure + Timer.Wait(function() + blue_prints.current_gui_page = generate_load_gui() + blue_prints.current_gui_page.Visible = true + end, 100) + else + GUI.AddMessage('Failed to delete folder', Color(255, 0, 0)) + message_box.Close() + end + end + end + end + + local files = File.GetFiles(fullFolderPath) + local size_of_listbox = #files * button_height + 20 + + local contentList = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.1), mainList.Content.RectTransform)) + contentList.RectTransform.MinSize = Point(0, size_of_listbox) + contentList.RectTransform.MaxSize = Point(999999, size_of_listbox) + contentList.Visible = folder_states[folderName] + + -- Process files + if files then + for _, filepath in ipairs(files) do + if string.match(filepath, "%.txt$") then + local filename = filepath:match("([^/\\]+)%.txt$") + local xmlContent = blue_prints.readFileContents(filepath) + local description = blue_prints.get_description_from_xml(xmlContent) + local componentCount = blue_prints.get_component_count_from_xml(xmlContent) + + createBlueprintButton(filename, folderPath .. "/" .. filename, description, componentCount, + contentList) + end + end + end + + headerButton.OnClicked = function() + folder_states[folderName] = not folder_states[folderName] + contentList.Visible = folder_states[folderName] + headerButton.Text = formatFolderHeaderText(folderName, folder_states[folderName], blueprintCount) + end + end + + return blue_prints.current_gui_page +end + +local function check_and_rebuild_frame() + local new_resolution = blue_prints.getScreenResolution() + if new_resolution ~= resolution or run_once_at_start == false then + + local spacer = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.04), blue_prints.gui_button_frame_list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), blue_prints.gui_button_frame_list.Content.RectTransform), "Load Blueprint", GUI.Alignment.Center, "GUIButtonSmall") + + button.OnClicked = function() + if blue_prints.current_gui_page then + blue_prints.current_gui_page.Visible = false + end + blue_prints.current_gui_page = generate_load_gui() + blue_prints.current_gui_page.Visible = true + end + + resolution = new_resolution + run_once_at_start = true + end +end + +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function() + check_and_rebuild_frame() +end, Hook.HookMethodType.After) diff --git a/Blueprints/Lua/gui/popup_gui.lua b/Blueprints/Lua/gui/popup_gui.lua new file mode 100644 index 0000000..12553bf --- /dev/null +++ b/Blueprints/Lua/gui/popup_gui.lua @@ -0,0 +1,138 @@ +if SERVER then return end -- we don't want server to run GUI code. + +-- Create main frame for all popups +blue_prints.popup_frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) +blue_prints.popup_frame.CanBeFocused = false +blue_prints.current_popup = nil + +function blue_prints.show_popup(config) + -- Hide any existing popup + if blue_prints.current_popup then + blue_prints.current_popup.Visible = false + end + + -- Create new popup frame + local popup = GUI.Frame(GUI.RectTransform(Vector2(1, 1), blue_prints.popup_frame.RectTransform, GUI.Anchor.Center), nil) + popup.CanBeFocused = false + popup.Visible = true + blue_prints.current_popup = popup + + -- Background dimming + local backgroundButton = GUI.Button(GUI.RectTransform(Vector2(1, 1), popup.RectTransform), "", GUI.Alignment.Center, nil) + backgroundButton.Color = Color(0, 0, 0, 100) + + -- Content container + local popupContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), popup.RectTransform, GUI.Anchor.Center)) + local popupList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), popupContent.RectTransform, GUI.Anchor.BottomCenter)) + + -- Title + if config.title then + local titleText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.15), popupList.Content.RectTransform), + config.title, nil, nil, GUI.Alignment.Center) + titleText.TextScale = 1.5 + titleText.TextColor = Color(200, 200, 200) + titleText.Wrap = true + end + + -- Message lines + if config.messages then + for _, message in ipairs(config.messages) do + local messageBlock = GUI.TextBlock( + GUI.RectTransform(Vector2(1, message.height or 0.05), popupList.Content.RectTransform), + message.text or message, + nil, nil, GUI.Alignment.Center + ) + messageBlock.Wrap = true + messageBlock.TextColor = message.color or Color(200, 200, 200) + if message.padding then + messageBlock.Padding = message.padding + else + messageBlock.Padding = Vector4(10, 5, 10, 5) + end + end + end + + -- Optional spacer + if config.addSpacer then + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.10), popupList.Content.RectTransform), + '', nil, nil, GUI.Alignment.Center) + end + + -- Buttons + if config.buttons then + for _, buttonConfig in ipairs(config.buttons) do + local button = GUI.Button( + GUI.RectTransform(Vector2(1, 0.1), popupList.Content.RectTransform), + buttonConfig.text, + GUI.Alignment.Center, + "GUIButtonSmall" + ) + if buttonConfig.color then + button.Color = buttonConfig.color + end + button.OnClicked = function() + if buttonConfig.onClick then + buttonConfig.onClick() + end + popup.Visible = false + end + end + end + + -- Close on background click + backgroundButton.OnClicked = function() + popup.Visible = false + end + + return popup +end + +-- Add to GUI update list for all relevant screens +Hook.Patch("Barotrauma.GameScreen", "AddToGUIUpdateList", function() + blue_prints.popup_frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) + +Hook.Patch("Barotrauma.NetLobbyScreen", "AddToGUIUpdateList", function(self, ptable) + blue_prints.popup_frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) + +Hook.Patch("Barotrauma.SubEditorScreen", "AddToGUIUpdateList", function() + blue_prints.popup_frame.AddToGUIUpdateList() +end, Hook.HookMethodType.After) + +--[[ +--use like this in other scripts: +blue_prints.show_popup({ + title = "Load Failed", + messages = { + { + text = "Your circuit has failed to load.", + height = 0.1 -- Taller block for wrapped text + }, + { + text = "Your blueprint file might be from an earlier version of Blueprints and nothing is actually wrong. Try saving it again (overwriting the original) to update your blueprint file to the latest version.", + height = 0.2 + }, + { + text = "If you are certain your file is up to date try loading it again. Do not move or change anything during loading: the loaded circuit must match the blueprint file EXACTLY in order for you not to see this message.", + height = 0.2 + }, + { + text = "This also means if the inputs change any values in any component the unit test will also fail. Same thing if you have some value that changes over time, like RGB or timing values from an oscillator. So the circuit might still be ok, it just does not match your save exactly.", + height = 0.2 + }, + { + text = "If none of these exceptions apply and the problem persists please report this bug on the steam workshop page or the discord. Include a download link to your saved blueprint file and a screenshot of your console text (you can see that by hitting F3)", + --color = Color(255, 0, 0), -- Red text + height = 0.2 + } + }, + addSpacer = true, + buttons = { + { + text = "Close", + onClick = function() end + } + } +}) +--]] \ No newline at end of file diff --git a/Blueprints/Lua/gui/save_gui.lua b/Blueprints/Lua/gui/save_gui.lua new file mode 100644 index 0000000..41c2de6 --- /dev/null +++ b/Blueprints/Lua/gui/save_gui.lua @@ -0,0 +1,239 @@ +if SERVER then return end -- we don't want server to run GUI code. + +local resolution = blue_prints.getScreenResolution() +local run_once_at_start = false + +-- Forward declarations +local check_and_rebuild_frame +local create_folder_modal +local generate_save_gui + +create_folder_modal = function() + -- Create a new modal frame that covers the entire screen + local modalFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 1), frame.RectTransform, GUI.Anchor.Center), nil) + modalFrame.CanBeFocused = false + + -- Darkened background + local backgroundButton = GUI.Button(GUI.RectTransform(Vector2(1, 1), modalFrame.RectTransform), "", + GUI.Alignment.Center, nil) + backgroundButton.Color = Color(0, 0, 0, 100) + + -- Modal content container - make it consistent with load_gui width (0.4) + local modalContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), modalFrame.RectTransform, GUI.Anchor.Center)) + local menuList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), modalContent.RectTransform, GUI.Anchor.BottomCenter)) + + -- Title - matching load_gui style + local titleText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), + "CREATE NEW FOLDER", nil, nil, GUI.Alignment.Center) + titleText.TextScale = 2.0 + titleText.Wrap = false + + -- Spacer + local spacer1 = GUI.Frame(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform)) + + -- Folder name label + local folderNameText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), + "Folder Name:", nil, nil, GUI.Alignment.CenterLeft) + + -- Text input - full width like in save_gui + local textBox = GUI.TextBox(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), "") + + -- Spacer + local spacer2 = GUI.Frame(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform)) + + -- Button container for proper centering + local buttonContainer = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform)) + + -- Create and Cancel buttons with proper spacing + local cancelButton = GUI.Button( + GUI.RectTransform(Vector2(0.45, 1), buttonContainer.RectTransform, GUI.Anchor.CenterLeft), + "Cancel", GUI.Alignment.Center, "GUIButtonSmall") + + local createButton = GUI.Button( + GUI.RectTransform(Vector2(0.45, 1), buttonContainer.RectTransform, GUI.Anchor.CenterRight), + "Create", GUI.Alignment.Center, "GUIButtonSmall") + + -- Button handlers + cancelButton.OnClicked = function() + modalFrame.Visible = false + modalFrame.RemoveFromGUIUpdateList() + -- Ensure main save window is visible + if blue_prints.current_gui_page then + blue_prints.current_gui_page.Visible = true + end + end + + backgroundButton.OnClicked = cancelButton.OnClicked + + createButton.OnClicked = function() + if textBox.Text and textBox.Text ~= "" then + local success, result = blue_prints.createNewFolder(textBox.Text) + if success then + -- Close modal + modalFrame.Visible = false + modalFrame.RemoveFromGUIUpdateList() + + -- Refresh save window to show new folder + if blue_prints.current_gui_page then + blue_prints.current_gui_page.Visible = false + end + blue_prints.current_gui_page = generate_save_gui() + blue_prints.current_gui_page.Visible = true + + GUI.AddMessage("Folder created successfully", Color(0, 255, 0)) + else + GUI.AddMessage("Failed to create folder: " .. result, Color(255, 0, 0)) + end + else + GUI.AddMessage("Please enter a folder name", Color(255, 0, 0)) + end + end + + return modalFrame +end + +generate_save_gui = function() + blue_prints.current_gui_page = GUI.Frame(GUI.RectTransform(Vector2(1, 1), blue_prints.gui_button_frame.RectTransform, GUI.Anchor.Center), + nil) + blue_prints.current_gui_page.CanBeFocused = false + blue_prints.current_gui_page.Visible = false + + -- Background close button + local closeButton = GUI.Button( + GUI.RectTransform(Vector2(1, 1), blue_prints.current_gui_page.RectTransform, GUI.Anchor.Center), "", + GUI.Alignment.Center, nil) + closeButton.OnClicked = function() + blue_prints.current_gui_page.Visible = not blue_prints.current_gui_page.Visible + end + + local menuContent = GUI.Frame(GUI.RectTransform(Vector2(0.4, 0.6), blue_prints.current_gui_page.RectTransform, + GUI.Anchor.Center)) + local menuList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), menuContent.RectTransform, GUI.Anchor.BottomCenter)) + + -- Title + local title_text = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), "SAVE BLUEPRINT", + nil, nil, GUI.Alignment.Center) + title_text.TextScale = 1.5 + title_text.TextColor = Color(200, 200, 200) + title_text.Wrap = false + + -- Instructions + local instruction_text = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.20), menuList.Content.RectTransform), + 'Enter a filename and select a folder. If using an existing filename, the old file will be overwritten.\n\n' .. + 'A label with the name "Description" will be used as the reminder text when loading.\n\n' .. + 'Click anywhere outside this box to cancel.', + nil, nil, GUI.Alignment.TopLeft) + instruction_text.Wrap = true + instruction_text.TextColor = Color(200, 200, 200) + instruction_text.Padding = Vector4(10, 5, 10, 5) + + -- Create New Folder Button + local createFolderButton = GUI.Button(GUI.RectTransform(Vector2(1, 0.08), menuList.Content.RectTransform), + "Create New Folder", GUI.Alignment.Center, "GUIButtonSmall") + + createFolderButton.OnClicked = function() + -- Hide the save window temporarily + blue_prints.current_gui_page.Visible = false + -- Show the folder creation modal + local modalFrame = create_folder_modal() + end + + local spacer1 = GUI.Frame(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform)) + + -- Folder Selection + local folderText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), + "Select Folder:", nil, nil, GUI.Alignment.CenterLeft) + + local folderDropDown = GUI.DropDown(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), + "Select Folder", nil, nil, false) + + -- Add folders to dropdown with numeric indices + local folders = blue_prints.getFolderList() + for i, folder in ipairs(folders) do + folderDropDown.AddItem(folder, i) + end + + -- Select the most recently used folder if it exists + local selectedIndex = 1 -- Default to first item + for i, folder in ipairs(folders) do + if folder == blue_prints.most_recent_folder then + selectedIndex = i + break + end + end + folderDropDown.Select(selectedIndex - 1) -- -1 because dropdown uses 0-based indexing + + -- Store folder list for reference + local folderLookup = folders + + local spacer2 = GUI.Frame(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform)) + + -- Filename Section + local filenameText = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform), + "Filename:", nil, nil, GUI.Alignment.CenterLeft) + + local filenameTextBox = GUI.TextBox(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), + "Your filename here") + + -- Set the text box to the most recently used name if available + if blue_prints.most_recently_used_blueprint_name ~= nil then + filenameTextBox.Text = blue_prints.most_recently_used_blueprint_name + end + + local spacer3 = GUI.Frame(GUI.RectTransform(Vector2(1, 0.05), menuList.Content.RectTransform)) + + -- Save Button + local save_button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), + "Save", GUI.Alignment.Center, "GUIButtonSmall") + + save_button.OnClicked = function() + if filenameTextBox.Text and filenameTextBox.Text ~= "" then + -- Get the selected index and use it to look up the folder name + local selectedIndex = (tonumber(folderDropDown.SelectedData) or 1) - 1 + local selectedFolder = folderLookup[selectedIndex + 1] -- +1 because Lua arrays start at 1 + + --print("Selected index:", selectedIndex) -- Debug print + --print("Selected folder:", selectedFolder) -- Debug print + + if selectedFolder == "[Root Directory]" then + --print("Saving to root directory") + blue_prints.save_blueprint(filenameTextBox.Text) + else + --print("Saving to folder:", selectedFolder) + blue_prints.save_blueprint(filenameTextBox.Text, selectedFolder) + end + blue_prints.current_gui_page.Visible = false + GUI.AddMessage('File Saved', Color.White) + else + GUI.AddMessage('Please enter a filename', Color(255, 0, 0)) + end + end + + return blue_prints.current_gui_page +end + +check_and_rebuild_frame = function() + local new_resolution = blue_prints.getScreenResolution() + if new_resolution ~= resolution or run_once_at_start == false then + + local spacer = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.04), blue_prints.gui_button_frame_list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), blue_prints.gui_button_frame_list.Content.RectTransform), "Save Blueprint", GUI.Alignment.Center, "GUIButtonSmall") + + button.OnClicked = function() + if blue_prints.current_gui_page ~= nil then + blue_prints.current_gui_page.Visible = false + end + blue_prints.current_gui_page = nil + blue_prints.current_gui_page = generate_save_gui() + blue_prints.current_gui_page.Visible = true + end + + resolution = new_resolution + run_once_at_start = true + end +end + +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function() + check_and_rebuild_frame() +end, Hook.HookMethodType.After) diff --git a/Blueprints/Lua/load_blueprint.lua b/Blueprints/Lua/load_blueprint.lua new file mode 100644 index 0000000..ce871e5 --- /dev/null +++ b/Blueprints/Lua/load_blueprint.lua @@ -0,0 +1,1264 @@ +if SERVER then return end --prevents it from running on the server + +local path_to_loaded_file = nil +local has_load_completed_array = { + ["clear_components_complete"] = false, + ["clear_IO_label_complete"] = false, + ["clear_IO_position_complete"] = false, + ["add_components_complete"] = false, + ["add_wires_complete"] = false, + ["add_labels_complete"] = false, + ["rename_labels_complete"] = false, + ["change_input_output_labels_complete"] = false, + ["update_values_in_components_complete"] = false, + ["resize_labels_complete"] = false, + ["move_input_output_nodes_complete"] = false +} + + + +function blue_prints.parseXML(xmlString) + + -- Define HTML entities for backwards compatibility + local html_entities = { + ['"'] = '"', + ['&'] = '&', + ['<'] = '<', + ['>'] = '>', + [' '] = ' ', + ['¡'] = '¡', + ['¢'] = '¢', + ['£'] = '£', + ['¤'] = '¤', + ['¥'] = '¥', + ['¦'] = '¦', + ['§'] = '§', + ['¨'] = '¨', + ['©'] = '©', + ['ª'] = 'ª', + ['«'] = '«', + ['¬'] = '¬', + ['­'] = '­', + ['®'] = '®', + ['¯'] = '¯', + ['°'] = '°', + ['±'] = '±', + ['²'] = '²', + ['³'] = '³', + ['´'] = '´', + ['µ'] = 'µ', + ['¶'] = '¶', + ['·'] = '·', + ['¸'] = '¸', + ['¹'] = '¹', + ['º'] = 'º', + ['»'] = '»', + ['¼'] = '¼', + ['½'] = '½', + ['¾'] = '¾', + ['¿'] = '¿', + [' '] = '\n', + [' '] = '\n' + } + + local function contains_html_entities(str) + return str and str:find('&[^;]+;') + end + + local function decode_html_entities(str) + if not str or not contains_html_entities(str) then + return str + end + return (str:gsub('(&[^;]+;)', function(entity) + return html_entities[entity] or entity + end)) + end + + -- Function to decode a string that might be in either format + local function decode_string(str) + if not str then return "" end + + -- First try new format + local delimited_content = str:match("<<>>(.-)<<>>") + if delimited_content then + -- Unescape any escaped delimiters + return delimited_content:gsub("\\<<>>", "<<>>") + :gsub("\\<<>>", "<<>>") + end + + -- If not in new format, try old format with HTML entities + return decode_html_entities(str) + end + + local inputs = {} + local outputs = {} + local components = {} + local wires = {} + local labels = {} + local inputNodePos = {} + local outputNodePos = {} + + -- Parse InputNode + local inputNode = xmlString:match("]+>") + if inputNode then + local posX, posY = inputNode:match('pos="([%d%.%-]+),([%d%.%-]+)"') + inputNodePos = { x = tonumber(posX), y = tonumber(posY) } + end + + -- Parse OutputNode + local outputNode = xmlString:match("]+>") + if outputNode then + local posX, posY = outputNode:match('pos="([%d%.%-]+),([%d%.%-]+)"') + outputNodePos = { x = tonumber(posX), y = tonumber(posY) } + end + + -- Parse input and output labels (if any) + for name, value in xmlString:gmatch('') do + + local id = component:match('id="(%d+)"') + local positionX, positionY = component:match('position="([%-%d%.]+),([%-%d%.]+)"') + local usedResource = component:match('usedresource="([^"]+)"') + + --try both formats for backwards compatibility + + local item = component:match('item=<<>>([^<]+)<<>>') + if not item or item == "" then + item = component:match('%sitem="([^"]+)"') + end + + local class = component:match('Class=<<>>([^<]+)<<>>') + if not class or class == "" then + class = component:match('%sClass="([^"]+)"') + end + + local componentData = { + id = id, + position = { x = tonumber(positionX), y = tonumber(positionY) }, + usedResource = usedResource, + item = item, + class = { + name = class, + attributes = {} + } + } + + -- Parse attributes in both new and old formats + -- First try new format + for attr, value in component:gmatch('(%w+)=<<>>(.-)<<>>') do + if attr ~= "id" and attr ~= "position" and attr ~= "backingitemid" and + attr ~= "usedresource" and attr ~= "item" and attr ~= "Class" then + componentData.class.attributes[attr] = decode_string(value) + end + end + + -- If no attributes found in new format, try old format + if next(componentData.class.attributes) == nil then + for attr, value in component:gmatch('(%w+)="(.-)"') do + if attr ~= "id" and attr ~= "position" and attr ~= "backingitemid" and + attr ~= "usedresource" and attr ~= "item" and attr ~= "Class" then + componentData.class.attributes[attr] = decode_html_entities(value) + end + end + end + + table.insert(components, componentData) + end + + -- Parse Wires + wires = {} + for wire in xmlString:gmatch("") do + local wireData = { + id = wire:match('id="(%d+)"'), + prefab = wire:match('prefab="([^"]+)"') + } + + local fromName, fromTarget = wire:match('') do + -- Extract all attributes using individual pattern matches + local id = label:match('id="(%d+)"') + local color = label:match('color="([^"]+)"') + local posX, posY = label:match('position="([%d%.%-]+),([%d%.%-]+)"') + local sizeW, sizeH = label:match('size="([%d%.%-]+),([%d%.%-]+)"') + + -- Use decode_string for both header and body + local header = decode_string(label:match('header="(.-)"')) + local body = decode_string(label:match('body="(.-)"')) + + table.insert(labels, { + id = id, + color = color, + position = { x = tonumber(posX), y = tonumber(posY) }, + size = { width = tonumber(sizeW), height = tonumber(sizeH) }, + header = header, + body = body + }) + end + + blue_prints.add_advertisement_label(components, labels, inputNodePos, outputNodePos) --if there is no ad, add one + + --[[ + -- Add this right before the return statement in blue_prints.parseXML: + print("Parsed Components:") + for i, component in ipairs(components) do + print(string.format("Component %d:", i)) + print(string.format(" ID: %s", component.id)) + print(string.format(" Position: (%.2f, %.2f)", component.position.x, component.position.y)) + print(string.format(" Item: %s", component.item)) + print(string.format(" Class: %s", component.class.name)) + print(" Attributes:") + for attr, value in pairs(component.class.attributes) do + print(string.format(" %s: %s", attr, value)) + end + print("----------") + end + --]] + + return inputs, outputs, components, wires, labels, inputNodePos, outputNodePos +end + + + + +function blue_prints.check_inventory_for_requirements(components) + --print("Game mode: ", Game.IsSubEditor) + + local missing_components = {} + + if Game.IsSubEditor then return missing_components end --if in sub editor, you dont have to worry about inventory + + for _, component in ipairs(components) do + missing_components[component.item] = (missing_components[component.item] or 0) + 1 + end + local character = Character.Controlled + + local fpgacircuit_count = 0 + + --count inventory items already stored inside the box + if blue_prints.most_recent_circuitbox ~= nil then + local items_already_in_box = blue_prints.get_components_currently_in_circuitbox(blue_prints + .most_recent_circuitbox) + + for resource, count in pairs(items_already_in_box) do + local identifier = resource + if identifier == "fpgacircuit" then + fpgacircuit_count = fpgacircuit_count + count + elseif missing_components[identifier] and missing_components[identifier] > 0 then + missing_components[identifier] = missing_components[identifier] - count + end + end + end + + + + -- First pass: count regular items and fpgacircuits + for inventory_item in character.Inventory.AllItems do + local identifier = tostring(inventory_item.Prefab.Identifier) + if identifier == "fpgacircuit" then + fpgacircuit_count = fpgacircuit_count + 1 + elseif missing_components[identifier] and missing_components[identifier] > 0 then + missing_components[identifier] = missing_components[identifier] - 1 + end + end + + -- Second pass: use fpgacircuits as wildcards only for remaining missing items + for identifier, count in pairs(missing_components) do + if count > 0 and fpgacircuit_count > 0 then + local used_fpga = math.min(count, fpgacircuit_count) + missing_components[identifier] = count - used_fpga + fpgacircuit_count = fpgacircuit_count - used_fpga + end + end + + -- Remove components that are not missing + for identifier, count in pairs(missing_components) do + if count <= 0 then + missing_components[identifier] = nil + end + end + + return missing_components +end + +function blue_prints.add_component_to_circuitbox(component, use_fpga) + if blue_prints.most_recent_circuitbox == nil then + print("No circuitbox detected") + return + end + + + --due to refactoring I no longer need this, but will keep it for historical compatability with older blueprints + if component.item == "oscillatorcomponent" then component.item = "oscillator" end --these components are named strangely and break convention + if component.item == "concatenationcomponent" then component.item = "concatcomponent" end + if component.item == "exponentiationcomponent" then component.item = "powcomponent" end + if component.item == "regexfind" then component.item = "regexcomponent" end + if component.item == "signalcheck" then component.item = "signalcheckcomponent" end + if component.item == "squareroot" then component.item = "squarerootcomponent" end + + + local item_to_add = use_fpga and ItemPrefab.GetItemPrefab("fpgacircuit") or ItemPrefab.GetItemPrefab(component.item) + local component_position = Vector2(component.position.x, component.position.y) + --print(tostring(component)) + --print(item_to_add) + --print(blue_prints.most_recent_circuitbox) + --print(blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox")) + --print(item_to_add) + --print(component.name) + --print(component_position) + --print(component.item) + + if item_to_add == nil then + print("Error: Invalid component data") + return false + end + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").AddComponent(item_to_add, component_position) + --print(string.format("Added component %s at position (%.2f, %.2f)", use_fpga and "fpgacircuit" or component.item, component_position.x, component_position.y)) +end + +function blue_prints.add_all_components_to_circuitbox(components, index, inventory_status) + if blue_prints.most_recent_circuitbox == nil then + print("No circuitbox detected") + return + end + + index = index or 1 -- Start with the first component if no index is provided + inventory_status = inventory_status or blue_prints.check_inventory_for_requirements(components) + + if index <= #components then + local component = components[index] + local use_fpga = inventory_status[component.item] and inventory_status[component.item] > 0 + + blue_prints.add_component_to_circuitbox(component, use_fpga) + + if use_fpga then + inventory_status[component.item] = inventory_status[component.item] - 1 + if inventory_status[component.item] == 0 then + inventory_status[component.item] = nil + end + end + + -- Schedule the next addition with a delay + Timer.Wait(function() blue_prints.add_all_components_to_circuitbox(components, index + 1, inventory_status) end, + blue_prints.time_delay_between_loops) + else + -- If all components are added, print a message + --print("All components added.") + has_load_completed_array["add_components_complete"] = true + end +end + +function blue_prints.add_wires_to_circuitbox_recursive(wires, index) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local first_connection = nil + local second_connection = nil + + local components = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").Components + local input_output_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").InputOutputNodes + local input_connection_node = blue_prints.getNthValue(input_output_nodes, 1) + local input_connections = input_connection_node.Connectors + local output_connection_node = blue_prints.getNthValue(input_output_nodes, 2) + local output_connections = output_connection_node.Connectors + + if index > #wires then + --print("All wires added.") + has_load_completed_array["add_wires_complete"] = true + return + end + + local wire = wires[index] + + --select wire color + local wire_prefab = ItemPrefab.GetItemPrefab(tostring(wire.prefab)) + LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.CircuitBoxUI"], "SelectWire") + local circuitbox_ui = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").UI.SelectWire(nil, + wire_prefab) + + for component_key, component_value in pairs(components) do + local connectors = component_value.Connectors + + for i = 0, connectors.length - 1 do + if tostring(component_value.ID) == tostring(wire.from.target) and tostring(connectors[i].name) == tostring(wire.from.name) then + first_connection = connectors[i] + end + + if tostring(component_value.ID) == tostring(wire.to.target) and tostring(connectors[i].name) == tostring(wire.to.name) then + second_connection = connectors[i] + end + end + end + + + if wire.from.target == nil then + local input_to_target = string.match(tostring(wire.from.name), "%d+") + first_connection = input_connections[tonumber(input_to_target) - 1] + end + + if wire.to.target == nil then + local input_to_target = string.match(tostring(wire.to.name), "%d+") + second_connection = output_connections[tonumber(input_to_target) - 1] + end + + if first_connection and second_connection then + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").AddWire(first_connection, second_connection) + end + + -- Recur to the next wire + Timer.Wait(function() blue_prints.add_wires_to_circuitbox_recursive(wires, index + 1) end, + blue_prints.time_delay_between_loops) +end + +-- Check if labels have been reset +local function check_labels_changed(input_dict, output_dict) + local input_output_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").InputOutputNodes + local input_connection_node = blue_prints.getNthValue(input_output_nodes, 1) + local output_connection_node = blue_prints.getNthValue(input_output_nodes, 2) + + -- Check if any actual inputs/outputs differ from expected + for key, value in pairs(input_connection_node.ConnectionLabelOverrides) do + if value ~= (input_dict[key] or "") then + return false + end + end + + for key, value in pairs(output_connection_node.ConnectionLabelOverrides) do + if value ~= (output_dict[key] or "") then + return false + end + end + + return true +end + + +function blue_prints.change_input_output_labels(input_dict, output_dict, recursion_count) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local input_output_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").InputOutputNodes + local input_connection_node = blue_prints.getNthValue(input_output_nodes, 1) + local output_connection_node = blue_prints.getNthValue(input_output_nodes, 2) + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").SetConnectionLabelOverrides( + input_connection_node, input_dict) + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").SetConnectionLabelOverrides( + output_connection_node, output_dict) + + if check_labels_changed(input_dict, output_dict) then + --This function gets called twice, once to clear the box, one to change the IO + if has_load_completed_array["clear_IO_label_complete"] == false then + has_load_completed_array["clear_IO_label_complete"] = true + else + has_load_completed_array["change_input_output_labels_complete"] = true + end + else + if recursion_count < 5 then + Timer.Wait(function() blue_prints.change_input_output_labels(input_dict, output_dict, recursion_count + 1) end, + blue_prints.time_delay_between_loops) + else + print("Error: Failed to change input/output labels") + end + end + +end + +function blue_prints.add_advertisement_label(components, labels, inputNodePos, outputNodePos) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + --just add an extra label to labels table thats to the right of the rightmost component or label + --dont do this if there is already an advertisement label + advertisement_header = "Blueprints" + + for _, label in ipairs(labels) do --if there is already an advertisement, dont add another + if label.header and label.header == advertisement_header then + return + end + end + + + local furthestRight = blue_prints.getFurthestRightElement(components, labels, inputNodePos, outputNodePos) + + --print("Furthest right element type:", furthestRight.type) + --print("Furthest right x-coordinate:", furthestRight.x) + --print("Furthest right y-coordinate:", furthestRight.y) + + + local function addManualLabel(id, color, posX, posY, sizeW, sizeH, header, body) + table.insert(labels, { + id = id, + color = color, + position = { x = tonumber(posX), y = tonumber(posY) }, + size = { width = tonumber(sizeW), height = tonumber(sizeH) }, + header = header, + body = body + }) + end + + addManualLabel(#labels, "#0082FF", furthestRight.x + 384, furthestRight.y, 512, 256, advertisement_header, + 'Circuit made with Blueprints. \n \n Get it now on the steam workshop!') +end + +function blue_prints.add_labels_to_circuitbox_recursive(labels, index) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + -- Base case: if we've processed all labels, return + if index > #labels then + has_load_completed_array["add_labels_complete"] = true + return + end + + -- Process the current label + local label = labels[index] + local x_offset_for_resizing = label.position.x - (label.size.width / 2) + 128 + local y_offset_for_resizing = label.position.y + (label.size.height / 2) - 128 + + local label_position = Vector2(x_offset_for_resizing, y_offset_for_resizing) + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").AddLabel(label_position) + + -- Recursive call to process the next label + Timer.Wait(function() blue_prints.add_labels_to_circuitbox_recursive(labels, index + 1) end, + blue_prints.time_delay_between_loops) +end + +function blue_prints.rename_all_labels_in_circuitbox(labels) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local label_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").Labels + + for i, label in ipairs(labels) do + --print(string.format(" Label %d:", i)) + --print(string.format(" ID: %s", label.id)) + --print(string.format(" Color: %s", label.color)) + --print(string.format(" Position: (%.2f, %.2f)", label.position.x, label.position.y)) + --print(string.format(" Size: %.2f x %.2f", label.size.width, label.size.height)) + --print(string.format(" Header: %s", label.header)) + --print(string.format(" Body: %s", label.body)) + + if label.header == nil then label.header = "" end + if label.body == nil then label.body = "" end + + local label_node = blue_prints.getNthValue(label_nodes, i) + local label_header = blue_prints.net_limited_string_type(tostring(label.header)) + local label_body = blue_prints.net_limited_string_type(tostring(label.body)) + local label_color = blue_prints.hexToRGBA(label.color) + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").RenameLabel(label_node, label_color, + label_header, label_body) + end + + --print("All labels added.") + has_load_completed_array["rename_labels_complete"] = true +end + +local function resize_label(label_node, direction, resize_vector) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").ResizeNode(label_node, direction, resize_vector) +end + + +function blue_prints.resize_labels(labels_from_blueprint) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local label_nodes_in_box = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").Labels + + for i, label_in_blueprint in ipairs(labels_from_blueprint) do + local label_node = blue_prints.getNthValue(label_nodes_in_box, i) + + local amount_to_expand_x = label_in_blueprint.size.width - label_node.size.X + amount_to_expand_x = amount_to_expand_x + local amount_to_expand_y = label_in_blueprint.size.height - label_node.size.Y + + local expansion_vector = Vector2(amount_to_expand_x, -amount_to_expand_y) + + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").ResizeNode(label_node, 2, expansion_vector) --2 is expand right + + --I dont know why, but if you dont have enough delay here, the labels will not resize properly + --the second resize will somehow overwrite the other axis with its non-resized version. + --ie if you were to resize a 256x256 into a 512x512, it would become a 256x512. + local resize_delay = (blue_prints.time_delay_between_loops * 8) + + Timer.Wait(function() resize_label(label_node, 1, expansion_vector) end, resize_delay) --the commands override each other if sent too fast. 1 is expand down. + end + + has_load_completed_array["resize_labels_complete"] = true +end + +function blue_prints.update_values_in_components(components_from_blueprint) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local components_in_box = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").Components + + for index, component_in_box in ipairs(components_in_box) do + local component_to_copy = components_from_blueprint[index] + + local component_class_to_change = component_in_box.Item.GetComponentString(component_to_copy.class.name) + if component_class_to_change then + for attr, value in pairs(component_to_copy.class.attributes) do + --print(" " .. attr .. ":", value) + + + --print(component_class_to_change) + --print(tostring(component_class_to_change[attr])) + + local success = false + local result + + + --print(attr) + local is_actually_editable = false + local my_editables = component_in_box.Item.GetInGameEditableProperties(false) + for tuple in my_editables do + --print(tuple.Item2.name, ' = ', tuple.Item2.GetValue(tuple.Item1)) + if tostring(tuple.Item2.name) == tostring(attr) then + is_actually_editable = true + break + end + end + + + if is_actually_editable then --only attempt load if its actually editable + -- First attempt (string version) + if not success then + success, result = pcall(function() + component_class_to_change[attr] = value + return "String operation successful" + end) + end + + -- Second attempt (number version) + if not success then + success, result = pcall(function() + component_class_to_change[attr] = tonumber(value) + return "Number operation successful" + end) + end + + -- Third attempt (bool version) + if not success then + success, result = pcall(function() + component_class_to_change[attr] = blue_prints.string_to_bool(value) + return "Boolean operation successful" + end) + end + + + + --oscillator is a special case because it uses enums + if component_to_copy.class.name == "OscillatorComponent" then + if tostring(attr) == "OutputType" then + if value == "Pulse" then component_class_to_change.OutputType = component_class_to_change + .WaveType.Pulse end + if value == "Sawtooth" then component_class_to_change.OutputType = component_class_to_change + .WaveType.Sawtooth end + if value == "Sine" then component_class_to_change.OutputType = component_class_to_change + .WaveType.Sine end + if value == "Square" then component_class_to_change.OutputType = component_class_to_change + .WaveType.Square end + if value == "Triangle" then component_class_to_change.OutputType = component_class_to_change + .WaveType.Triangle end + end + if tostring(attr) == "Frequency" then + component_class_to_change.Frequency = tonumber(value) + end + success = true + end + + + if success then + --print("Operation succeeded:", result) + else + print("All operations failed. Last error: ", result) + print("Component type that failed: ", component_class_to_change.name) + end + + + --print("Game mode: ", Game.GameSession.GameMode.Name) + if Game.GameSession ~= nil then --a nil check for the sub editor + local gameModeName = tostring(Game.GameSession.GameMode.Name) + if not Game.GameSession.GameMode.IsSinglePlayer then --these dont exist in single player so will cause a crash if not avoided. + local property = component_class_to_change.SerializableProperties[Identifier(attr)] + Networking.CreateEntityEvent(component_in_box.Item, + Item.ChangePropertyEventData(property, component_class_to_change)) + end + end + end + end + end + end + + --print("All values updated inside components.") + has_load_completed_array["update_values_in_components_complete"] = true +end + + +-- Check if input/output nodes have moved to correct positions +local function check_input_output_positions(expected_input_pos, expected_output_pos) + local input_output_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").InputOutputNodes + local input_connection_node = blue_prints.getNthValue(input_output_nodes, 1) + local output_connection_node = blue_prints.getNthValue(input_output_nodes, 2) + + local input_pos_str = "" + local output_pos_str = "" + local actual_input_pos_str = "" + local actual_output_pos_str = "" + + --find the strings for the expected and actual positions + if input_connection_node and input_connection_node.Position then + input_pos_str = type(expected_input_pos) == "table" and string.format("{X:%d Y:%d}", expected_input_pos.x, expected_input_pos.y) or tostring(expected_input_pos) + output_pos_str = type(expected_output_pos) == "table" and string.format("{X:%d Y:%d}", expected_output_pos.x, expected_output_pos.y) or tostring(expected_output_pos) + actual_input_pos_str = tostring(input_connection_node.Position) + actual_output_pos_str = tostring(output_connection_node.Position) + end + + if actual_input_pos_str == input_pos_str and actual_output_pos_str == output_pos_str then + --print("Input/output nodes moved to correct positions") + return true + else + --print("Input/output nodes not in correct positions") + --print("Expected input position: ", input_pos_str) + --print("Actual input position: ", actual_input_pos_str) + --print("Expected output position: ", output_pos_str) + --print("Actual output position: ", actual_output_pos_str) + end + return false +end + + + +function blue_prints.move_input_output_nodes(inputNodePos, outputNodePos, recursion_count) + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local input_output_nodes = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").InputOutputNodes + local input_connection_node = blue_prints.getNthValue(input_output_nodes, 1) + local output_connection_node = blue_prints.getNthValue(input_output_nodes, 2) + + + + local sacrificial_immutable_array_input = blue_prints.immutable_array_type.Create(input_connection_node) + local input_connection_node_in_immutable_aray = sacrificial_immutable_array_input.Add(input_connection_node) + + + local input_delta_x = inputNodePos.x - input_connection_node.Position.X + local input_delta_y = inputNodePos.y - input_connection_node.Position.Y + local move_input_vector = Vector2(input_delta_x, input_delta_y) + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").MoveComponent(move_input_vector, + input_connection_node_in_immutable_aray) + + + + local sacrificial_immutable_array_output = blue_prints.immutable_array_type.Create(output_connection_node) + local output_connection_node_in_immutable_aray = sacrificial_immutable_array_output.Add(output_connection_node) + + local output_delta_x = outputNodePos.x - output_connection_node.Position.X + local output_delta_y = outputNodePos.y - output_connection_node.Position.Y + local move_output_vector = Vector2(output_delta_x, output_delta_y) + + blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox").MoveComponent(move_output_vector, + output_connection_node_in_immutable_aray) + + --this is used by both clear circuitbox and to reposition later + --clear IO label must be done first, otherwise the increased width will thrown the numbers off + if check_input_output_positions(inputNodePos, outputNodePos) and has_load_completed_array["clear_IO_label_complete"] then + if has_load_completed_array["clear_IO_position_complete"] == false then + has_load_completed_array["clear_IO_position_complete"] = true + else + + has_load_completed_array["move_input_output_nodes_complete"] = true + end + else + if recursion_count < 5 then + local new_recursion_count = recursion_count + 1 + Timer.Wait(function() blue_prints.move_input_output_nodes(inputNodePos, outputNodePos, new_recursion_count) end, + blue_prints.time_delay_between_loops) + else + print("Error: Failed to move input/output nodes") + end + end +end + +function blue_prints.reset_io() + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return false + end + + -- Stage 1: Reset the labels on the input output panels + local empty_input = { + signal_in1 = "", signal_in2 = "", signal_in3 = "", signal_in4 = "", + signal_in5 = "", signal_in6 = "", signal_in7 = "", signal_in8 = "" + } + local empty_output = { + signal_out1 = "", signal_out2 = "", signal_out3 = "", signal_out4 = "", + signal_out5 = "", signal_out6 = "", signal_out7 = "", signal_out8 = "" + } + blue_prints.change_input_output_labels(empty_input, empty_output, 0) + + -- Stage 2: Move input/output nodes to default positions + local move_input_vector = Vector2(-512, 0) + local move_output_vector = Vector2(512, 0) + local initial_recursion_count = 0 + blue_prints.move_input_output_nodes(move_input_vector, move_output_vector, initial_recursion_count) + + +end + +function blue_prints.clear_circuitbox_recursive(batch_size, recursion_count) + --this function removes all components, but does not change IO + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + batch_size = batch_size or 10 -- Default batch size of 10 + local circuit_box = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox") + local something_cleared = false + + -- Clear components in batches + local components = circuit_box.Components + if #components > 0 then + local batch = blue_prints.immutable_array_type.Create(blue_prints.getNthValue(components, 1)) + local count = 0 + + for _, component in ipairs(components) do + if count < batch_size then + batch = batch.Add(component) + count = count + 1 + something_cleared = true + else + break + end + end + + if count > 0 then + circuit_box.RemoveComponents(batch) + end + end + + -- Clear labels in batches + local labels = circuit_box.Labels + if #labels > 0 and not something_cleared then + local batch = blue_prints.immutable_array_type.Create(blue_prints.getNthValue(labels, 1)) + local count = 0 + + for _, label in ipairs(labels) do + if count < batch_size then + batch = batch.Add(label) + count = count + 1 + something_cleared = true + else + break + end + end + + if count > 0 then + circuit_box.RemoveLabel(batch) + end + end + + -- Clear wires in batches + local wires = circuit_box.Wires + if #wires > 0 and not something_cleared then + local batch = blue_prints.immutable_array_type.Create(blue_prints.getNthValue(wires, 1)) + local count = 0 + + for _, wire in ipairs(wires) do + if count < batch_size then + batch = batch.Add(wire) + count = count + 1 + something_cleared = true + else + break + end + end + + if count > 0 then + circuit_box.RemoveWires(batch) + end + end + + -- If we cleared something, schedule next batch + if something_cleared and recursion_count < 20 then + Timer.Wait(function() + blue_prints.clear_circuitbox_recursive(batch_size, recursion_count + 1) + end, blue_prints.time_delay_between_loops) + elseif something_cleared and recursion_count >= 20 then + print("Recursion limit reached. Clearing circuitbox failed.") + else + -- Everything is cleared + has_load_completed_array["clear_components_complete"] = true + end +end + +-- Update the original clear_circuitbox function to use the recursive version +function blue_prints.clear_circuitbox() + -- Reset inputs and outputs to default simultaneously to clearing components + blue_prints.reset_io() + + --If you remove too fast it causes baro to have event system problems. + --without this you get unpredictable results + blue_prints.clear_circuitbox_recursive(blue_prints.component_batch_size, 0) +end + + + +function blue_prints.construct_blueprint_steps(inputs, outputs, components, wires, labels, inputNodePos, outputNodePos) + -- Reset all completion flags + for key, _ in pairs(has_load_completed_array) do + has_load_completed_array[key] = false + end + + -- Track which steps have been started + local steps_started = {} + + local largest_component_count = math.max(#components, #wires, #labels) --it resets every time, so you can just use largest + + -- Maximum time to wait for each step (in milliseconds) + local TIMEOUT_PER_STEP = ((blue_prints.time_delay_between_loops * largest_component_count) / 1000) + 2 -- if wait longer than this, something has gone wrong + local step_start_time = nil + + local function check_timeout() + --if step_start_time then + -- print(os.time() - step_start_time) + --end + + if step_start_time and os.time() - step_start_time > TIMEOUT_PER_STEP then + return true + end + return false + end + + local function end_build_testing_and_cleanup() + blue_prints.delayed_loading_complete_array_check() + blue_prints.delayed_loading_complete_unit_test() + end + + + local function check_progress() + + -- Check for timeouts + if check_timeout() then + print("Step has timed out.") + end_build_testing_and_cleanup() + return + end + + -- Step 1: Clear circuitbox must complete first + if not has_load_completed_array["clear_components_complete"] or + not has_load_completed_array["clear_IO_position_complete"] or + not has_load_completed_array["clear_IO_label_complete"] then + if not steps_started["clear"] then + steps_started["clear"] = true + step_start_time = os.time() + blue_prints.clear_circuitbox() + end + return Timer.Wait(check_progress, blue_prints.time_delay_between_loops) + end + + -- After clear is complete, these steps can run in parallel: + + + + -- Parallel Step: Add components + if not has_load_completed_array["add_components_complete"] then + if not steps_started["components"] then + steps_started["components"] = true + step_start_time = os.time() + blue_prints.add_all_components_to_circuitbox(components) + end + end + + -- Parallel Step: Add labels + if not has_load_completed_array["add_labels_complete"] then + if not steps_started["labels"] then + steps_started["labels"] = true + step_start_time = os.time() + blue_prints.add_labels_to_circuitbox_recursive(labels, 1) + end + end + + -- Parallel Step: Change I/O labels + if not has_load_completed_array["change_input_output_labels_complete"] then + if not steps_started["io_labels"] then + steps_started["io_labels"] = true + step_start_time = os.time() + blue_prints.change_input_output_labels(inputs, outputs) + end + end + + -- These steps need to wait for their dependencies: + + -- Add wires (needs components) + if has_load_completed_array["add_components_complete"] and + not has_load_completed_array["add_wires_complete"] then + if not steps_started["wires"] then + steps_started["wires"] = true + step_start_time = os.time() + blue_prints.add_wires_to_circuitbox_recursive(wires, 1) + end + end + + -- Update component values (needs components) + if has_load_completed_array["add_components_complete"] and + not has_load_completed_array["update_values_in_components_complete"] then + if not steps_started["update_values"] then + steps_started["update_values"] = true + step_start_time = os.time() + blue_prints.update_values_in_components(components) + end + end + + -- Rename labels (needs labels) + if has_load_completed_array["add_labels_complete"] and + not has_load_completed_array["rename_labels_complete"] then + if not steps_started["rename"] then + step_start_time = os.time() + steps_started["rename"] = true + blue_prints.rename_all_labels_in_circuitbox(labels) + end + end + + -- Resize labels (needs rename labels) + if has_load_completed_array["rename_labels_complete"] and + not has_load_completed_array["resize_labels_complete"] then + if not steps_started["resize"] then + step_start_time = os.time() + steps_started["resize"] = true + blue_prints.resize_labels(labels) + end + end + + -- Move I/O nodes (needs I/O labels) + if has_load_completed_array["change_input_output_labels_complete"] and + not has_load_completed_array["move_input_output_nodes_complete"] then + if not steps_started["move_nodes"] then + step_start_time = os.time() + steps_started["move_nodes"] = true + local initial_recursion_count = 0 + blue_prints.move_input_output_nodes(inputNodePos, outputNodePos, initial_recursion_count) + end + end + + -- Continue checking progress + if not (has_load_completed_array["move_input_output_nodes_complete"] and + has_load_completed_array["resize_labels_complete"] and + has_load_completed_array["update_values_in_components_complete"] and + has_load_completed_array["add_wires_complete"]) + then + return Timer.Wait(check_progress, blue_prints.time_delay_between_loops) + end + + -- Final checks when everything is complete + end_build_testing_and_cleanup() + end + + -- Start the process + check_progress() +end + + + + + + +function blue_prints.construct_blueprint(provided_path) + if Character.Controlled == nil then + print("you dont have a character") + return + end + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return + end + + local is_locked = blue_prints.get_circuit_box_lock_status() + if is_locked then + print("Circuit box is locked. Wiring is not possible.") + GUI.AddMessage('Wiring Locked', Color.Red) + return + end + + local isValid, message = blue_prints.validate_blueprint_file(provided_path) + if isValid then + --print("Blueprint file is valid") + else + print("Blueprint validation failed: " .. message) + GUI.AddMessage('Blueprint File Invalid', Color.Red) + return + end + + if Game.Paused then --the load will fail if you attempt it while paused. This fixes that. + print("Unpause the game to complete loading your circuit.") + Timer.Wait(function() blue_prints.construct_blueprint(provided_path) end, 1000) + return + end + + -- Check if the filename already ends with .txt + if not string.match(provided_path, "%.txt$") then + -- Add .txt if it's not already present + provided_path = provided_path .. ".txt" + end + + local file_path = blue_prints.normalizePath(blue_prints.save_path .. "/" .. provided_path) + path_to_loaded_file = file_path -- Keep track for unit testing + + -- Use our new read function + local xmlContent = blue_prints.readFileContents(file_path) + + if xmlContent then + -- Parse the XML content + local inputs, outputs, components, wires, labels, inputNodePos, outputNodePos = blue_prints.parseXML(xmlContent) + + -- Check inventory for required components + local missing_components = blue_prints.check_inventory_for_requirements(components) + + local all_needed_items_are_present = true + for _, count in pairs(missing_components) do + if count > 0 then + all_needed_items_are_present = false + break + end + end + + if all_needed_items_are_present then + print("All required components are present! Now loading blueprint...") + GUI.AddMessage('File Loading...', Color.White) + + -- Extract folder name if present, otherwise use root + local folder = "[Root Directory]" + local folder_path = provided_path:match("^(.-)/") + if folder_path then + folder = folder_path + end + + --save the folder and filename + local filename = provided_path:match("([^/\\]+)$") or provided_path -- Get everything after last / or \ + blue_prints.most_recently_used_blueprint_name = filename:gsub("%.txt$", "") -- Remove .txt if present + blue_prints.most_recent_folder = folder + + blue_prints.construct_blueprint_steps(inputs, outputs, components, wires, labels, inputNodePos,outputNodePos) + + else + print("You are missing: ") + GUI.AddMessage('Not Enough Components', Color.Red) + for name, count in pairs(missing_components) do + if count > 0 then + print(name .. ": " .. count) + end + end + end + else + print("file not found") + print("saved designs:") + blue_prints.print_all_saved_files() + end +end + +function blue_prints.delayed_loading_complete_array_check() + local function allTrue(array) + for key, value in pairs(array) do + if value ~= true then + return false -- If any value is not true, return false + end + end + return true -- If the loop completes, all values are true + end + + local result = allTrue(has_load_completed_array) + if result then + GUI.AddMessage('Load Complete', Color.White) + print("Blueprint loading complete") + else + GUI.AddMessage('Loading Failed', Color.Red) + + local message_box = GUI.MessageBox('Load Failed', + 'Your circuit has failed to load. One of the load functions has failed to complete. Hit F3 for more details. \n \nTry loading it again. \n\nBarotrauma circuitbox code is sensitive to sending too many commands too fast. Try slowing things down with the delay slider (above the load button) and try again. This can help on laggy servers. \n \nIf the problem persists please report this bug on the steam workshop page. Include a download link to your saved blueprint file and a screenshot of your console text (you can see that by hitting F3)', + { 'OK' }) + + local ok_button = message_box.Buttons[0] or message_box.Buttons[1] + + ok_button.OnClicked = function() + message_box.Close() + end + + for key, value in pairs(has_load_completed_array) do + print(tostring(key) .. ": " .. tostring(value)) + end + end +end + +function blue_prints.delayed_loading_complete_unit_test() + if blue_prints.unit_tests_enabled then + xml_of_loaded_circuit = blue_prints.prepare_circuitbox_xml_for_saving() + --run a unit test here to make sure it works + local load_test_results = blue_prints.loading_complete_unit_test(path_to_loaded_file, xml_of_loaded_circuit) + print("Passed loading unit test: " .. tostring(load_test_results)) + + if load_test_results then + --GUI.AddMessage('Load Complete!', Color.White) + else + GUI.AddMessage('Load Failed!', Color.Red) + + local message_box = GUI.MessageBox('Load Failed', + 'Your circuit has failed to load.\n\nYour blueprint file might be from an earlier version of Blueprints and nothing is actually wrong. Try saving it again (overwriting the original) to update your blueprint file to the latest version.\n\nIf you are certain your file is up to date try loading it again. Do not move or change anything during loading: the loaded circuit must match the blueprint file EXACTLY in order for you not to see this message.\n\nThis also means if the inputs change any values in any component the unit test will also fail. Same thing if you have some value that changes over time, like RGB or timing values from an oscillator. So the circuit might still be ok, it just does not match your save exactly.\n\nBarotrauma circuitbox code is sensitive to sending too many commands too fast. Try slowing things down with the delay slider (above the load button) and try again.\n\nIf none of these exceptions apply and the problem persists please report this bug on the steam workshop page or the discord. Include a download link to your saved blueprint file and a screenshot of your console text (you can see that by hitting F3)', + { 'OK' }) + + local ok_button = message_box.Buttons[0] or message_box.Buttons[1] + + ok_button.OnClicked = function() + message_box.Close() + end + + for key, value in pairs(has_load_completed_array) do + print(tostring(key) .. ": " .. tostring(value)) + end + + end + end +end diff --git a/Blueprints/Lua/register_types.lua b/Blueprints/Lua/register_types.lua new file mode 100644 index 0000000..f5aa8d5 --- /dev/null +++ b/Blueprints/Lua/register_types.lua @@ -0,0 +1,19 @@ + + +--used to create netlimitedstrings +LuaUserData.RegisterType("Barotrauma.NetLimitedString") +blue_prints.net_limited_string_type = LuaUserData.CreateStatic("Barotrauma.NetLimitedString", true) + +--for accessing component values inside components +LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.Item"], "GetInGameEditableProperties") +LuaUserData.RegisterType("System.ValueTuple`2[System.Object,Barotrauma.SerializableProperty]") + +--used to create immutable arrays +LuaUserData.RegisterType("System.Collections.Immutable.ImmutableArray") +LuaUserData.RegisterType("System.Collections.Immutable.ImmutableArray`1") +blue_prints.immutable_array_type = LuaUserData.CreateStatic("System.Collections.Immutable.ImmutableArray", false) + +--register types for components not in lua yet +LuaUserData.RegisterType('Barotrauma.Items.Components.ConnectionSelectorComponent') +LuaUserData.RegisterType('Barotrauma.Items.Components.DemultiplexerComponent') +LuaUserData.RegisterType('Barotrauma.Items.Components.MultiplexerComponent') \ No newline at end of file diff --git a/Blueprints/Lua/save_blueprint.lua b/Blueprints/Lua/save_blueprint.lua new file mode 100644 index 0000000..562820c --- /dev/null +++ b/Blueprints/Lua/save_blueprint.lua @@ -0,0 +1,527 @@ +if SERVER then return end --prevents it from running on the server + + +-- Delimiter constants +local STRING_START = "<<>>" +local STRING_END = "<<>>" + +-- Encodes a string to be safely stored in XML attributes +local function encodeAttributeString(str) + if str == nil then return "" end + + -- First, escape any existing delimiters in the content + local escaped = str:gsub(STRING_START, "\\<<>>") + :gsub(STRING_END, "\\<<>>") + + -- Clean the string of control characters + escaped = blue_prints.clean_string(escaped) + + -- Wrap the escaped content with delimiters + return STRING_START .. escaped .. STRING_END +end + +-- Decodes a string that was stored in XML attributes +local function decodeAttributeString(str) + if str == nil then return "" end + + -- Check if the string has our delimiters + local content = str:match(STRING_START .. "(.-)" .. STRING_END) + if not content then + -- If no delimiters found, return original string (for backward compatibility) + return str + end + + -- Unescape any escaped delimiters + return content:gsub("\\<<>>", STRING_START) + :gsub("\\<<>>", STRING_END) +end + +local function processLabelStrings(xmlString) + -- Process header and body attributes in Label tags + return xmlString:gsub('(]-)(header="([^"]*)")', function(prefix, full, content) + return prefix .. 'header="' .. encodeAttributeString(content) .. '"' + end):gsub('(]-)(body="([^"]*)")', function(prefix, full, content) + return prefix .. 'body="' .. encodeAttributeString(content) .. '"' + end) +end + + +-- Function to process input/output node labels +local function processNodeLabels(xmlString) + -- Pattern to match InputNode or OutputNode sections + local function processNodeSection(nodeSection) + -- Process ConnectionLabelOverride tags within the node section + return nodeSection:gsub('(]-value=)"([^"]*)"', function(prefix, content) + -- Don't re-encode if already encoded + if content:match("^" .. STRING_START .. ".*" .. STRING_END .. "$") then + return prefix .. '"' .. content .. '"' + end + return prefix .. '"' .. encodeAttributeString(content) .. '"' + end) + end + + -- Process InputNode sections + xmlString = xmlString:gsub("()", processNodeSection) + + -- Process OutputNode sections + xmlString = xmlString:gsub("()", processNodeSection) + + return xmlString +end + + +-- Modified function to add encoded attributes to components +local function add_encoded_attribute_to_component(xmlContent, targetId, attributeName, attributeValue) + -- First encode the attribute value + local encodedValue = encodeAttributeString(attributeValue) + + -- Function to add the attribute to the specific Component element + local function modifyComponent(componentString) + local id = componentString:match('id="(%d+)"') + if id and tonumber(id) == targetId then + -- Create the full attribute string with the encoded value + local attributeStr = string.format('%s=%s', attributeName, encodedValue) + return componentString:gsub('/>$', ' ' .. blue_prints.escapePercent(attributeStr) .. ' />') + else + return componentString + end + end + + -- Find the CircuitBox element + local circuitBoxStart, circuitBoxEnd = xmlContent:find('') + local circuitBoxEndTag = xmlContent:find('', circuitBoxEnd) + if not circuitBoxStart or not circuitBoxEndTag then + print("CircuitBox element not found") + return xmlContent + end + + -- Extract the CircuitBox content + local circuitBoxContent = xmlContent:sub(circuitBoxEnd + 1, circuitBoxEndTag - 1) + + -- Modify the specific Component element + local modifiedCircuitBoxContent = circuitBoxContent:gsub('', modifyComponent) + + -- Replace the original CircuitBox content with the modified content + return xmlContent:sub(1, circuitBoxEnd) .. modifiedCircuitBoxContent .. xmlContent:sub(circuitBoxEndTag) +end + + + +-- Function to extract components and their IDs +local function extractComponents(xmlString) + local components = {} + for id, position in xmlString:gmatch(' tonumber(second_id) then + --print("comparing" .. first_id .. " to " .. second_id) + xmlContent = swap_lines_in_string(xmlContent, first_line_number, second_line_number) + something_in_xml_changed = true + end + end + + if something_in_xml_changed then return put_components_in_order(xmlContent) end + + --print(xmlContent) + + return xmlContent + +end + + +local function remove_attribute_from_components(xmlContent, attributeName) + -- Function to remove the specified attribute from a component + local function removeAttribute(componentString) + -- Pattern to match traditional XML attributes + local pattern1 = '%s*' .. attributeName .. '="[^"]+"' + + -- Pattern to match encoded strings with delimiters + local pattern2 = '%s*' .. attributeName .. '=<<>>[^<]*<<>>' + + -- Remove both types of attributes + local result = componentString:gsub(pattern1, '') + result = result:gsub(pattern2, '') + + return result + end + + -- Find all Component elements and process them + local function processComponents(content) + return content:gsub('', removeAttribute) + end + + -- Find the CircuitBox element + local circuitBoxStart, circuitBoxEnd = xmlContent:find('') + local circuitBoxEndTag = xmlContent:find('', circuitBoxEnd) + if not circuitBoxStart or not circuitBoxEndTag then + print("CircuitBox element not found") + return xmlContent + end + + -- Extract and process the CircuitBox content + local circuitBoxContent = xmlContent:sub(circuitBoxEnd + 1, circuitBoxEndTag - 1) + local modifiedCircuitBoxContent = processComponents(circuitBoxContent) + + -- Replace the original CircuitBox content with the modified content + return xmlContent:sub(1, circuitBoxEnd) .. modifiedCircuitBoxContent .. xmlContent:sub(circuitBoxEndTag) +end + + + + +local function clean_component_whitespace(xmlContent) + local function cleanComponent(componentString) + -- Don't touch anything between STRINGSTART and STRINGEND + local parts = {} + local lastPos = 1 + + -- Find start and end positions of all encoded strings + local startPos = componentString:find('<<>>', lastPos, true) + while startPos do + local endPos = componentString:find('<<>>', startPos, true) + if not endPos then break end + + -- Add the part before the encoded string + local beforePart = componentString:sub(lastPos, startPos - 1) + beforePart = beforePart:gsub('%s+', ' ') -- collapse multiple spaces to single space + table.insert(parts, beforePart) + + -- Add the encoded string unchanged + table.insert(parts, componentString:sub(startPos, endPos + 13)) + + lastPos = endPos + 14 + startPos = componentString:find('<<>>', lastPos, true) + end + + -- Add any remaining part after the last encoded string + if lastPos <= #componentString then + local remaining = componentString:sub(lastPos) + remaining = remaining:gsub('%s+', ' ') + table.insert(parts, remaining) + end + + return table.concat(parts) + end + + -- Find all Component tags and process them + local circuitBoxStart, circuitBoxEnd = xmlContent:find('') + local circuitBoxEndTag = xmlContent:find('', circuitBoxEnd) + if not circuitBoxStart or not circuitBoxEndTag then + return xmlContent + end + + local circuitBoxContent = xmlContent:sub(circuitBoxEnd + 1, circuitBoxEndTag - 1) + local modifiedContent = circuitBoxContent:gsub('', cleanComponent) + + return xmlContent:sub(1, circuitBoxEnd) .. modifiedContent .. xmlContent:sub(circuitBoxEndTag) +end + + + +-- Function to round a number to the nearest integer +local function round(num) + return math.floor(num + 0.5) +end + +-- Function to round the position and size attributes in a Label element +local function round_attributes(label) + -- Round the position attribute + if label:find('position="') then + local pos_x, pos_y = label:match('position="([^,]+),([^"]+)"') + local rounded_position = string.format('position="%d,%d"', round(tonumber(pos_x)), round(tonumber(pos_y))) + label = label:gsub('position="[^"]+"', rounded_position) + end + + -- Round the size attribute + if label:find('size="') then + local size_x, size_y = label:match('size="([^,]+),([^"]+)"') + local rounded_size = string.format('size="%d,%d"', round(tonumber(size_x)), round(tonumber(size_y))) + label = label:gsub('size="[^"]+"', rounded_size) + end + + if label:find('pos="') then + local pos_x, pos_y = label:match('pos="([^,]+),([^"]+)"') + local rounded_position = string.format('pos="%d,%d"', round(tonumber(pos_x)), round(tonumber(pos_y))) + label = label:gsub('pos="[^"]+"', rounded_position) + end + + return label +end + +-- Function to process the entire XML string +local function round_position_values(xml_string) + local processed_string = "" + + -- Process each line of the XML string + for line in xml_string:gmatch("[^\r\n]+") do + -- Find and process Label elements + if line:find(" 0 then + return files + end + + -- If that fails, try with alternate path format + success, files = pcall(function() + return File.GetFiles(path:gsub("LocalMods/", "local_mods/")) + end) + if success and files and #files > 0 then + return files + end + + -- If no files found, return empty table instead of nil + return {} +end + +-- Write file with platform compatibility +function blue_prints.writeFile(path, content) + path = blue_prints.normalizePath(path) + path = path:gsub("%s", "_") -- Replace spaces with underscores + + local file, err = io.open(path, "w") + if file then + file:write(content) + file:close() + return true + end + + -- Log the error + print("Failed to write file: " .. path .. " with error: " .. tostring(err)) + + -- Try alternate path if direct write fails + local alt_path = path:gsub("LocalMods/", "local_mods/") + file, err = io.open(alt_path, "w") + if file then + file:write(content) + file:close() + return true + end + + -- Log the error + print("Failed to write file: " .. alt_path .. " with error: " .. tostring(err)) + return false +end + +-- Debug helper function +function blue_prints.printSystemInfo() + print("Operating system: " .. (package.config:sub(1, 1) == '\\' and "Windows" or "Unix-like")) + print("Save path: " .. blue_prints.save_path) + print("Normalized save path: " .. blue_prints.normalizePath(blue_prints.save_path)) +end + +-- Creates a folder if it doesn't exist, handling platform-specific path issues +function blue_prints.createFolder(folderPath) + folderPath = blue_prints.normalizePath(folderPath) + + if not File.DirectoryExists(folderPath) then + -- Try creating with normalized path + local success = blue_prints.safeFileOperation(File.CreateDirectory, folderPath) + if not success then + -- Try alternate path format for different platforms + local alt_path = folderPath:gsub("LocalMods/", "local_mods/") + success = blue_prints.safeFileOperation(File.CreateDirectory, alt_path) + if not success then + print("Failed to create folder: " .. folderPath) + return false + end + end + end + return true +end + +-- Modified save function that handles folder paths +function blue_prints.saveWithFolder(provided_path, folder, content) + if not provided_path or not folder or not content then + print("Error: Missing required parameters for save") + return false + end + + -- Create a complete path including the folder + local fullPath + + -- If folder is [Root Directory], save directly in the base save path + if folder == "[Root Directory]" then + fullPath = blue_prints.save_path + else + -- Clean and normalize the folder name + folder = folder:gsub("[^%w%s%-_]", "") -- Remove special characters + folder = folder:gsub("%s+", "_") -- Replace spaces with underscores + fullPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folder) + end + + -- Ensure the folder exists + if not blue_prints.createFolder(fullPath) then + print("Error: Could not create or access folder: " .. folder) + return false + end + + -- Add .txt extension if not present + if not string.match(provided_path, "%.txt$") then + provided_path = provided_path .. ".txt" + end + + -- Create the full file path + local file_path = blue_prints.normalizePath(fullPath .. "/" .. provided_path) + + -- Write the file + if blue_prints.writeFile(file_path, content) then + print("Blueprint saved to " .. file_path) + return true + else + print("Error: Could not save blueprint") + return false + end +end + +-- Ensures the base blueprints directory exists +function blue_prints.ensureBaseDirectory() + local basePath = blue_prints.normalizePath(blue_prints.save_path) + if not File.DirectoryExists(basePath) then + local success = blue_prints.safeFileOperation(File.CreateDirectory, basePath) + if not success then + -- Try alternate path format + local alt_path = basePath:gsub("LocalMods/", "local_mods/") + success = blue_prints.safeFileOperation(File.CreateDirectory, alt_path) + if not success then + print("Failed to create base directory: " .. basePath) + return false + end + end + end + return true +end + +-- Gets all folders in the blueprints directory +function blue_prints.getFolders(path) + -- Ensure base directory exists first + if not blue_prints.ensureBaseDirectory() then + return {} + end + + path = blue_prints.normalizePath(path) + + local folders = {} + local success = pcall(function() + folders = File.GetDirectories(path) + end) + + if not success or not folders or #folders == 0 then + -- Try alternate path format + local alt_path = path:gsub("LocalMods/", "local_mods/") + success = pcall(function() + folders = File.GetDirectories(alt_path) + end) + end + + return folders or {} +end + +-- Gets list of folder names in a user-friendly format +function blue_prints.getFolderList() + local folders = blue_prints.getFolders(blue_prints.save_path) + local folderNames = { "[Root Directory]" } -- Allow saving in root directory + + for _, fullPath in pairs(folders) do + -- Extract just the folder name from the full path + local folderName = fullPath:match("([^/\\]+)$") + if folderName then + table.insert(folderNames, folderName) + end + end + + return folderNames +end + +-- Creates a new folder in the blueprints directory +function blue_prints.createNewFolder(folderName) + if not blue_prints.ensureBaseDirectory() then + return false, "Cannot create base directory" + end + + if not folderName or folderName == "" then + return false, "Invalid folder name" + end + + -- Clean the folder name + folderName = folderName:gsub("[^%w%s%-_]", ""):gsub("%s+", "_") + local folderPath = blue_prints.normalizePath(blue_prints.save_path .. "/" .. folderName) + + -- Check if folder already exists + if File.DirectoryExists(folderPath) then + return false, "Folder already exists" + end + + -- Create the folder + if blue_prints.createFolder(folderPath) then + return true, folderName + else + return false, "Failed to create folder" + end +end + + +-- Modified Directory Functions +function blue_prints.getDirectories(path) + path = blue_prints.normalizePath(path) + + -- Try to get directories with current path format + local success, dirs = pcall(function() return File.GetDirectories(path) end) + if success and dirs and #dirs > 0 then + return dirs + end + + -- If that fails, try with alternate path format + success, dirs = pcall(function() + return File.GetDirectories(path:gsub("LocalMods/", "local_mods/")) + end) + if success and dirs and #dirs > 0 then + return dirs + end + + -- If no directories found, return empty table instead of nil + return {} +end \ No newline at end of file diff --git a/Blueprints/Lua/utilities/safety_checks.lua b/Blueprints/Lua/utilities/safety_checks.lua new file mode 100644 index 0000000..33d1bd0 --- /dev/null +++ b/Blueprints/Lua/utilities/safety_checks.lua @@ -0,0 +1,156 @@ +if SERVER then return end --prevents it from running on the server + +function blue_prints.validate_blueprint_xml(xmlString) + if not xmlString then + return false, "No XML content provided" + end + + -- Check for required main elements + if not xmlString:match("") then + return false, "Missing CircuitBox element" + end + if not xmlString:match("]+>") then + return false, "Missing InputNode" + end + if not xmlString:match("]+>") then + return false, "Missing OutputNode" + end + + -- Validate input/output node positions + local inputNode = xmlString:match("]+>") + local outputNode = xmlString:match("]+>") + + if inputNode then + local posX, posY = inputNode:match('pos="([%d%.%-]+),([%d%.%-]+)"') + if not (posX and posY and tonumber(posX) and tonumber(posY)) then + return false, "Invalid InputNode position" + end + end + + if outputNode then + local posX, posY = outputNode:match('pos="([%d%.%-]+),([%d%.%-]+)"') + if not (posX and posY and tonumber(posX) and tonumber(posY)) then + return false, "Invalid OutputNode position" + end + end + + -- Validate components + for component in xmlString:gmatch('') do + -- Check required attributes + local id = component:match('id="(%d+)"') + local posX, posY = component:match('position="([%-%d%.]+),([%-%d%.]+)"') + + -- Check both old and new format for item and class + local item = component:match('item="([^"]+)"') or + component:match('item=<<>>([^<]+)<<>>') + local class = component:match('Class="([^"]+)"') or + component:match('Class=<<>>([^<]+)<<>>') + + if not (id and posX and posY and item and class) then + return false, "Invalid component definition - missing required attributes" + end + + -- Validate position values are numbers + if not (tonumber(posX) and tonumber(posY)) then + return false, "Invalid component position values" + end + + -- Validate ID is a number + if not tonumber(id) then + return false, "Invalid component ID" + end + + -- Check if item prefab exists + if item == "oscillatorcomponent" then item = "oscillator" + elseif item == "concatenationcomponent" then item = "concatcomponent" + elseif item == "exponentiationcomponent" then item = "powcomponent" + elseif item == "regexfind" then item = "regexcomponent" + elseif item == "signalcheck" then item = "signalcheckcomponent" + elseif item == "squareroot" then item = "squarerootcomponent" end + + local itemPrefab = ItemPrefab.GetItemPrefab(item) + if not itemPrefab then + return false, "Invalid item prefab: " .. tostring(item) + end + end + + -- Validate wire connections + for wire in xmlString:gmatch("") do + local id = wire:match('id="(%d+)"') + if not id or not tonumber(id) then + return false, "Invalid wire ID" + end + + -- Check wire prefab + local prefab = wire:match('prefab="([^"]+)"') + if not prefab then + return false, "Missing wire prefab" + end + + local wirePrefab = ItemPrefab.GetItemPrefab(prefab) + if not wirePrefab then + return false, "Invalid wire prefab: " .. tostring(prefab) + end + + -- Check connections + local fromName, fromTarget = wire:match('') do + local id = label:match('id="(%d+)"') + local posX, posY = label:match('position="([%d%.%-]+),([%d%.%-]+)"') + local sizeW, sizeH = label:match('size="([%d%.%-]+),([%d%.%-]+)"') + local color = label:match('color="([^"]+)"') + + if not (id and posX and posY and sizeW and sizeH and color) then + return false, "Invalid label definition - missing required attributes" + end + + -- Validate numeric values + if not (tonumber(posX) and tonumber(posY) and + tonumber(sizeW) and tonumber(sizeH)) then + return false, "Invalid label position or size values" + end + + -- Validate color format (basic check for hex color) + if not color:match("^#[0-9A-Fa-f]+$") then + return false, "Invalid label color format" + end + end + + -- If all checks pass + return true, "Blueprint XML is valid" +end + +function blue_prints.validate_blueprint_file(provided_path) + -- Add .txt extension if not present + if not string.match(provided_path, "%.txt$") then + provided_path = provided_path .. ".txt" + end + + -- Normalize the path + local file_path = blue_prints.normalizePath(blue_prints.save_path .. "/" .. provided_path) + + -- Try to read the file content using our safe read function + local xmlContent = blue_prints.readFileContents(file_path) + if not xmlContent then + return false, "Could not read file: " .. provided_path + end + + -- Use the XML string validator to check the content + return blue_prints.validate_blueprint_xml(xmlContent) +end \ No newline at end of file diff --git a/Blueprints/Lua/utilities/utilities.lua b/Blueprints/Lua/utilities/utilities.lua new file mode 100644 index 0000000..921a815 --- /dev/null +++ b/Blueprints/Lua/utilities/utilities.lua @@ -0,0 +1,439 @@ +if SERVER then return end --prevents it from running on the server + + + +function blue_prints.clean_string(str) + local cleaned = str + -- Common control characters + cleaned = cleaned:gsub("\r", "") -- Carriage Return + cleaned = cleaned:gsub("\n", "") -- Line Feed + cleaned = cleaned:gsub("\t", "") -- Tab + cleaned = cleaned:gsub("\f", "") -- Form Feed + cleaned = cleaned:gsub("\b", "") -- Backspace + cleaned = cleaned:gsub("\v", "") -- Vertical Tab + cleaned = cleaned:gsub("\a", "") -- Bell (Alert) + cleaned = cleaned:gsub("\027", "") -- Escape + cleaned = cleaned:gsub("\000", "") -- Null byte + cleaned = cleaned:gsub("\x1A", "") -- EOF (Control-Z) + cleaned = cleaned:gsub("%z", "") -- Additional null bytes + cleaned = cleaned:gsub("%c", "") -- Any remaining control characters + + -- Remove Unicode zero-width characters + cleaned = cleaned:gsub("\u{200B}", "") -- Zero-width space + cleaned = cleaned:gsub("\u{200C}", "") -- Zero-width non-joiner + cleaned = cleaned:gsub("\u{200D}", "") -- Zero-width joiner + cleaned = cleaned:gsub("\u{FEFF}", "") -- Zero-width no-break space (BOM) + + return cleaned +end + +function blue_prints.escapePercent(str) + return str:gsub("%%", "%%%%") +end + +function blue_prints.getScreenResolution() + if Screen and Screen.Selected and Screen.Selected.Cam then + return Screen.Selected.Cam.Resolution + end + return nil +end + + + +function blue_prints.get_description_from_xml(xmlString) + --remove all whitespace + local function trim(s) + return s:match("^%s*(.-)%s*$") + end + + -- Define both patterns + local newFormatPattern = ']-header="<<>>[dD][eE][sS][cC][rR][iI][pP][tT][iI][oO][nN]<<>>"[^>]-body="([^"]*)"[^>]*/>' + local oldFormatPattern = ']-header="[dD][eE][sS][cC][rR][iI][pP][tT][iI][oO][nN]"[^>]-body="([^"]*)"[^>]*/>' + + -- Try matching new format first + local body = xmlString:match(newFormatPattern) + + -- If not found, try old format + if not body then + body = xmlString:match(oldFormatPattern) + end + + if not body then + return nil + end + + --The trim(body) call takes the description text we found and removes any whitespace (spaces, tabs, newlines) from the beginning and end of the text before returning it. + return trim(body) +end + + + + +function blue_prints.get_component_count_from_xml(xmlString) + local count = 0 + for _ in xmlString:gmatch('') do + count = count + 1 + end + + return count +end + + + + + + +function blue_prints.get_xml_content_as_string_from_path(provided_path) + + -- Check if the filename already ends with .txt + if not string.match(provided_path, "%.txt$") then + -- Add .txt if it's not already present + provided_path = provided_path .. ".txt" + end + + local file_path = (blue_prints.save_path .. "/" .. provided_path) + local xmlContent, err = blue_prints.readFile(file_path) + + if xmlContent then + return xmlContent + else + print("file not found") + print("saved designs:") + blue_prints.print_all_saved_files() + end +end + + + + + +function blue_prints.print_requirements_of_circuit(provided_path) + + local xmlContent = blue_prints.get_xml_content_as_string_from_path(provided_path) + + if xmlContent then + -- In the usage section: + local inputs, outputs, components, wires, labels, inputNodePos, outputNodePos = blue_prints.parseXML(xmlContent) + + print("This circuit uses: ") + local identifierCounts = {} + + -- Count occurrences + for _, component in ipairs(components) do + --local prefab = ItemPrefab.GetItemPrefab(component.item) + local identifier = component.item + identifierCounts[identifier] = (identifierCounts[identifier] or 0) + 1 + end + + -- Print the counts + for identifier, count in pairs(identifierCounts) do + print(identifier .. ": " .. count) + end + end +end + + + +function blue_prints.check_what_is_needed_for_blueprint(provided_path) + + local xmlContent = blue_prints.get_xml_content_as_string_from_path(provided_path) + + if xmlContent then + -- In the usage section: + local inputs, outputs, components, wires, labels, inputNodePos, outputNodePos = blue_prints.parseXML(xmlContent) + + -- Check inventory for required components + local missing_components = blue_prints.check_inventory_for_requirements(components) + + local all_needed_items_are_present = true + for _, count in pairs(missing_components) do + if count > 0 then + all_needed_items_are_present = false + break + end + end + + if all_needed_items_are_present then + print("All required components are present!") + else + print("You are missing: ") + for name, count in pairs(missing_components) do + if count > 0 then + print(name .. ": " .. count) + end + end + print("You can also use an equivalent amount of FPGAs") + end + end + + +end + + +function blue_prints.get_components_currently_in_circuitbox(passed_circuitbox) + + local components = passed_circuitbox.GetComponentString("CircuitBox").Components + + local resourceCounts = {} + for i, component in pairs(components) do + --print(tostring(component.UsedResource.Identifier)) + resourceCounts[tostring(component.UsedResource.Identifier)] = (resourceCounts[tostring(component.UsedResource.Identifier)] or 0) + 1 + end + + return resourceCounts +end + + +function blue_prints.getFurthestRightElement(components, labels, inputNodePos, outputNodePos) + local furthestRight = {x = -math.huge, y = 0, element = nil, type = nil} + + local offset_adjustment = 256 + + -- Check components + for _, component in ipairs(components) do + if component.position.x + offset_adjustment > furthestRight.x then + furthestRight.x = component.position.x + offset_adjustment + furthestRight.y = component.position.y + furthestRight.element = component + furthestRight.type = "component" + end + end + + -- Check labels + for _, label in ipairs(labels) do + --print(label.header, label.size.width) + local rightEdge = label.position.x + (label.size.width / 2) + if rightEdge > furthestRight.x then + furthestRight.x = rightEdge + furthestRight.y = label.position.y + furthestRight.element = label + furthestRight.type = "label" + end + end + + -- Check input node + if inputNodePos and inputNodePos.x + offset_adjustment > furthestRight.x then --input and output nodes dont check width + furthestRight.x = inputNodePos.x + offset_adjustment + furthestRight.y = inputNodePos.y + furthestRight.element = inputNodePos + furthestRight.type = "inputNode" + end + + -- Check output node + if outputNodePos and outputNodePos.x + offset_adjustment > furthestRight.x then + furthestRight.x = outputNodePos.x + offset_adjustment + furthestRight.y = outputNodePos.y + furthestRight.element = outputNodePos + furthestRight.type = "outputNode" + end + + return furthestRight +end + + + +function blue_prints.print_all_saved_files() + local saved_files = blue_prints.getFiles(blue_prints.save_path) + + for name, value in pairs(saved_files) do + if string.match(value, "%.txt$") then + local filename = value:match("([^/\\]+)$") -- Match after last slash or backslash + local filename = string.gsub(filename, "%.txt$", "") --cut out the .txt at the end + + local xml_of_file = blue_prints.readFileContents(value) + local description_of_file = blue_prints.get_description_from_xml(xml_of_file) + local number_of_components_in_file = blue_prints.get_component_count_from_xml(xml_of_file) + + print("-------------") + + local print_string = '‖color:white‖' .. filename .. '‖end‖' .. " - (" .. number_of_components_in_file .. " fpgas) " + + if description_of_file ~= nil then + print_string = print_string .. " - " .. '‖color:yellow‖' .. description_of_file .. '‖end‖' + end + print(print_string) + end + end +end + + +function blue_prints.readFile(path) + local file = io.open(path, "r") + if not file then + return nil, "Failed to open file: " .. path + end + local content = file:read("*all") + file:close() + return content +end + + +function blue_prints.isInteger(str) + return str and not (str == "" or str:find("%D")) +end + +function blue_prints.isFloat(str) + local n = tonumber(str) + return n ~= nil and math.floor(n) ~= n +end + + + +function blue_prints.removeKeyFromTable(tbl, keyToRemove) + local newTable = {} + for k, v in pairs(tbl) do + if k ~= keyToRemove then + newTable[k] = v + end + end + return newTable +end + + + +function blue_prints.hexToRGBA(hex) + -- Remove the '#' if present + hex = hex:gsub("#", "") + + -- Check if it's a valid hex color + if #hex ~= 6 and #hex ~= 8 then + return nil, "Invalid hex color format" + end + + -- Convert hex to decimal + local r = tonumber(hex:sub(1, 2), 16) + local g = tonumber(hex:sub(3, 4), 16) + local b = tonumber(hex:sub(5, 6), 16) + local a = 255 + + -- If alpha channel is provided + if #hex == 8 then + a = tonumber(hex:sub(7, 8), 16) + end + + -- Return Color object + return Color(r, g, b, a) +end + + + + +function blue_prints.getNthValue(tbl, n) + local count = 0 + for key, value in pairs(tbl) do + count = count + 1 + if count == n then + return value + end + end + return nil -- Return nil if there are fewer than n items +end + + + + + + +function blue_prints.string_to_bool(passed_string) + -- Convert to lower case for case-insensitive comparison + local lower_string = string.lower(passed_string) + + -- Check for common true values + if lower_string == "true" or lower_string == "1" then + return true + elseif lower_string == "false" or lower_string == "0" then + return false + else + -- Handle unexpected cases (could also return nil or error) + error("Invalid string for boolean conversion: " .. passed_string) + end +end + + + +function blue_prints.get_circuit_box_lock_status() + -- First verify we have a selected circuitbox + if blue_prints.most_recent_circuitbox == nil then + print("No circuitbox detected") + return false + end + + -- Get the CircuitBox component + local circuit_box = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox") + if circuit_box == nil then + print("Could not find CircuitBox component") + return false + end + + -- Return true if either permanently or temporarily locked + return circuit_box.Locked or circuit_box.TemporarilyLocked +end +-- Usage example: +-- local is_locked = blue_prints.get_circuit_box_lock_status() + + + +function blue_prints.count_circuit_elements_in_box() + if blue_prints.most_recent_circuitbox == nil then + print("no circuitbox detected") + return 0, 0, 0 + end + + local circuit_box = blue_prints.most_recent_circuitbox.GetComponentString("CircuitBox") + + -- Initialize counts to 0 + local num_components = 0 + local num_labels = 0 + local num_wires = 0 + + -- Only count if the collections exist + if circuit_box.Components then + num_components = #circuit_box.Components + end + + if circuit_box.Labels then + num_labels = #circuit_box.Labels + end + + if circuit_box.Wires then + num_wires = #circuit_box.Wires + end + + return num_components, num_labels, num_wires +end + +function blue_prints.calculate_clear_delay() + -- Get current counts of all elements + local num_components, num_labels, num_wires = blue_prints.count_circuit_elements() + + -- Calculate individual delays for each type + local component_delay = 0 + local label_delay = 0 + local wire_delay = 0 + + -- Only calculate delays if we have elements to clear + if num_components > 0 then + component_delay = math.ceil(num_components / blue_prints.component_batch_size) * blue_prints.time_delay_between_loops + end + + if num_labels > 0 then + label_delay = math.ceil(num_labels / blue_prints.component_batch_size) * blue_prints.time_delay_between_loops + end + + if num_wires > 0 then + wire_delay = math.ceil(num_wires / blue_prints.component_batch_size) * blue_prints.time_delay_between_loops + end + + -- Get minimum delay and add buffer time + --wire delay doesnt matter because wires are automatically removed when comps are removed + --there is some extra buffer in there to account for wires directly from input to output + local time_delay = component_delay + label_delay + 500 + + return time_delay +end + +--save a reference to the most recently interacted circuit box +Hook.Patch("Barotrauma.Items.Components.CircuitBox", "AddToGUIUpdateList", function(instance, ptable) + blue_prints.most_recent_circuitbox = instance.Item +end, Hook.HookMethodType.After) + diff --git a/Blueprints/blueprints_logo.jpg b/Blueprints/blueprints_logo.jpg new file mode 100644 index 0000000..98500c1 Binary files /dev/null and b/Blueprints/blueprints_logo.jpg differ diff --git a/Blueprints/blueprints_logo_unzoomed.jpg b/Blueprints/blueprints_logo_unzoomed.jpg new file mode 100644 index 0000000..567416b Binary files /dev/null and b/Blueprints/blueprints_logo_unzoomed.jpg differ diff --git a/Blueprints/blueprints_logo_wide.jpg b/Blueprints/blueprints_logo_wide.jpg new file mode 100644 index 0000000..dd31096 Binary files /dev/null and b/Blueprints/blueprints_logo_wide.jpg differ diff --git a/Blueprints/blueprints_logo_wide_2.jpg b/Blueprints/blueprints_logo_wide_2.jpg new file mode 100644 index 0000000..c1d55af Binary files /dev/null and b/Blueprints/blueprints_logo_wide_2.jpg differ diff --git a/Blueprints/female_engineer.jpg b/Blueprints/female_engineer.jpg new file mode 100644 index 0000000..099a0b1 Binary files /dev/null and b/Blueprints/female_engineer.jpg differ diff --git a/Blueprints/female_engineer_upscaled.jpg b/Blueprints/female_engineer_upscaled.jpg new file mode 100644 index 0000000..2384b31 Binary files /dev/null and b/Blueprints/female_engineer_upscaled.jpg differ diff --git a/Blueprints/filelist.xml b/Blueprints/filelist.xml new file mode 100644 index 0000000..31e6adb --- /dev/null +++ b/Blueprints/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Blueprints/starter_blueprints/Ballast/ballast_flora_colored.txt b/Blueprints/starter_blueprints/Ballast/ballast_flora_colored.txt new file mode 100644 index 0000000..9ddcfd2 --- /dev/null +++ b/Blueprints/starter_blueprints/Ballast/ballast_flora_colored.txt @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>OrComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>orcomponent<<>> /> + >>SignalCheckComponent<<>> Output=<<>>4.5999985<<>> FalseOutput=<<>>-100<<>> TargetSignal=<<>>1<<>> item=<<>>signalcheckcomponent<<>> /> + >>ColorComponent<<>> UseHSV=<<>>false<<>> item=<<>>colorcomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>0.3<<>> item=<<>>memorycomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Doors/default_docking_hatch.txt b/Blueprints/starter_blueprints/Doors/default_docking_hatch.txt new file mode 100644 index 0000000..7c829a8 --- /dev/null +++ b/Blueprints/starter_blueprints/Doors/default_docking_hatch.txt @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>DelayComponent<<>> Delay=<<>>0.6000000238418579<<>> ResetWhenSignalReceived=<<>>false<<>> ResetWhenDifferentSignalReceived=<<>>false<<>> item=<<>>delaycomponent<<>> /> + >>DelayComponent<<>> Delay=<<>>1<<>> ResetWhenSignalReceived=<<>>true<<>> ResetWhenDifferentSignalReceived=<<>>true<<>> item=<<>>delaycomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Doors/guard_drowner.txt b/Blueprints/starter_blueprints/Doors/guard_drowner.txt new file mode 100644 index 0000000..b7cd1c2 --- /dev/null +++ b/Blueprints/starter_blueprints/Doors/guard_drowner.txt @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>DelayComponent<<>> Delay=<<>>8<<>> ResetWhenSignalReceived=<<>>false<<>> ResetWhenDifferentSignalReceived=<<>>true<<>> item=<<>>delaycomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>SignalCheckComponent<<>> Output=<<>>0<<>> FalseOutput=<<>><<>> TargetSignal=<<>>1<<>> item=<<>>signalcheckcomponent<<>> /> + >>SignalCheckComponent<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> TargetSignal=<<>>1<<>> item=<<>>signalcheckcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>DelayComponent<<>> Delay=<<>>8<<>> ResetWhenSignalReceived=<<>>false<<>> ResetWhenDifferentSignalReceived=<<>>true<<>> item=<<>>delaycomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>0<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Doors/self_closing_airlock.txt b/Blueprints/starter_blueprints/Doors/self_closing_airlock.txt new file mode 100644 index 0000000..b05f989 --- /dev/null +++ b/Blueprints/starter_blueprints/Doors/self_closing_airlock.txt @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>DelayComponent<<>> Delay=<<>>8<<>> ResetWhenSignalReceived=<<>>false<<>> ResetWhenDifferentSignalReceived=<<>>true<<>> item=<<>>delaycomponent<<>> /> + >>NotComponent<<>> ContinuousOutput=<<>>false<<>> item=<<>>notcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>><<>> item=<<>>andcomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Misc/countdown_timer.txt b/Blueprints/starter_blueprints/Misc/countdown_timer.txt new file mode 100644 index 0000000..5509ae8 --- /dev/null +++ b/Blueprints/starter_blueprints/Misc/countdown_timer.txt @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>SignalCheckComponent<<>> Output=<<>>11<<>> FalseOutput=<<>><<>> TargetSignal=<<>>1<<>> item=<<>>signalcheckcomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>0<<>> item=<<>>memorycomponent<<>> /> + >>OscillatorComponent<<>> OutputType=<<>>Pulse<<>> Frequency=<<>>1<<>> item=<<>>oscillator<<>> /> + >>SubtractComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>0<<>> TimeFrame=<<>>0<<>> item=<<>>subtractcomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Misc/on_the_blink.txt b/Blueprints/starter_blueprints/Misc/on_the_blink.txt new file mode 100644 index 0000000..a151e71 --- /dev/null +++ b/Blueprints/starter_blueprints/Misc/on_the_blink.txt @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>RegExFindComponent<<>> Output=<<>>1<<>> UseCaptureGroup=<<>>false<<>> OutputEmptyCaptureGroup=<<>>false<<>> FalseOutput=<<>>0<<>> ContinuousOutput=<<>>true<<>> Expression=<<>>^([0-9]|1[0-9])(?:\.[0-9]*)?$<<>> item=<<>>regexcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>OscillatorComponent<<>> OutputType=<<>>Square<<>> Frequency=<<>>1<<>> item=<<>>oscillator<<>> /> + >>MultiplexerComponent<<>> SelectedConnection=<<>>0<<>> WrapAround=<<>>true<<>> SkipEmptyConnections=<<>>true<<>> item=<<>>multiplexercomponent<<>> /> + >>OscillatorComponent<<>> OutputType=<<>>Pulse<<>> Frequency=<<>>200<<>> item=<<>>oscillator<<>> /> + >>DemultiplexerComponent<<>> SelectedConnection=<<>>4<<>> WrapAround=<<>>true<<>> SkipEmptyConnections=<<>>true<<>> item=<<>>demultiplexercomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Reactor/basic_reactor.txt b/Blueprints/starter_blueprints/Reactor/basic_reactor.txt new file mode 100644 index 0000000..4630d38 --- /dev/null +++ b/Blueprints/starter_blueprints/Reactor/basic_reactor.txt @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>DivideComponent<<>> ClampMax=<<>>100<<>> ClampMin=<<>>0<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>30<<>> item=<<>>memorycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>75<<>> item=<<>>memorycomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Reactor/overclock_auto_reactor.txt b/Blueprints/starter_blueprints/Reactor/overclock_auto_reactor.txt new file mode 100644 index 0000000..9d9c6a2 --- /dev/null +++ b/Blueprints/starter_blueprints/Reactor/overclock_auto_reactor.txt @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>1<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>0.10000000149011612<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>SubtractComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>subtractcomponent<<>> /> + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>2500<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>100<<>> ClampMin=<<>>15<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>1.0625<<>> item=<<>>memorycomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>50<<>> item=<<>>memorycomponent<<>> /> + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>80<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>GreaterComponent<<>> Output=<<>>1.15<<>> FalseOutput=<<>>0.85<<>> TimeFrame=<<>>0<<>> item=<<>>greatercomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>10<<>> item=<<>>memorycomponent<<>> /> + >>FunctionComponent<<>> item=<<>>abscomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Reactor/overclock_reactor.txt b/Blueprints/starter_blueprints/Reactor/overclock_reactor.txt new file mode 100644 index 0000000..a0a6e5b --- /dev/null +++ b/Blueprints/starter_blueprints/Reactor/overclock_reactor.txt @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>1<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>0.10000000149011612<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>SubtractComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>subtractcomponent<<>> /> + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>2500<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>100<<>> ClampMin=<<>>15<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>1.0625<<>> item=<<>>memorycomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>50<<>> item=<<>>memorycomponent<<>> /> + >>AdderComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>addercomponent<<>> /> + >>DivideComponent<<>> ClampMax=<<>>80<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>dividecomponent<<>> /> + >>MultiplyComponent<<>> ClampMax=<<>>999999<<>> ClampMin=<<>>-999999<<>> TimeFrame=<<>>0<<>> item=<<>>multiplycomponent<<>> /> + >>MemoryComponent<<>> Value=<<>>1.15<<>> item=<<>>memorycomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blueprints/starter_blueprints/Weapons/auto_discharge_new_style.txt b/Blueprints/starter_blueprints/Weapons/auto_discharge_new_style.txt new file mode 100644 index 0000000..23c6184 --- /dev/null +++ b/Blueprints/starter_blueprints/Weapons/auto_discharge_new_style.txt @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>OscillatorComponent<<>> OutputType=<<>>Pulse<<>> Frequency=<<>>0.25<<>> item=<<>>oscillator<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + >>AndComponent<<>> TimeFrame=<<>>0<<>> Output=<<>>1<<>> FalseOutput=<<>>0<<>> item=<<>>andcomponent<<>> /> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CsForBarotrauma/filelist.xml b/CsForBarotrauma/filelist.xml new file mode 100644 index 0000000..1145b0d --- /dev/null +++ b/CsForBarotrauma/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/EK_Revuk_Mk-I/EK_Revuk_Mk-I.sub b/EK_Revuk_Mk-I/EK_Revuk_Mk-I.sub new file mode 100644 index 0000000..05216dc --- /dev/null +++ b/EK_Revuk_Mk-I/EK_Revuk_Mk-I.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dab633f08d9acf6ef3c4ceecf8e4175a85f9b1be7d30fede942ef5b4b53dcd56 +size 291324 diff --git a/EK_Revuk_Mk-I/filelist.xml b/EK_Revuk_Mk-I/filelist.xml new file mode 100644 index 0000000..1719c09 --- /dev/null +++ b/EK_Revuk_Mk-I/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Fast Forward/CSharp/Client/Commands.cs b/Fast Forward/CSharp/Client/Commands.cs new file mode 100644 index 0000000..9bf4434 --- /dev/null +++ b/Fast Forward/CSharp/Client/Commands.cs @@ -0,0 +1,118 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +using Barotrauma; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; + +namespace FastForward +{ + public partial class Mod : IAssemblyPlugin + { + public static List addedCommands = new List(); + public static void addCommands() + { + addedCommands ??= new List(); + + addedCommands.Add(new DebugConsole.Command("fastforward", "fastforward [seconds]: Fast forwards the game by x seconds. Note that large numbers may cause a long freeze.", (string[] args) => + { + float seconds = 0; + if (args.Length > 0) { float.TryParse(args[0], out seconds); } + System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); + sw.Start(); + for (int i = 0; i < seconds * Timing.FixedUpdateRate; i++) + { + Screen.Selected?.Update(Timing.Step); + } + sw.Stop(); + DebugConsole.NewMessage($"Fast-forwarded by {seconds} seconds (took {sw.ElapsedMilliseconds / 1000.0f} s)."); + })); + + addedCommands.Add(new DebugConsole.Command("fastforward_key", "", (string[] args) => + { + if (args.Length > 0) + { + if (Enum.TryParse(typeof(Keys), args[0], out object k)) + { + FFPressKey = (Keys)k; + } + else + { + FFPressKey = Keys.None; + } + } + + log($"fastforward_key = {FFPressKey}"); + saveSettings(); + })); + + addedCommands.Add(new DebugConsole.Command("fastforward_togglekey", "", (string[] args) => + { + if (args.Length > 0) + { + if (Enum.TryParse(typeof(Keys), args[0], out object k)) + { + FFToggleKey = (Keys)k; + } + else + { + FFToggleKey = Keys.None; + } + + FFState = false; + } + + log($"fastforward_key = {FFToggleKey}"); + saveSettings(); + })); + + addedCommands.Add(new DebugConsole.Command("fastforward_speed", "", (string[] args) => + { + if (args.Length > 0) + { + if (int.TryParse(args[0], out int i)) + { + FFSpeed = i; + } + } + + log($"fastforward_speed = {FFSpeed}"); + saveSettings(); + })); + + addedCommands.Add(new DebugConsole.Command("printkeys", "", (string[] args) => + { + var values = typeof(Keys).GetEnumValues(); + foreach (var v in values) + { + log($"{(int)v} {v}"); + } + })); + + addedCommands.Add(new DebugConsole.Command("printcolors", "", (string[] args) => + { + foreach (PropertyInfo prop in typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public)) + { + log(prop, (Color)prop.GetValue(null)); + } + })); + + addedCommands.ForEach(c => DebugConsole.Commands.Add(c)); + } + + + + public static void removeCommands() + { + addedCommands.ForEach(c => DebugConsole.Commands.RemoveAll(which => which.Names.Contains(c.Names[0]))); + + addedCommands.Clear(); + addedCommands = null; + } + } +} \ No newline at end of file diff --git a/Fast Forward/CSharp/Client/GameMain.cs b/Fast Forward/CSharp/Client/GameMain.cs new file mode 100644 index 0000000..e8ac003 --- /dev/null +++ b/Fast Forward/CSharp/Client/GameMain.cs @@ -0,0 +1,35 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +using Barotrauma; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; + +namespace FastForward +{ + public partial class Mod : IAssemblyPlugin + { + public static void GameMain_Update_Postfix(GameTime gameTime, GameMain __instance) + { + bool ts = PlayerInput.GetKeyboardState.IsKeyDown(FFToggleKey); + if (!FFToggleKeyPressed && ts) + { + FFState = !FFState; + } + FFToggleKeyPressed = ts; + + if (FFState ^ PlayerInput.GetKeyboardState.IsKeyDown(FFPressKey) && !__instance.Paused) + { + for (int i = 0; i < FFSpeed - 1; i++) + { + Screen.Selected?.Update(Timing.Step); + } + } + } + } +} \ No newline at end of file diff --git a/Fast Forward/CSharp/Client/Mod.cs b/Fast Forward/CSharp/Client/Mod.cs new file mode 100644 index 0000000..cbe3ca3 --- /dev/null +++ b/Fast Forward/CSharp/Client/Mod.cs @@ -0,0 +1,57 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +using Barotrauma; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; +using System.IO; + +namespace FastForward +{ + public partial class Mod : IAssemblyPlugin + { + public Harmony harmony; + + public static Keys FFPressKey = Keys.Q; + public static Keys FFToggleKey = Keys.None; + public static bool FFToggleKeyPressed = false; + public static bool FFState = false; + public static int FFSpeed = 3; + + public void Initialize() + { + harmony = new Harmony("fastforward"); + + createFolders(); + loadSettings(); + saveSettings(); + + addCommands(); + + harmony.Patch( + original: typeof(GameMain).GetMethod("Update", AccessTools.all), + postfix: new HarmonyMethod(typeof(Mod).GetMethod("GameMain_Update_Postfix")) + ); + } + + public void Dispose() + { + harmony.UnpatchAll(harmony.Id); + harmony = null; + removeCommands(); + } + public void OnLoadCompleted() { } + public void PreInitPatching() { } + + public static void log(object msg, Color? cl = null, string line = "") + { + if (cl == null) cl = Color.Cyan; + LuaCsLogger.LogMessage($"{line}{msg ?? "null"}", cl, cl); + } + } +} \ No newline at end of file diff --git a/Fast Forward/CSharp/Client/Settings.cs b/Fast Forward/CSharp/Client/Settings.cs new file mode 100644 index 0000000..9ee860c --- /dev/null +++ b/Fast Forward/CSharp/Client/Settings.cs @@ -0,0 +1,73 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +using Barotrauma; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; +using System.IO; +using System.Xml.Linq; + +namespace FastForward +{ + public partial class Mod : IAssemblyPlugin + { + public static string ModSettingsFolder = "ModSettings\\"; + public static string SettingsFolder = "ModSettings\\Fast Forward\\"; + public static string SettingsFile = "ModSettings\\Fast Forward\\Settings.xml"; + + public static void createFolders() + { + if (!Directory.Exists(ModSettingsFolder)) Directory.CreateDirectory(ModSettingsFolder); + if (!Directory.Exists(SettingsFolder)) Directory.CreateDirectory(SettingsFolder); + } + + + public static void loadSettings() + { + try + { + if (!File.Exists(SettingsFile)) return; + + XElement ff = XDocument.Load(SettingsFile).Element("FastForward"); + if (ff == null) return; + + if (ff.Element("Key") != null) + { + if (Enum.TryParse(typeof(Keys), ff.Element("Key").Value, out object k)) + { + FFPressKey = (Keys)k; + } + } + + if (ff.Element("ToggleKey") != null) + { + if (Enum.TryParse(typeof(Keys), ff.Element("ToggleKey").Value, out object k)) + { + FFToggleKey = (Keys)k; + } + } + + if (ff.Element("Speed") != null) int.TryParse(ff.Element("Speed").Value, out FFSpeed); + + } + catch (Exception e) { log(e.Message, Color.Orange); } + } + + public static void saveSettings() + { + XElement root = new XElement("FastForward", + new XElement("Key", FFPressKey), + new XElement("ToggleKey", FFToggleKey), + new XElement("Speed", FFSpeed) + ); + + XDocument xdoc = new XDocument(root); + xdoc.Save(SettingsFile); + } + } +} \ No newline at end of file diff --git a/Fast Forward/CSharp/RunConfig.xml b/Fast Forward/CSharp/RunConfig.xml new file mode 100644 index 0000000..2237255 --- /dev/null +++ b/Fast Forward/CSharp/RunConfig.xml @@ -0,0 +1,5 @@ + + + None + Standard + \ No newline at end of file diff --git a/Fast Forward/filelist.xml b/Fast Forward/filelist.xml new file mode 100644 index 0000000..2d5c034 --- /dev/null +++ b/Fast Forward/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Afflictionicons.png b/Improved Husks/Afflictionicons.png new file mode 100644 index 0000000..e683d9f --- /dev/null +++ b/Improved Husks/Afflictionicons.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bce35f0d143711e3b1bd8e5c7b8b2ff4d717291969a0b8a27353ebbf7a0feaa +size 52015 diff --git a/Improved Husks/Afflictions.xml b/Improved Husks/Afflictions.xml new file mode 100644 index 0000000..8066d4f --- /dev/null +++ b/Improved Husks/Afflictions.xml @@ -0,0 +1,1208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimFast.xml b/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimFast.xml new file mode 100644 index 0000000..fdaa65f --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimSlow.xml b/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimSlow.xml new file mode 100644 index 0000000..d38907c --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/Animations/BonethresherhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Bonethresherhusk/Bonethresherhusk.xml b/Improved Husks/Characters/Bonethresherhusk/Bonethresherhusk.xml new file mode 100644 index 0000000..57e96a0 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/Bonethresherhusk.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Bonethresherhusk/Ragdolls/BonethresherhuskDefaultRagdoll.xml b/Improved Husks/Characters/Bonethresherhusk/Ragdolls/BonethresherhuskDefaultRagdoll.xml new file mode 100644 index 0000000..0f30e30 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/Ragdolls/BonethresherhuskDefaultRagdoll.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Bonethresherhusk/attack1.ogg b/Improved Husks/Characters/Bonethresherhusk/attack1.ogg new file mode 100644 index 0000000..688c63e --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80590e33058af0012373af75da4a7c922b283f4ea349796ff446096a4aeee60b +size 108440 diff --git a/Improved Husks/Characters/Bonethresherhusk/attack2.ogg b/Improved Husks/Characters/Bonethresherhusk/attack2.ogg new file mode 100644 index 0000000..1faacb8 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61cdeb965ccc7eddb146f2a74a439c0101510161da95a2ab32b0917ea5d74bc3 +size 121548 diff --git a/Improved Husks/Characters/Bonethresherhusk/damage1.ogg b/Improved Husks/Characters/Bonethresherhusk/damage1.ogg new file mode 100644 index 0000000..e97da8a --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa47ea514d5a2aaa5e7a9e0e2d83735a50e7f4852f99d3233c1982711257160b +size 76492 diff --git a/Improved Husks/Characters/Bonethresherhusk/damage2.ogg b/Improved Husks/Characters/Bonethresherhusk/damage2.ogg new file mode 100644 index 0000000..609c4a6 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3404ed2ae37f49c9023c4fe751c11aabd9b133673250e9e1e65f942aea5be236 +size 66596 diff --git a/Improved Husks/Characters/Bonethresherhusk/death1.ogg b/Improved Husks/Characters/Bonethresherhusk/death1.ogg new file mode 100644 index 0000000..e812f94 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec1292d7eb93c2d340c10ad781e445ed532b35fbcb982a75e50afb3b2f3b882b +size 105726 diff --git a/Improved Husks/Characters/Bonethresherhusk/death2.ogg b/Improved Husks/Characters/Bonethresherhusk/death2.ogg new file mode 100644 index 0000000..5aaa1a3 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f35f1142101453129b79540bfb45bacae2f87d584c8745ea3fa390f25ab95f4 +size 108390 diff --git a/Improved Husks/Characters/Bonethresherhusk/idle1.ogg b/Improved Husks/Characters/Bonethresherhusk/idle1.ogg new file mode 100644 index 0000000..2531923 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0941d0d74d6a3d3972153ed661ed026bdde0aaf3a901f787ee518fb4e8ebf325 +size 56989 diff --git a/Improved Husks/Characters/Bonethresherhusk/idle2.ogg b/Improved Husks/Characters/Bonethresherhusk/idle2.ogg new file mode 100644 index 0000000..75ac138 --- /dev/null +++ b/Improved Husks/Characters/Bonethresherhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a416e642c837567d754fb8faf3a50073bbed8d54e2a04fbd82241a60ef0ac64 +size 62781 diff --git a/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimFast.xml b/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimFast.xml new file mode 100644 index 0000000..cbf0d68 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimSlow.xml b/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimSlow.xml new file mode 100644 index 0000000..ec4cb87 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/Animations/CharybdishuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Charybdishusk/Charybdishusk.png b/Improved Husks/Characters/Charybdishusk/Charybdishusk.png new file mode 100644 index 0000000..4a201c5 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/Charybdishusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a325b3e0c50355493da3b9c589a990d72ef5d61c89a7e20113ee6230432d5c0e +size 5167265 diff --git a/Improved Husks/Characters/Charybdishusk/Charybdishusk.xml b/Improved Husks/Characters/Charybdishusk/Charybdishusk.xml new file mode 100644 index 0000000..7c96cf5 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/Charybdishusk.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Charybdishusk/Ragdolls/CharybdishuskDefaultRagdoll.xml b/Improved Husks/Characters/Charybdishusk/Ragdolls/CharybdishuskDefaultRagdoll.xml new file mode 100644 index 0000000..696e35e --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/Ragdolls/CharybdishuskDefaultRagdoll.xml @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Charybdishusk/attack1.ogg b/Improved Husks/Characters/Charybdishusk/attack1.ogg new file mode 100644 index 0000000..44aad59 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1bc081a0c32cc63749ec0c7f6202504a60d212185fa8e70f62150874ab739b6 +size 259697 diff --git a/Improved Husks/Characters/Charybdishusk/attack2.ogg b/Improved Husks/Characters/Charybdishusk/attack2.ogg new file mode 100644 index 0000000..7e799b2 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad057a4566a6efe0289cf36e7725f2e139c52ca13448ee49574d172cdacbcb31 +size 275054 diff --git a/Improved Husks/Characters/Charybdishusk/attack3.ogg b/Improved Husks/Characters/Charybdishusk/attack3.ogg new file mode 100644 index 0000000..fce12fc --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e701a4ca6a7281a1ead5a3f8e4bf2e2252db9fe6f596bf5b5230fd662c79d599 +size 264246 diff --git a/Improved Husks/Characters/Charybdishusk/damage1.ogg b/Improved Husks/Characters/Charybdishusk/damage1.ogg new file mode 100644 index 0000000..4c2236a --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e214d2264bb1d5535a81339d086ae0a774370193029e10c50861914e4c1cfd23 +size 46286 diff --git a/Improved Husks/Characters/Charybdishusk/damage2.ogg b/Improved Husks/Characters/Charybdishusk/damage2.ogg new file mode 100644 index 0000000..5f216b1 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3ba3b5f4555bd99432557b12d912e5ae013ad7e4bcb8891c914d033219a8cd1 +size 50066 diff --git a/Improved Husks/Characters/Charybdishusk/damage3.ogg b/Improved Husks/Characters/Charybdishusk/damage3.ogg new file mode 100644 index 0000000..15d2a2a --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8399c3961d0229451be5e19f09b3b51103b9854e00117e299df94ae47a0d96fa +size 53709 diff --git a/Improved Husks/Characters/Charybdishusk/death1.ogg b/Improved Husks/Characters/Charybdishusk/death1.ogg new file mode 100644 index 0000000..1d1d2a6 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4f1bcf62a465c24e6f88b98d606b2a7d6b19bb7ce4bbfb6c8004b2db46f0889 +size 237144 diff --git a/Improved Husks/Characters/Charybdishusk/death2.ogg b/Improved Husks/Characters/Charybdishusk/death2.ogg new file mode 100644 index 0000000..f68a0ae --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:803732933d51372a7fba7ab3f61662ae7dab6d0215c3d64461363950b2e89456 +size 308437 diff --git a/Improved Husks/Characters/Charybdishusk/idle1.ogg b/Improved Husks/Characters/Charybdishusk/idle1.ogg new file mode 100644 index 0000000..2ac9c86 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06dd9ebf2898844ef368973b164f5df76485652730f27fdf64fed668f218ff0e +size 245816 diff --git a/Improved Husks/Characters/Charybdishusk/idle2.ogg b/Improved Husks/Characters/Charybdishusk/idle2.ogg new file mode 100644 index 0000000..4fc7c69 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1657871c5060691e8354a9bdf1494dcf97bb4eaa1f34a26574d166ce0cfa7ac +size 274263 diff --git a/Improved Husks/Characters/Charybdishusk/idle3.ogg b/Improved Husks/Characters/Charybdishusk/idle3.ogg new file mode 100644 index 0000000..835a994 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f9d0e54ee952118f33498622d4e642a100dbf179221becb6f333ee463604f71 +size 343564 diff --git a/Improved Husks/Characters/Charybdishusk/spawnmonster.ogg b/Improved Husks/Characters/Charybdishusk/spawnmonster.ogg new file mode 100644 index 0000000..54d4b49 --- /dev/null +++ b/Improved Husks/Characters/Charybdishusk/spawnmonster.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b674618d607be060c3ea1b9a4a1d833759d89c7bf33ea4ebc83f379e3260a862 +size 96443 diff --git a/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimFast.xml b/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimFast.xml new file mode 100644 index 0000000..a0297c5 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimSlow.xml b/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimSlow.xml new file mode 100644 index 0000000..8f8841c --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/Animations/CoelanthhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Coelanthhusk/Coelanthhusk.xml b/Improved Husks/Characters/Coelanthhusk/Coelanthhusk.xml new file mode 100644 index 0000000..4fffba5 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/Coelanthhusk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Coelanthhusk/Ragdolls/CoelanthhuskDefaultRagdoll.xml b/Improved Husks/Characters/Coelanthhusk/Ragdolls/CoelanthhuskDefaultRagdoll.xml new file mode 100644 index 0000000..8ec3219 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/Ragdolls/CoelanthhuskDefaultRagdoll.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Coelanthhusk/attack1.ogg b/Improved Husks/Characters/Coelanthhusk/attack1.ogg new file mode 100644 index 0000000..9b18859 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:329c81d1ac92e603e26727532a762becfdae504d228003851c8b7aef0543be3f +size 256807 diff --git a/Improved Husks/Characters/Coelanthhusk/attack2.ogg b/Improved Husks/Characters/Coelanthhusk/attack2.ogg new file mode 100644 index 0000000..e51c420 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:714094f2e98e602d65fd29be476be8ec31b94fa01f3d4e0ffa695de738373675 +size 309181 diff --git a/Improved Husks/Characters/Coelanthhusk/coelanthhusk.png b/Improved Husks/Characters/Coelanthhusk/coelanthhusk.png new file mode 100644 index 0000000..bae8676 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/coelanthhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c70974baeb53d37fceaf2fe279e0114a3299c2d01b6aaf1c026afe585e75aa1 +size 512669 diff --git a/Improved Husks/Characters/Coelanthhusk/damage1.ogg b/Improved Husks/Characters/Coelanthhusk/damage1.ogg new file mode 100644 index 0000000..b61a21d --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e48e2a88a61a1911e57c24b6d984e46773fc7f160c08ed9416a904a8906f5ee +size 127752 diff --git a/Improved Husks/Characters/Coelanthhusk/damage2.ogg b/Improved Husks/Characters/Coelanthhusk/damage2.ogg new file mode 100644 index 0000000..19e3236 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95c201b1d456462ac7b28031add17824f79cf8ecea98bad9f882845bf6c94d54 +size 101233 diff --git a/Improved Husks/Characters/Coelanthhusk/death.ogg b/Improved Husks/Characters/Coelanthhusk/death.ogg new file mode 100644 index 0000000..d758801 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c434546027fd17f527c5952cf81a3effd777aeec93c6a3ff30779f5f0d1f7bb9 +size 388825 diff --git a/Improved Husks/Characters/Coelanthhusk/idle1.ogg b/Improved Husks/Characters/Coelanthhusk/idle1.ogg new file mode 100644 index 0000000..93077ed --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d838ce83c361686016e1463c5545cf976d279f4fbeec4dfa80671f92d8a1ba16 +size 151383 diff --git a/Improved Husks/Characters/Coelanthhusk/idle2.ogg b/Improved Husks/Characters/Coelanthhusk/idle2.ogg new file mode 100644 index 0000000..8909576 --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f4680966417920d20b57b0faaa80c561209f00e876bb610149ff25997df50ca +size 147975 diff --git a/Improved Husks/Characters/Coelanthhusk/idle3.ogg b/Improved Husks/Characters/Coelanthhusk/idle3.ogg new file mode 100644 index 0000000..05569ab --- /dev/null +++ b/Improved Husks/Characters/Coelanthhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d101c2f3c541b74c480715f540581e84a45b320604b8a6483b259dea6f5874c2 +size 154714 diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskRun.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskRun.xml new file mode 100644 index 0000000..1361bc4 --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimFast.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimFast.xml new file mode 100644 index 0000000..9c34e05 --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimSlow.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimSlow.xml new file mode 100644 index 0000000..1d0299a --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskWalk.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskWalk.xml new file mode 100644 index 0000000..3fdb05e --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Animations/Crawler_hatchlinghuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Crawler_hatchlinghusk.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Crawler_hatchlinghusk.xml new file mode 100644 index 0000000..ed280c9 --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Crawler_hatchlinghusk.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/Ragdolls/Crawler_hatchlinghuskDefaultRagdoll.xml b/Improved Husks/Characters/Crawler_hatchlinghusk/Ragdolls/Crawler_hatchlinghuskDefaultRagdoll.xml new file mode 100644 index 0000000..ad539a9 --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/Ragdolls/Crawler_hatchlinghuskDefaultRagdoll.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawler_hatchlinghusk/crawlerhatchlinghusk.png b/Improved Husks/Characters/Crawler_hatchlinghusk/crawlerhatchlinghusk.png new file mode 100644 index 0000000..cbc337d --- /dev/null +++ b/Improved Husks/Characters/Crawler_hatchlinghusk/crawlerhatchlinghusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cad533828c79dc2761637c2c306cc158be6e2ca11934c0e63d3d15138664890 +size 111445 diff --git a/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskRun.xml b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskRun.xml new file mode 100644 index 0000000..2eb46c8 --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimFast.xml b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimFast.xml new file mode 100644 index 0000000..fb295d7 --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimSlow.xml b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimSlow.xml new file mode 100644 index 0000000..190609e --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskWalk.xml b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskWalk.xml new file mode 100644 index 0000000..999653f --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Animations/CrawlerhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/Crawlerhusk.xml b/Improved Husks/Characters/Crawlerhusk/Crawlerhusk.xml new file mode 100644 index 0000000..dc22648 --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Crawlerhusk.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/Ragdolls/CrawlerhuskDefaultRagdoll.xml b/Improved Husks/Characters/Crawlerhusk/Ragdolls/CrawlerhuskDefaultRagdoll.xml new file mode 100644 index 0000000..1a67864 --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/Ragdolls/CrawlerhuskDefaultRagdoll.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Crawlerhusk/crawlerhusk.png b/Improved Husks/Characters/Crawlerhusk/crawlerhusk.png new file mode 100644 index 0000000..5356bc7 --- /dev/null +++ b/Improved Husks/Characters/Crawlerhusk/crawlerhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26e8e6aedc4a0e06569d6c322c77d3c9f1c8fe4129bf83907533da47b0f9db93 +size 143407 diff --git a/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimFast.xml b/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimFast.xml new file mode 100644 index 0000000..3a9724f --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimSlow.xml b/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimSlow.xml new file mode 100644 index 0000000..7941cdf --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Animations/EndwormhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhusk/Endwormhusk.png b/Improved Husks/Characters/Endwormhusk/Endwormhusk.png new file mode 100644 index 0000000..8d6c00b --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Endwormhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d0a82e95b797479e520084a9068641ac772f2739d99080b4bb00631fa9436a4 +size 6827514 diff --git a/Improved Husks/Characters/Endwormhusk/Endwormhusk.xml b/Improved Husks/Characters/Endwormhusk/Endwormhusk.xml new file mode 100644 index 0000000..c603d23 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Endwormhusk.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhusk/Head.png b/Improved Husks/Characters/Endwormhusk/Head.png new file mode 100644 index 0000000..e0c6cc5 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Head.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc8bb8ccfbd0ac0411fbc53defe150b263183947ce3d72196b90b53d980c1f89 +size 374896 diff --git a/Improved Husks/Characters/Endwormhusk/Ragdolls/EndwormhuskDefaultRagdoll.xml b/Improved Husks/Characters/Endwormhusk/Ragdolls/EndwormhuskDefaultRagdoll.xml new file mode 100644 index 0000000..7d77b25 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/Ragdolls/EndwormhuskDefaultRagdoll.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhusk/attack1.ogg b/Improved Husks/Characters/Endwormhusk/attack1.ogg new file mode 100644 index 0000000..704b200 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec29df079dcaf2db16e0fa44fb2f56d084ec37c78b3efbac821d904ba3b3211 +size 311505 diff --git a/Improved Husks/Characters/Endwormhusk/attack2.ogg b/Improved Husks/Characters/Endwormhusk/attack2.ogg new file mode 100644 index 0000000..4f38a77 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50b20eeb421d793010d7cf3aabe68addf5452fb72a841aa65bccb84f048c5f84 +size 267411 diff --git a/Improved Husks/Characters/Endwormhusk/attack3.ogg b/Improved Husks/Characters/Endwormhusk/attack3.ogg new file mode 100644 index 0000000..92fd6e0 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f28cf6df86633ac0c58ccd855d5a57356500d3f5e76f172761a38d9a977176bc +size 328979 diff --git a/Improved Husks/Characters/Endwormhusk/damage1.ogg b/Improved Husks/Characters/Endwormhusk/damage1.ogg new file mode 100644 index 0000000..cbf3855 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:615daf51f28c654ec4189cf142f5a1a578b0a0cf79063622d68cb18ce204b41b +size 85562 diff --git a/Improved Husks/Characters/Endwormhusk/damage2.ogg b/Improved Husks/Characters/Endwormhusk/damage2.ogg new file mode 100644 index 0000000..510df32 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a3408ecf605a323adabd79309e3ee727cbd8e6b69a787b18fb12403d1238dc7 +size 94767 diff --git a/Improved Husks/Characters/Endwormhusk/damage3.ogg b/Improved Husks/Characters/Endwormhusk/damage3.ogg new file mode 100644 index 0000000..bfe5a70 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aaf29e62ae114259fe93cec7ca7624e56ae16d1887efdb881f0009fd8827886 +size 140064 diff --git a/Improved Husks/Characters/Endwormhusk/death1.ogg b/Improved Husks/Characters/Endwormhusk/death1.ogg new file mode 100644 index 0000000..1179f45 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8215cffb07d4eee4084cefb6daa4cee9173a04a59081233a293a4d066eb86ba3 +size 177379 diff --git a/Improved Husks/Characters/Endwormhusk/death2.ogg b/Improved Husks/Characters/Endwormhusk/death2.ogg new file mode 100644 index 0000000..d56bacc --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ba2209e327716a27e631450dcf1564026085d5e4d68bb4fe79a9701ca8c35cc +size 204731 diff --git a/Improved Husks/Characters/Endwormhusk/endwormacidexplosion.ogg b/Improved Husks/Characters/Endwormhusk/endwormacidexplosion.ogg new file mode 100644 index 0000000..772176a --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/endwormacidexplosion.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16d6e3049788b5d38a1f973abf501540770e2984a03b1a4b970e9b165a4a72cd +size 147771 diff --git a/Improved Husks/Characters/Endwormhusk/husk_ambience.ogg b/Improved Husks/Characters/Endwormhusk/husk_ambience.ogg new file mode 100644 index 0000000..f9a66fe --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/husk_ambience.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bd947ff901f91d8e4efac5278a40bf4785408cc5ec10bd08f8dd959fd70acb2 +size 2547396 diff --git a/Improved Husks/Characters/Endwormhusk/idle1.ogg b/Improved Husks/Characters/Endwormhusk/idle1.ogg new file mode 100644 index 0000000..3bdc937 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60da1f63de160318d05a1aa462ee1dd8cda4248ea6aec83d02b547d09dbd3e85 +size 267209 diff --git a/Improved Husks/Characters/Endwormhusk/idle2.ogg b/Improved Husks/Characters/Endwormhusk/idle2.ogg new file mode 100644 index 0000000..a304af4 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d29e51f9118e9eaf984a9426b289c844349d316db0f095ef5d5a578ccb638819 +size 285215 diff --git a/Improved Husks/Characters/Endwormhusk/idle3.ogg b/Improved Husks/Characters/Endwormhusk/idle3.ogg new file mode 100644 index 0000000..64c3610 --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6fb241b6e1d5c31cfd41bd301dbd05d97480a327307f2bf27b4cb4cab17c1df +size 260208 diff --git a/Improved Husks/Characters/Endwormhusk/spit.ogg b/Improved Husks/Characters/Endwormhusk/spit.ogg new file mode 100644 index 0000000..084bc1a --- /dev/null +++ b/Improved Husks/Characters/Endwormhusk/spit.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:decda438307da9680c427304596097b97b17c7db64778ad6abe405a4e065fbba +size 101515 diff --git a/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimFast.xml b/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimFast.xml new file mode 100644 index 0000000..8472dea --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimSlow.xml b/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimSlow.xml new file mode 100644 index 0000000..d4d1cb9 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/Animations/EndwormhuskheadSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhuskhead/Endwormhuskhead.xml b/Improved Husks/Characters/Endwormhuskhead/Endwormhuskhead.xml new file mode 100644 index 0000000..dee18c4 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/Endwormhuskhead.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhuskhead/Ragdolls/EndwormhuskheadDefaultRagdoll.xml b/Improved Husks/Characters/Endwormhuskhead/Ragdolls/EndwormhuskheadDefaultRagdoll.xml new file mode 100644 index 0000000..7d8b6d3 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/Ragdolls/EndwormhuskheadDefaultRagdoll.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Endwormhuskhead/headattack1.ogg b/Improved Husks/Characters/Endwormhuskhead/headattack1.ogg new file mode 100644 index 0000000..208de3e --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headattack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7906637018c8871d392cefc266488763bbf2d32033df8f6edd722ab711b9e138 +size 138089 diff --git a/Improved Husks/Characters/Endwormhuskhead/headattack2.ogg b/Improved Husks/Characters/Endwormhuskhead/headattack2.ogg new file mode 100644 index 0000000..47bd629 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headattack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:049848266abb70ba74a850459807a4bf938ef5af61af2e66cfd93326fc784816 +size 199713 diff --git a/Improved Husks/Characters/Endwormhuskhead/headattack3.ogg b/Improved Husks/Characters/Endwormhuskhead/headattack3.ogg new file mode 100644 index 0000000..4a642ac --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headattack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c93584b22037dd17eb750c5805fb889cd86b618e6e12ccbba0a192c6187fbee0 +size 235594 diff --git a/Improved Husks/Characters/Endwormhuskhead/headidle1.ogg b/Improved Husks/Characters/Endwormhuskhead/headidle1.ogg new file mode 100644 index 0000000..e03fab4 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headidle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef61a87ab3f2a32573d253383ddce12110e3ab92c0cd72485c0196fcf3022b75 +size 114529 diff --git a/Improved Husks/Characters/Endwormhuskhead/headidle2.ogg b/Improved Husks/Characters/Endwormhuskhead/headidle2.ogg new file mode 100644 index 0000000..fe7c753 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headidle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f86bfef12edc9240cd4330b068a3822d2df9439945e111c0b1a8cc6a2b3c6a9 +size 86588 diff --git a/Improved Husks/Characters/Endwormhuskhead/headidle3.ogg b/Improved Husks/Characters/Endwormhuskhead/headidle3.ogg new file mode 100644 index 0000000..32ae69b --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headidle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:003d0ac5e294a7cecfed290f3415a4086c6a2ba0d94ab3c65b00b1ebc304c395 +size 108011 diff --git a/Improved Husks/Characters/Endwormhuskhead/headidle4.ogg b/Improved Husks/Characters/Endwormhuskhead/headidle4.ogg new file mode 100644 index 0000000..9ce6545 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headidle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e47cda9db94e33060286db8cbaeb763930931e3a006ec29e8a9b53302ef4e1e +size 120207 diff --git a/Improved Husks/Characters/Endwormhuskhead/headidle5.ogg b/Improved Husks/Characters/Endwormhuskhead/headidle5.ogg new file mode 100644 index 0000000..210c008 --- /dev/null +++ b/Improved Husks/Characters/Endwormhuskhead/headidle5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d281c14274a227fee912db1144fc5621b17021c24d31a33744a7907e7b174e81 +size 118453 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimFast.xml b/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimFast.xml new file mode 100644 index 0000000..efbc9be --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimSlow.xml b/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimSlow.xml new file mode 100644 index 0000000..0a587e0 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/Animations/HammerheadgoldhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.png b/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.png new file mode 100644 index 0000000..e87ad57 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97d2605f40cd673e547d02405d4cd337dd53e1ec6b5998065efc502e1d00da5c +size 415446 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.xml b/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.xml new file mode 100644 index 0000000..79aa4b8 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/Hammerheadgoldhusk.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/Ragdolls/HammerheadgoldhuskDefaultRagdoll.xml b/Improved Husks/Characters/Hammerheadgoldhusk/Ragdolls/HammerheadgoldhuskDefaultRagdoll.xml new file mode 100644 index 0000000..1a7385c --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/Ragdolls/HammerheadgoldhuskDefaultRagdoll.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/attack1.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/attack1.ogg new file mode 100644 index 0000000..8144717 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f933dbdb8de2954073c0fc37e9a1959de498c843e4611a99da19efb7a74d32c3 +size 62982 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/attack2.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/attack2.ogg new file mode 100644 index 0000000..82c1ec0 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa6e088ba5d4ada4cf2b4a5b4bc1d289221caa09daf993f05bed44576cf5e978 +size 69443 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/attack3.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/attack3.ogg new file mode 100644 index 0000000..3b0f39d --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cee10f1ae1da0bea35af348d553da7af5c28f0eb8b887f686385546d0260d85 +size 54866 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/attack4.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/attack4.ogg new file mode 100644 index 0000000..5646bca --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/attack4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:306931f3a8e855f9df8261c1e0f72eb35f96b9305710d948f3aec451c073620e +size 49444 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/damage1.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/damage1.ogg new file mode 100644 index 0000000..16b449d --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c9fe70ec18ffe8fe3626c674fb5b60996f1151c3c88c2cf86349cbef433d43c +size 63377 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/damage2.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/damage2.ogg new file mode 100644 index 0000000..81c0a98 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b66b6181401eb838d4d093515c73ccb3eac52719536ad0753999035ed074aee5 +size 62662 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/damage3.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/damage3.ogg new file mode 100644 index 0000000..db71466 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80ec0ace0785918705e3b4d21d213e3754d4e6d9ea8981f91739ae822aa6f3c0 +size 63170 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/damage4.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/damage4.ogg new file mode 100644 index 0000000..5a314b8 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/damage4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1703ae2ec48019a0d0b99e80736cd53117f7b31b49931801ce44f46f57d72cc5 +size 53746 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/death1.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/death1.ogg new file mode 100644 index 0000000..f922ffb --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f951baae2f018760669022a11b2a7f347ed1e8998344262e2119260e5e9afc9 +size 96632 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/death2.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/death2.ogg new file mode 100644 index 0000000..aa1153f --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0b2148e72eb9d31150be4b9416eb0c99765819980990e1e8e4b221166fe0a63 +size 91083 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/death3.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/death3.ogg new file mode 100644 index 0000000..33851b4 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/death3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a649d3fb6e8e7737927626430900416d59b48d81692d1fe5d310d6b918e9583 +size 88494 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/idle1.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/idle1.ogg new file mode 100644 index 0000000..f3a656a --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16c8dec35a38bb2c7d6a80e25413e1e6e75cd76cfcf5b9b6eea0c184bdbfedde +size 108197 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/idle2.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/idle2.ogg new file mode 100644 index 0000000..3a3fa99 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd396e426e84b0ce3a4d197920bea3703d0020f55cf9ae8a9c0f4d7884a64903 +size 80699 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/idle3.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/idle3.ogg new file mode 100644 index 0000000..fc6b7a0 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:757decb93119ac72a61011867a9762a98bf5e6ebaad87934a96be529491c2508 +size 96352 diff --git a/Improved Husks/Characters/Hammerheadgoldhusk/idle4.ogg b/Improved Husks/Characters/Hammerheadgoldhusk/idle4.ogg new file mode 100644 index 0000000..77364c6 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadgoldhusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:620927660f87115477d0482add89086378040452be54e00fff52cc2a5bc369ba +size 81258 diff --git a/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimFast.xml b/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimFast.xml new file mode 100644 index 0000000..23048e6 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimSlow.xml b/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimSlow.xml new file mode 100644 index 0000000..8e79d8c --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/Animations/HammerheadhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.png b/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.png new file mode 100644 index 0000000..08bd120 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dd7caaef65a3741e363318499bfadf161b2193194146c93dbd44033da7c04dc +size 423528 diff --git a/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.xml b/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.xml new file mode 100644 index 0000000..733ad68 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/Hammerheadhusk.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadhusk/Ragdolls/HammerheadhuskDefaultRagdoll.xml b/Improved Husks/Characters/Hammerheadhusk/Ragdolls/HammerheadhuskDefaultRagdoll.xml new file mode 100644 index 0000000..f76c299 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/Ragdolls/HammerheadhuskDefaultRagdoll.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadhusk/attack1.ogg b/Improved Husks/Characters/Hammerheadhusk/attack1.ogg new file mode 100644 index 0000000..bd11bee --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07da7e055601fed97e762ee8f314aa7658304cc3b841eb03755ace5909b5ffab +size 51502 diff --git a/Improved Husks/Characters/Hammerheadhusk/attack2.ogg b/Improved Husks/Characters/Hammerheadhusk/attack2.ogg new file mode 100644 index 0000000..6d07a39 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe9ef4eaa25cac951f5dbea0e1672a6e7a6eace010a2b73f6e118dae0525049c +size 49732 diff --git a/Improved Husks/Characters/Hammerheadhusk/attack3.ogg b/Improved Husks/Characters/Hammerheadhusk/attack3.ogg new file mode 100644 index 0000000..42901ba --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b400032dc9a505eb8c39060f0b1b36dfd7c8e2e99d24820299174774f0e448f +size 53992 diff --git a/Improved Husks/Characters/Hammerheadhusk/damage1.ogg b/Improved Husks/Characters/Hammerheadhusk/damage1.ogg new file mode 100644 index 0000000..1649f13 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:815b8986438cdcc78ac433c106f37e3f7e1c146bad6277c3c83943befe2dde93 +size 46318 diff --git a/Improved Husks/Characters/Hammerheadhusk/damage2.ogg b/Improved Husks/Characters/Hammerheadhusk/damage2.ogg new file mode 100644 index 0000000..85993f9 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d34ffcb6364cb21a73ba82c14da0fad60f8d18028726cf4eb69d71973a410d0 +size 56514 diff --git a/Improved Husks/Characters/Hammerheadhusk/damage3.ogg b/Improved Husks/Characters/Hammerheadhusk/damage3.ogg new file mode 100644 index 0000000..92c2835 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:061b0654484b1e2fc4670a0849bf1406d733dfa2f119f16a8922cd2a50b24777 +size 60365 diff --git a/Improved Husks/Characters/Hammerheadhusk/death1.ogg b/Improved Husks/Characters/Hammerheadhusk/death1.ogg new file mode 100644 index 0000000..e58f37b --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0499ea69d31ac550eee3a2cca861bb4e1bb2f0f736f73dfd52ce75101d44bf64 +size 113562 diff --git a/Improved Husks/Characters/Hammerheadhusk/death2.ogg b/Improved Husks/Characters/Hammerheadhusk/death2.ogg new file mode 100644 index 0000000..0d77938 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd6a8744253d2977dbb17f094de93d449cd726f02fd50b9365d5cc5afcca04b4 +size 106674 diff --git a/Improved Husks/Characters/Hammerheadhusk/idle1.ogg b/Improved Husks/Characters/Hammerheadhusk/idle1.ogg new file mode 100644 index 0000000..5b58fce --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a541298c0e499b9e0394d0b79aa0624710835082789ccc1323dcef7dc625c3c5 +size 55505 diff --git a/Improved Husks/Characters/Hammerheadhusk/idle2.ogg b/Improved Husks/Characters/Hammerheadhusk/idle2.ogg new file mode 100644 index 0000000..15c6f88 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbd9cb83936c7106d8694b29f491b8e97d641c77bef4dce6d44bc03c6e64d01e +size 48402 diff --git a/Improved Husks/Characters/Hammerheadhusk/idle3.ogg b/Improved Husks/Characters/Hammerheadhusk/idle3.ogg new file mode 100644 index 0000000..206c8ba --- /dev/null +++ b/Improved Husks/Characters/Hammerheadhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d6eac4ad7763fb76587cc84ffc8067305e351269b61091a2c75ec7bab6864d1 +size 71466 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimFast.xml b/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimFast.xml new file mode 100644 index 0000000..d9688c1 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimSlow.xml b/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimSlow.xml new file mode 100644 index 0000000..9dbfe54 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/Animations/HammerheadmatriarchhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.png b/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.png new file mode 100644 index 0000000..b4ef375 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a482d3aaf36d3416752e0b6f9c36efd36f8018e9d0eb07bdd90443b8ec4ad752 +size 4105449 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.xml b/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.xml new file mode 100644 index 0000000..74fdcb5 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/Hammerheadmatriarchhusk.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/Ragdolls/HammerheadmatriarchhuskDefaultRagdoll.xml b/Improved Husks/Characters/Hammerheadmatriarchhusk/Ragdolls/HammerheadmatriarchhuskDefaultRagdoll.xml new file mode 100644 index 0000000..b5e6687 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/Ragdolls/HammerheadmatriarchhuskDefaultRagdoll.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/attack1.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/attack1.ogg new file mode 100644 index 0000000..c2c3e2f --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44060a2eeb6fba02844a3a3c17179bd4f55bb7234337b039495f0fef207b48af +size 244946 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/attack2.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/attack2.ogg new file mode 100644 index 0000000..93653cb --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41c86265e52e24813af6651ecda7c7b511762ee74f8aaf24009e9d034c615b9a +size 181537 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/damage1.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/damage1.ogg new file mode 100644 index 0000000..9673fc8 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:820cc260dd5cbddfc2cea00068e7800192edc18724308493a0b0721ac6eda516 +size 250811 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/damage2.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/damage2.ogg new file mode 100644 index 0000000..593f25b --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3bdce88402dbfe47a6b5add1c70492999763dc4b54bd2ebd3d63bd429ac5e98 +size 201065 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/death.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/death.ogg new file mode 100644 index 0000000..6e4e36e --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52dfe419312fa53d3d4a830e049d986c64c547466a7c1694b9bbd190381a3172 +size 332771 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/idle1.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle1.ogg new file mode 100644 index 0000000..f0d173d --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e251bf77de74404a842bedbde3eae71d6c7697a8655e6631e67622c067beb20 +size 485907 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/idle2.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle2.ogg new file mode 100644 index 0000000..30a83f1 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d03db9488d93cc4ea17d21e7ab70ed7465d96ef4ec8b5f20649b83710021fc7d +size 514326 diff --git a/Improved Husks/Characters/Hammerheadmatriarchhusk/idle3.ogg b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle3.ogg new file mode 100644 index 0000000..80e0472 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadmatriarchhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6eb3aa11e30ac6c92ca5eb65348ccef0df470a3078ba25170756a356d426da38 +size 412843 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimFast.xml b/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimFast.xml new file mode 100644 index 0000000..1e168ac --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimSlow.xml b/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimSlow.xml new file mode 100644 index 0000000..423d6c7 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/Animations/HammerheadspawnhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/Hammerheadspawnhusk.xml b/Improved Husks/Characters/Hammerheadspawnhusk/Hammerheadspawnhusk.xml new file mode 100644 index 0000000..ceef403 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/Hammerheadspawnhusk.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/Ragdolls/HammerheadspawnhuskDefaultRagdoll.xml b/Improved Husks/Characters/Hammerheadspawnhusk/Ragdolls/HammerheadspawnhuskDefaultRagdoll.xml new file mode 100644 index 0000000..3829a5d --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/Ragdolls/HammerheadspawnhuskDefaultRagdoll.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/attack1.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/attack1.ogg new file mode 100644 index 0000000..262cbdb --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15b67cc9ad42e6e96cb4e56c50a248a98c1750c79530231c61960205c7471a37 +size 41422 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/attack2.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/attack2.ogg new file mode 100644 index 0000000..1a73904 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7749d9aaa7ed9e77216ff6b55e8762212b36bb34841ba5c41aed992b875403cf +size 41656 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/attack3.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/attack3.ogg new file mode 100644 index 0000000..433005c --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24468f0cc2ad37011bb30afbc5ed6dda9372712f17a57bcd0aa7df869dd5bdcb +size 31661 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/attack4.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/attack4.ogg new file mode 100644 index 0000000..a8febff --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/attack4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e1a8701cf2ce6d98b25ae10cd695884537881c8aa93680b10fb4402c5aaaacb +size 49232 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/damage1.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/damage1.ogg new file mode 100644 index 0000000..6dbb5ba --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae54c14b99e560ff15d158d9a45123c5a4f9b0da8a66a04f2fb33dbb4e1a8a9 +size 47216 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/damage2.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/damage2.ogg new file mode 100644 index 0000000..2727238 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf313f55d8f962d3c735e4e4a6fe0fb4198e6340fb604459646af837b5ca69c5 +size 43648 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/damage3.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/damage3.ogg new file mode 100644 index 0000000..417f20b --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51434738c037ae2987ae4e38f4cf61c226df86e77dd5ee2c33474e9cdf1a91e5 +size 38685 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/damage4.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/damage4.ogg new file mode 100644 index 0000000..1028b18 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/damage4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3192593109c153c87b4ab156b6ca03fc09ff76c129350b007f7f532fbea42b98 +size 34523 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/death1.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/death1.ogg new file mode 100644 index 0000000..9f88cd2 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd621922bfa0fb5ec4b08f2567cf6777d9a10013ea353a65c79142e437082c16 +size 54310 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/death2.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/death2.ogg new file mode 100644 index 0000000..88c3df1 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efc9a5c2570153d3d012270864c974d84ca53ab4adfa52af449904aad79f896e +size 68270 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/death3.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/death3.ogg new file mode 100644 index 0000000..4e4178b --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/death3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:221595bb4c40eeb90809bd8468ed7b3eff0d072eca4d942f19f21bc075182e90 +size 53730 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/idle1.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/idle1.ogg new file mode 100644 index 0000000..59a42bc --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2001e7038bba72d3e4d2befe9664e42f89da4126feb419a20fd9c34219e474b1 +size 72395 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/idle2.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/idle2.ogg new file mode 100644 index 0000000..79d45e5 --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61c7639022c3bebf522be849ab5e699c096997afb0d193311bc89e52b0a8e298 +size 50279 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/idle3.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/idle3.ogg new file mode 100644 index 0000000..8a4a3ad --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:882d79d73390917cee261b527d1f3a749505807e4f4780415628f43ba020055d +size 58170 diff --git a/Improved Husks/Characters/Hammerheadspawnhusk/idle4.ogg b/Improved Husks/Characters/Hammerheadspawnhusk/idle4.ogg new file mode 100644 index 0000000..c2c9f9c --- /dev/null +++ b/Improved Husks/Characters/Hammerheadspawnhusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fedb1932d184f476d9518a69eb1623c8ba149f2bf26df639f5fe4c8328a25a9 +size 49164 diff --git a/Improved Husks/Characters/Humanhusk/Animations/HumanhuskCrouch.xml b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskCrouch.xml new file mode 100644 index 0000000..e4404f4 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Animations/HumanhuskRun.xml b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskRun.xml new file mode 100644 index 0000000..0d25bb8 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimFast.xml b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimFast.xml new file mode 100644 index 0000000..67e2a3a --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimSlow.xml b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimSlow.xml new file mode 100644 index 0000000..f5162e7 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Animations/HumanhuskWalk.xml b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskWalk.xml new file mode 100644 index 0000000..7a2ad1d --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Animations/HumanhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Humanhusk.xml b/Improved Husks/Characters/Humanhusk/Humanhusk.xml new file mode 100644 index 0000000..376576b --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Humanhusk.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Modappendage.xml b/Improved Husks/Characters/Humanhusk/Modappendage.xml new file mode 100644 index 0000000..48c2cbd --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Modappendage.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/Ragdolls/HumanhuskDefaultRagdoll.xml b/Improved Husks/Characters/Humanhusk/Ragdolls/HumanhuskDefaultRagdoll.xml new file mode 100644 index 0000000..b69d406 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/Ragdolls/HumanhuskDefaultRagdoll.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhusk/attack1.ogg b/Improved Husks/Characters/Humanhusk/attack1.ogg new file mode 100644 index 0000000..2ca62b6 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e579624427ec65dffd4587cecdcd41d30769f337fe35ec6e6ecca97e31d92be9 +size 29548 diff --git a/Improved Husks/Characters/Humanhusk/attack2.ogg b/Improved Husks/Characters/Humanhusk/attack2.ogg new file mode 100644 index 0000000..e3d82dd --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:398c3c31bf0f6c76f005cb46bccb2b717373526ae60a83fc0038c1f575688612 +size 39796 diff --git a/Improved Husks/Characters/Humanhusk/death.ogg b/Improved Husks/Characters/Humanhusk/death.ogg new file mode 100644 index 0000000..bed5a7b --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca2aa8d434d3dc4483a8b0081818eb828d1a0f728234df556073ba35aeaf899d +size 39832 diff --git a/Improved Husks/Characters/Humanhusk/huskspawn.ogg b/Improved Husks/Characters/Humanhusk/huskspawn.ogg new file mode 100644 index 0000000..7bf58a5 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/huskspawn.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99fb1884de488a3043be767d20846e32b3f6dcf5fa44c6aac0bf83838684325a +size 252853 diff --git a/Improved Husks/Characters/Humanhusk/huskspawnfar.ogg b/Improved Husks/Characters/Humanhusk/huskspawnfar.ogg new file mode 100644 index 0000000..e8ae90d --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/huskspawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a560b9ab56e88680c34dc5415380811ec9ae63a982b4ca8cd38c5c79c93d4b55 +size 64503 diff --git a/Improved Husks/Characters/Humanhusk/idle1.ogg b/Improved Husks/Characters/Humanhusk/idle1.ogg new file mode 100644 index 0000000..7e89dab --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e5fddee4bc20bfd5fa773a0917b45d8ed096009d56c08502004d110f661ffe0 +size 27378 diff --git a/Improved Husks/Characters/Humanhusk/idle2.ogg b/Improved Husks/Characters/Humanhusk/idle2.ogg new file mode 100644 index 0000000..68cf71d --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99003a2e11c283a1a4701fc06998ba6ade3f2b215e38abf2f1dd932c08747049 +size 32825 diff --git a/Improved Husks/Characters/Humanhusk/idle3.ogg b/Improved Husks/Characters/Humanhusk/idle3.ogg new file mode 100644 index 0000000..8a352a7 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:907163fad4518107994cdc7ac6718f758c3e81ab3016bfdc3918ae75cff25316 +size 22228 diff --git a/Improved Husks/Characters/Humanhusk/pain.ogg b/Improved Husks/Characters/Humanhusk/pain.ogg new file mode 100644 index 0000000..d382ab5 --- /dev/null +++ b/Improved Husks/Characters/Humanhusk/pain.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07e18e8e8f4d419d3a21787d441b2115386dbe32a1875cb3793fc5c68c846371 +size 25257 diff --git a/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverCrouch.xml b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverCrouch.xml new file mode 100644 index 0000000..2566f67 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverRun.xml b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverRun.xml new file mode 100644 index 0000000..15b8694 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimFast.xml b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimFast.xml new file mode 100644 index 0000000..83202d8 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimSlow.xml b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimSlow.xml new file mode 100644 index 0000000..ce592b7 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverWalk.xml b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverWalk.xml new file mode 100644 index 0000000..dba7f3d --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Animations/HumanhuskdiverWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Humanhuskdiver.xml b/Improved Husks/Characters/Humanhuskdiver/Humanhuskdiver.xml new file mode 100644 index 0000000..7aa668f --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Humanhuskdiver.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/Ragdolls/HumanhuskdiverDefaultRagdoll.xml b/Improved Husks/Characters/Humanhuskdiver/Ragdolls/HumanhuskdiverDefaultRagdoll.xml new file mode 100644 index 0000000..8d37e09 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/Ragdolls/HumanhuskdiverDefaultRagdoll.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskdiver/attack1.ogg b/Improved Husks/Characters/Humanhuskdiver/attack1.ogg new file mode 100644 index 0000000..c818434 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b15961457c34a37016dc9451ce86ac94e7a6d21c3fd94ee5a9be8de3b7197429 +size 44837 diff --git a/Improved Husks/Characters/Humanhuskdiver/attack2.ogg b/Improved Husks/Characters/Humanhuskdiver/attack2.ogg new file mode 100644 index 0000000..eb51375 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21860a1aa9bd25dff8802173e2070b3712727c3e6d028bf84447dc8a2707f645 +size 61455 diff --git a/Improved Husks/Characters/Humanhuskdiver/brokenhelmets.png b/Improved Husks/Characters/Humanhuskdiver/brokenhelmets.png new file mode 100644 index 0000000..87861cd --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/brokenhelmets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e7a10954eb02fc9b5db01c4797d9efd408d27152d45953e726ef2de34629b03 +size 78429 diff --git a/Improved Husks/Characters/Humanhuskdiver/death.ogg b/Improved Husks/Characters/Humanhuskdiver/death.ogg new file mode 100644 index 0000000..0552fac --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f30a8c280e3e95fbb7b5800b81618e43c63480ad9d8738fee5f95b574ee63b73 +size 67986 diff --git a/Improved Husks/Characters/Humanhuskdiver/divingsuithusk.png b/Improved Husks/Characters/Humanhuskdiver/divingsuithusk.png new file mode 100644 index 0000000..8566fa8 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/divingsuithusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:874829339be7d6d463b9248dfd1ff1709980ad7c25e784b4e6b279913762b914 +size 82758 diff --git a/Improved Husks/Characters/Humanhuskdiver/idle1.ogg b/Improved Husks/Characters/Humanhuskdiver/idle1.ogg new file mode 100644 index 0000000..837e0ac --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2961598017651102738f9f6e8576eb9f2eeafe29cd1ee4cea32d6c4a8b948fbb +size 63449 diff --git a/Improved Husks/Characters/Humanhuskdiver/idle2.ogg b/Improved Husks/Characters/Humanhuskdiver/idle2.ogg new file mode 100644 index 0000000..3b175f8 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffc3b6029c08887ae47430d945bf8f0df4e7a229374ef6d65e534535dde51a6a +size 54681 diff --git a/Improved Husks/Characters/Humanhuskdiver/idle3.ogg b/Improved Husks/Characters/Humanhuskdiver/idle3.ogg new file mode 100644 index 0000000..ce0a77d --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b3f454e1d17e11130a4ec61a67344a82b9180eaeef201f80f54d6f599de6dea +size 70215 diff --git a/Improved Husks/Characters/Humanhuskdiver/pain.ogg b/Improved Husks/Characters/Humanhuskdiver/pain.ogg new file mode 100644 index 0000000..02b6f7e --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/pain.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e730712c26657ad7ef04b1be15c47867eabfe348fc92bfdecfd15f30755aeb7 +size 64064 diff --git a/Improved Husks/Characters/Humanhuskdiver/pain2.ogg b/Improved Husks/Characters/Humanhuskdiver/pain2.ogg new file mode 100644 index 0000000..c2fe492 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskdiver/pain2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57069fca764739d14e61c1c57bc41a76b092636897501cb242436b3c26d8a39b +size 68049 diff --git a/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldCrouch.xml b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldCrouch.xml new file mode 100644 index 0000000..fbfb6bd --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldRun.xml b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldRun.xml new file mode 100644 index 0000000..9f9d092 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimFast.xml b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimFast.xml new file mode 100644 index 0000000..2f6462d --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimSlow.xml b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimSlow.xml new file mode 100644 index 0000000..11654e0 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldWalk.xml b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldWalk.xml new file mode 100644 index 0000000..082b387 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Animations/HumanhuskoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Humanhuskold.xml b/Improved Husks/Characters/Humanhuskold/Humanhuskold.xml new file mode 100644 index 0000000..8b12e61 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Humanhuskold.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/Ragdolls/HumanhuskoldDefaultRagdoll.xml b/Improved Husks/Characters/Humanhuskold/Ragdolls/HumanhuskoldDefaultRagdoll.xml new file mode 100644 index 0000000..d6d3064 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/Ragdolls/HumanhuskoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanhuskold/attack1.ogg b/Improved Husks/Characters/Humanhuskold/attack1.ogg new file mode 100644 index 0000000..b0d94b9 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0081a8b2cf49322d654461baf392c06db72da16eb0ceeeceaf2895429c360441 +size 30254 diff --git a/Improved Husks/Characters/Humanhuskold/attack2.ogg b/Improved Husks/Characters/Humanhuskold/attack2.ogg new file mode 100644 index 0000000..ae430e4 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66fe6637a4ecd7b57197be08a60acc644bc2a169ba620be95c47faf8410c72dd +size 35349 diff --git a/Improved Husks/Characters/Humanhuskold/attack3.ogg b/Improved Husks/Characters/Humanhuskold/attack3.ogg new file mode 100644 index 0000000..dafe279 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bd8b7793b22227f66d41cdcc57c632ec8e0a8a27157f01fcfaa1e30fbeedfea +size 26946 diff --git a/Improved Husks/Characters/Humanhuskold/damage1.ogg b/Improved Husks/Characters/Humanhuskold/damage1.ogg new file mode 100644 index 0000000..c89a475 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9b1845f5e57248d0095f7e0b6c5a9a04f0bc500f427873298b11e8e0d90a750 +size 30115 diff --git a/Improved Husks/Characters/Humanhuskold/damage2.ogg b/Improved Husks/Characters/Humanhuskold/damage2.ogg new file mode 100644 index 0000000..5c8d87e --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddc02e9105fceaaacb29007cf867696d9113f9431259a7b29830d297f9da9d70 +size 25261 diff --git a/Improved Husks/Characters/Humanhuskold/damage3.ogg b/Improved Husks/Characters/Humanhuskold/damage3.ogg new file mode 100644 index 0000000..07da428 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ba6ac4f9b5573de1b6b66a01296b925b5341ef3884f212a32a8ba4f8096eda0 +size 20477 diff --git a/Improved Husks/Characters/Humanhuskold/death1.ogg b/Improved Husks/Characters/Humanhuskold/death1.ogg new file mode 100644 index 0000000..2359bc8 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7867e818792d6b9b62334f313bffcec0c06076b2302a39cb4f9d13cebcb80b1 +size 51368 diff --git a/Improved Husks/Characters/Humanhuskold/death2.ogg b/Improved Husks/Characters/Humanhuskold/death2.ogg new file mode 100644 index 0000000..79edab2 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:773c773d29fab8c8a483e3dc1186bf336b0c02e081d4ee9b5466382bf02de35d +size 49868 diff --git a/Improved Husks/Characters/Humanhuskold/idle1.ogg b/Improved Husks/Characters/Humanhuskold/idle1.ogg new file mode 100644 index 0000000..2f9c333 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db8a06fa615c12974a27040eff63111e4462f76ed1e4343f22254d33651431b1 +size 34191 diff --git a/Improved Husks/Characters/Humanhuskold/idle2.ogg b/Improved Husks/Characters/Humanhuskold/idle2.ogg new file mode 100644 index 0000000..666d17b --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faba58badc59ef440ce7ad827a2f82e59585c555ab892398934dcc35707b01c0 +size 31841 diff --git a/Improved Husks/Characters/Humanhuskold/idle3.ogg b/Improved Husks/Characters/Humanhuskold/idle3.ogg new file mode 100644 index 0000000..3babbda --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1578125fbe1c96ff097f536d4f9eb35b0c8e295c7136d452299d361065da1bc1 +size 27276 diff --git a/Improved Husks/Characters/Humanhuskold/idle4.ogg b/Improved Husks/Characters/Humanhuskold/idle4.ogg new file mode 100644 index 0000000..3c6320f --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c6eccb2cbe7c93dc407e804b7365ab8211125cbdd3339f943ce75c05602ad69 +size 31444 diff --git a/Improved Husks/Characters/Humanhuskold/oldhead.png b/Improved Husks/Characters/Humanhuskold/oldhead.png new file mode 100644 index 0000000..b2e94da --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/oldhead.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea45ead555bfd72322fae5f41c9b5cf8d45136c0dce71831b6bca4dd8917b3ed +size 12932 diff --git a/Improved Husks/Characters/Humanhuskold/oldtorso.png b/Improved Husks/Characters/Humanhuskold/oldtorso.png new file mode 100644 index 0000000..a80a675 --- /dev/null +++ b/Improved Husks/Characters/Humanhuskold/oldtorso.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a215efc1cf6d174875bdf0e603ace6a20c4b634a795a3a826fe7de14550c6b5 +size 56613 diff --git a/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerCrouch.xml b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerCrouch.xml new file mode 100644 index 0000000..5c11187 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerRun.xml b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerRun.xml new file mode 100644 index 0000000..ad2c6c0 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimFast.xml b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimFast.xml new file mode 100644 index 0000000..608815d --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimSlow.xml b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimSlow.xml new file mode 100644 index 0000000..b9567f8 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerWalk.xml b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerWalk.xml new file mode 100644 index 0000000..f3706dc --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Animations/HumanshamblerWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Humanshambler.xml b/Improved Husks/Characters/Humanshambler/Humanshambler.xml new file mode 100644 index 0000000..2d4ba1a --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Humanshambler.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Ragdolls/HumanshamblerDefaultRagdoll.xml b/Improved Husks/Characters/Humanshambler/Ragdolls/HumanshamblerDefaultRagdoll.xml new file mode 100644 index 0000000..a671a0f --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Ragdolls/HumanshamblerDefaultRagdoll.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/Shamblerheadlatched.xml b/Improved Husks/Characters/Humanshambler/Shamblerheadlatched.xml new file mode 100644 index 0000000..fd07c9f --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/Shamblerheadlatched.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Humanshambler/attack1.ogg b/Improved Husks/Characters/Humanshambler/attack1.ogg new file mode 100644 index 0000000..a558ab9 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24a7763ebcf9ff12c0d6583861b750f10ad67106fff99b965a457b1c90065355 +size 144791 diff --git a/Improved Husks/Characters/Humanshambler/attack2.ogg b/Improved Husks/Characters/Humanshambler/attack2.ogg new file mode 100644 index 0000000..ea7d7e4 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1efd274c6c06e7d95ab9f6020b18f9e7849bc7edd93c4ba04b8ebf61e298142 +size 145184 diff --git a/Improved Husks/Characters/Humanshambler/attack3.ogg b/Improved Husks/Characters/Humanshambler/attack3.ogg new file mode 100644 index 0000000..f078125 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2ac967e008718e6c61d471576fb15225b94ff77aa024e77ecdaddef41b512cd +size 177521 diff --git a/Improved Husks/Characters/Humanshambler/damage1.ogg b/Improved Husks/Characters/Humanshambler/damage1.ogg new file mode 100644 index 0000000..072b6c5 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:017c75a241dbc709635279f5f870fee257c8fda341840a4a8aeb7aacde5c9df7 +size 75690 diff --git a/Improved Husks/Characters/Humanshambler/damage2.ogg b/Improved Husks/Characters/Humanshambler/damage2.ogg new file mode 100644 index 0000000..082d538 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7739b9f9da67066c87977b6ca086ff1392959d2255c2fb9de529495bc2210979 +size 73079 diff --git a/Improved Husks/Characters/Humanshambler/damage3.ogg b/Improved Husks/Characters/Humanshambler/damage3.ogg new file mode 100644 index 0000000..ed3d2fe --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d353e2ab4515f7649a24c1b8a963c7bed99574818bb07022a7344d149cbdb9ac +size 85034 diff --git a/Improved Husks/Characters/Humanshambler/death1.ogg b/Improved Husks/Characters/Humanshambler/death1.ogg new file mode 100644 index 0000000..c0371c1 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bf4da32dcdf514c168846f81f59ef4279e5fc4bd7e302dd2df1964d5d180a3b +size 115244 diff --git a/Improved Husks/Characters/Humanshambler/death2.ogg b/Improved Husks/Characters/Humanshambler/death2.ogg new file mode 100644 index 0000000..31c8786 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5cf36380d0b0e88e8c2c6f946dbd6b0f52a9b7ebbd0113e5d594d5790d3857e +size 129606 diff --git a/Improved Husks/Characters/Humanshambler/idle1.ogg b/Improved Husks/Characters/Humanshambler/idle1.ogg new file mode 100644 index 0000000..76108f5 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be7cbd02cf0a648a670c4614028d4ee87dd7883ee222bab04dca48e7d996923c +size 57437 diff --git a/Improved Husks/Characters/Humanshambler/idle2.ogg b/Improved Husks/Characters/Humanshambler/idle2.ogg new file mode 100644 index 0000000..f0564bc --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59fb7050b7d93f5c673760f6f01e5f1a7b84f3747338b478a3ba00c8f3290ff5 +size 41471 diff --git a/Improved Husks/Characters/Humanshambler/idle3.ogg b/Improved Husks/Characters/Humanshambler/idle3.ogg new file mode 100644 index 0000000..d88022a --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6852667adf929ae3fe71abe83b02c449188a0f5d1f66d72421be0441ed75d75c +size 76391 diff --git a/Improved Husks/Characters/Humanshambler/idle4.ogg b/Improved Husks/Characters/Humanshambler/idle4.ogg new file mode 100644 index 0000000..a017b94 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1519ac2e865b9257e4a17d522d534b9d377c3c624dc5608388d77175c4f9410c +size 122404 diff --git a/Improved Husks/Characters/Humanshambler/shambler_female.png b/Improved Husks/Characters/Humanshambler/shambler_female.png new file mode 100644 index 0000000..bd43078 --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/shambler_female.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d278f5a3e306feda2ef9f7f3363c84938fbd43077892e0acfaa5ce6b46948cab +size 56184 diff --git a/Improved Husks/Characters/Humanshambler/shambler_male.png b/Improved Husks/Characters/Humanshambler/shambler_male.png new file mode 100644 index 0000000..828894c --- /dev/null +++ b/Improved Husks/Characters/Humanshambler/shambler_male.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b79f3004962e5adbdfad290102850deba1485ec4fb784c8d4b20ef40076ad1f4 +size 59366 diff --git a/Improved Husks/Characters/Husk/Animations/HuskCrouch.xml b/Improved Husks/Characters/Husk/Animations/HuskCrouch.xml new file mode 100644 index 0000000..310c765 --- /dev/null +++ b/Improved Husks/Characters/Husk/Animations/HuskCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Animations/HuskRun.xml b/Improved Husks/Characters/Husk/Animations/HuskRun.xml new file mode 100644 index 0000000..508b835 --- /dev/null +++ b/Improved Husks/Characters/Husk/Animations/HuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Animations/HuskSwimFast.xml b/Improved Husks/Characters/Husk/Animations/HuskSwimFast.xml new file mode 100644 index 0000000..e9d163b --- /dev/null +++ b/Improved Husks/Characters/Husk/Animations/HuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Animations/HuskSwimSlow.xml b/Improved Husks/Characters/Husk/Animations/HuskSwimSlow.xml new file mode 100644 index 0000000..6d0ffc5 --- /dev/null +++ b/Improved Husks/Characters/Husk/Animations/HuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Animations/HuskWalk.xml b/Improved Husks/Characters/Husk/Animations/HuskWalk.xml new file mode 100644 index 0000000..ea440bc --- /dev/null +++ b/Improved Husks/Characters/Husk/Animations/HuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Husk.xml b/Improved Husks/Characters/Husk/Husk.xml new file mode 100644 index 0000000..d3bd566 --- /dev/null +++ b/Improved Husks/Characters/Husk/Husk.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Husk/Ragdolls/HuskDefaultRagdoll.xml b/Improved Husks/Characters/Husk/Ragdolls/HuskDefaultRagdoll.xml new file mode 100644 index 0000000..4d8259f --- /dev/null +++ b/Improved Husks/Characters/Husk/Ragdolls/HuskDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldCrouch.xml b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldCrouch.xml new file mode 100644 index 0000000..16d7e05 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldRun.xml b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldRun.xml new file mode 100644 index 0000000..f86a085 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimFast.xml b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimFast.xml new file mode 100644 index 0000000..5c3b443 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimSlow.xml b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimSlow.xml new file mode 100644 index 0000000..4024e46 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldWalk.xml b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldWalk.xml new file mode 100644 index 0000000..9fbbfff --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Animations/HuskabyssoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Huskabyssold.xml b/Improved Husks/Characters/Huskabyssold/Huskabyssold.xml new file mode 100644 index 0000000..b656e2e --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Huskabyssold.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/Ragdolls/HuskabyssoldDefaultRagdoll.xml b/Improved Husks/Characters/Huskabyssold/Ragdolls/HuskabyssoldDefaultRagdoll.xml new file mode 100644 index 0000000..f926ccb --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/Ragdolls/HuskabyssoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskabyssold/rustedabysssuit.png b/Improved Husks/Characters/Huskabyssold/rustedabysssuit.png new file mode 100644 index 0000000..c3b0f08 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/rustedabysssuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e5f3efefc34e2919f7a567c4cd938478b0aac2bd38cd3577938927bd0b804e8 +size 111228 diff --git a/Improved Husks/Characters/Huskabyssold/rustedhelmetabyss.png b/Improved Husks/Characters/Huskabyssold/rustedhelmetabyss.png new file mode 100644 index 0000000..9c15902 --- /dev/null +++ b/Improved Husks/Characters/Huskabyssold/rustedhelmetabyss.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06bfeed369cac0c1bdd34312207a9269404c2062cf8abc741942358a11de0ade +size 18770 diff --git a/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldCrouch.xml b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldCrouch.xml new file mode 100644 index 0000000..dbd6501 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldRun.xml b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldRun.xml new file mode 100644 index 0000000..350799a --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimFast.xml b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimFast.xml new file mode 100644 index 0000000..994282f --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimSlow.xml b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimSlow.xml new file mode 100644 index 0000000..5b336ed --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldWalk.xml b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldWalk.xml new file mode 100644 index 0000000..216b4d6 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Animations/HuskcombatoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Huskcombatold.xml b/Improved Husks/Characters/Huskcombatold/Huskcombatold.xml new file mode 100644 index 0000000..fe49207 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Huskcombatold.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/Ragdolls/HuskcombatoldDefaultRagdoll.xml b/Improved Husks/Characters/Huskcombatold/Ragdolls/HuskcombatoldDefaultRagdoll.xml new file mode 100644 index 0000000..d4f9731 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/Ragdolls/HuskcombatoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskcombatold/rustedcombatsuit.png b/Improved Husks/Characters/Huskcombatold/rustedcombatsuit.png new file mode 100644 index 0000000..e3c1031 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/rustedcombatsuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a715afb9bc1fe5d6b311ba5cc9fb2dbf8f07fecca52f162e0914321467015af5 +size 203883 diff --git a/Improved Husks/Characters/Huskcombatold/rustedhelmetcombat.png b/Improved Husks/Characters/Huskcombatold/rustedhelmetcombat.png new file mode 100644 index 0000000..74de0f3 --- /dev/null +++ b/Improved Husks/Characters/Huskcombatold/rustedhelmetcombat.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c35a98cbf2f0f1e764d78321bc41f3b9018cad65e25ff5086ac18faa96c946a +size 18318 diff --git a/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredCrouch.xml b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredCrouch.xml new file mode 100644 index 0000000..ddd4577 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredRun.xml b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredRun.xml new file mode 100644 index 0000000..d09fd23 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimFast.xml b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimFast.xml new file mode 100644 index 0000000..c5ae505 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimSlow.xml b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimSlow.xml new file mode 100644 index 0000000..158d8b7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredWalk.xml b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredWalk.xml new file mode 100644 index 0000000..ccb8686 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Animations/HuskmutantarmoredWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Huskmutantarmored.xml b/Improved Husks/Characters/Huskmutantarmored/Huskmutantarmored.xml new file mode 100644 index 0000000..9c0b4a5 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Huskmutantarmored.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/Ragdolls/HuskmutantarmoredDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantarmored/Ragdolls/HuskmutantarmoredDefaultRagdoll.xml new file mode 100644 index 0000000..ffd7090 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/Ragdolls/HuskmutantarmoredDefaultRagdoll.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmored/attack1.ogg b/Improved Husks/Characters/Huskmutantarmored/attack1.ogg new file mode 100644 index 0000000..5e3c377 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51ee957fae353ad2bd4972458791acc7b0b99ab6a19f0bf1072d7d7e49dde872 +size 78893 diff --git a/Improved Husks/Characters/Huskmutantarmored/attack2.ogg b/Improved Husks/Characters/Huskmutantarmored/attack2.ogg new file mode 100644 index 0000000..959272d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b66219a01b4d06f1230dafb57122236ef292a4a8a4b3b6f9516c125280f111bb +size 128492 diff --git a/Improved Husks/Characters/Huskmutantarmored/damage1.ogg b/Improved Husks/Characters/Huskmutantarmored/damage1.ogg new file mode 100644 index 0000000..dcd0386 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23ea08f7f705b14012cfb7cbf97ccdb917596dd413f75b2a0615490bf911b3fd +size 162056 diff --git a/Improved Husks/Characters/Huskmutantarmored/damage2.ogg b/Improved Husks/Characters/Huskmutantarmored/damage2.ogg new file mode 100644 index 0000000..797ed33 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:684d27c221b31869e272a6e8fddd843263d50a15781118dd904d5b37f6cfee25 +size 178686 diff --git a/Improved Husks/Characters/Huskmutantarmored/death1.ogg b/Improved Husks/Characters/Huskmutantarmored/death1.ogg new file mode 100644 index 0000000..551cf89 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05ef9f250018e182790668ffb12675f9b6cf58b9eaaa216d9e24d7585a2efa8e +size 204170 diff --git a/Improved Husks/Characters/Huskmutantarmored/death2.ogg b/Improved Husks/Characters/Huskmutantarmored/death2.ogg new file mode 100644 index 0000000..ec6386d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7203566f7cdeccb7a387b15a616986dc2f0f45cba17e8f528112a6ff5cf8ce +size 200063 diff --git a/Improved Husks/Characters/Huskmutantarmored/huskmutantarmored.png b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmored.png new file mode 100644 index 0000000..0552dd4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmored.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d71da00923893444f2447e6ac9b31a82ddcad162bedde33d600168d80f7548 +size 117758 diff --git a/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredhead.png b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredhead.png new file mode 100644 index 0000000..6cae3be --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredhead.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9669a7f762b3d2cc5b271186bf07061bf295463026b56a4995e47b3c721bbe8 +size 17447 diff --git a/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheaddiving.png b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheaddiving.png new file mode 100644 index 0000000..8266cb8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheaddiving.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18fb609206a169f4cd99eb9cde335b604aea87fc843ac3fb390b93b6289457f9 +size 11506 diff --git a/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheadpucs.png b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheadpucs.png new file mode 100644 index 0000000..4cbba42 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredheadpucs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ae7598faef6bffe9440ea5c77dbe16c5e02c94e97d5d2baf61b006c0cdacad2 +size 12087 diff --git a/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredpucs.png b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredpucs.png new file mode 100644 index 0000000..70ac16b --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/huskmutantarmoredpucs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:875e6670ca0fb0bb6e9d4ab56c099493ae513b2f68735d6405ddea59c5aba68d +size 118941 diff --git a/Improved Husks/Characters/Huskmutantarmored/idle1.ogg b/Improved Husks/Characters/Huskmutantarmored/idle1.ogg new file mode 100644 index 0000000..864a4e2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3a1e03b194a040ecf5d100fee975a3c522836fd17899b47f6818ed34835a053 +size 132896 diff --git a/Improved Husks/Characters/Huskmutantarmored/idle2.ogg b/Improved Husks/Characters/Huskmutantarmored/idle2.ogg new file mode 100644 index 0000000..33c3a3d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e2caf5b628eb4e990bdbbb04429801ed4f56d9930f229e81c77f4543aca6a10 +size 190152 diff --git a/Improved Husks/Characters/Huskmutantarmored/idle3.ogg b/Improved Husks/Characters/Huskmutantarmored/idle3.ogg new file mode 100644 index 0000000..86b6751 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e437f59d159cfba94bd3ab1f7634e1cd1d789879ac5ef5f7decbdf2f46acd06 +size 183671 diff --git a/Improved Husks/Characters/Huskmutantarmored/spawnclose.ogg b/Improved Husks/Characters/Huskmutantarmored/spawnclose.ogg new file mode 100644 index 0000000..ba15c80 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4aa3f08860478b6315f822f31e16c453cb716b59b3e54304aaec18d86ed84a9f +size 410602 diff --git a/Improved Husks/Characters/Huskmutantarmored/spawnfar.ogg b/Improved Husks/Characters/Huskmutantarmored/spawnfar.ogg new file mode 100644 index 0000000..c895f07 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmored/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d036e881139d94c2630896aebde917afccc4423d385bafa59c979896fd7eb40 +size 102276 diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsCrouch.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsCrouch.xml new file mode 100644 index 0000000..b6bf47f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsRun.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsRun.xml new file mode 100644 index 0000000..8f0dd8f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimFast.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimFast.xml new file mode 100644 index 0000000..85f479e --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimSlow.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimSlow.xml new file mode 100644 index 0000000..7aa9591 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsWalk.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsWalk.xml new file mode 100644 index 0000000..3fc214e --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Animations/HuskmutantarmoredpucsWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Huskmutantarmoredpucs.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Huskmutantarmoredpucs.xml new file mode 100644 index 0000000..92830c9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Huskmutantarmoredpucs.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantarmoredpucs/Ragdolls/HuskmutantarmoredpucsDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantarmoredpucs/Ragdolls/HuskmutantarmoredpucsDefaultRagdoll.xml new file mode 100644 index 0000000..ed3048e --- /dev/null +++ b/Improved Husks/Characters/Huskmutantarmoredpucs/Ragdolls/HuskmutantarmoredpucsDefaultRagdoll.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimFast.xml b/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimFast.xml new file mode 100644 index 0000000..bf35f47 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimSlow.xml b/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimSlow.xml new file mode 100644 index 0000000..2d65c66 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/Animations/HuskmutantbonethresherSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantbonethresher/Huskmutantbonethresher.xml b/Improved Husks/Characters/Huskmutantbonethresher/Huskmutantbonethresher.xml new file mode 100644 index 0000000..70b9234 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/Huskmutantbonethresher.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantbonethresher/Ragdolls/HuskmutantbonethresherDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantbonethresher/Ragdolls/HuskmutantbonethresherDefaultRagdoll.xml new file mode 100644 index 0000000..88ec43d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/Ragdolls/HuskmutantbonethresherDefaultRagdoll.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantbonethresher/attack1.ogg b/Improved Husks/Characters/Huskmutantbonethresher/attack1.ogg new file mode 100644 index 0000000..d2e6dc3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34b0d34f1bbf8e605379e536fc7790c52f4eadae4df92ba2e8f2e53cbdebd5a4 +size 113927 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/attack2.ogg b/Improved Husks/Characters/Huskmutantbonethresher/attack2.ogg new file mode 100644 index 0000000..22881d0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79298111b5536eb19f5747e3751e68d6248f4d9f1a6d356be886ec74240fc164 +size 150699 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/damage1.ogg b/Improved Husks/Characters/Huskmutantbonethresher/damage1.ogg new file mode 100644 index 0000000..a12dbd5 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e223a64295534d1b61b284db7514074a45819371b3bd7ee4675b1a012d362e33 +size 57129 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/damage2.ogg b/Improved Husks/Characters/Huskmutantbonethresher/damage2.ogg new file mode 100644 index 0000000..2b01e09 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2f29d2b70c7c2f2d2eb83973533f47d99bc9fbb906197534e014798779ec728 +size 42862 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/death1.ogg b/Improved Husks/Characters/Huskmutantbonethresher/death1.ogg new file mode 100644 index 0000000..8abb906 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b50ef5b8af01f116207967774c0c69cd268517958d5b8390c91550b4cb71ca3d +size 161957 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/death2.ogg b/Improved Husks/Characters/Huskmutantbonethresher/death2.ogg new file mode 100644 index 0000000..133a772 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b83a788367aa294d2d394ea09a08ede8c6b52a837d00099fea945a46455b2445 +size 139355 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/idle1.ogg b/Improved Husks/Characters/Huskmutantbonethresher/idle1.ogg new file mode 100644 index 0000000..5f0fbb0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7eb03843231bc77c5dd61eebaa30a5bb82682741b6745ed7e0f885760d287d3 +size 193618 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/idle2.ogg b/Improved Husks/Characters/Huskmutantbonethresher/idle2.ogg new file mode 100644 index 0000000..9f595c2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fba2c37110c3d76262e2827c54476a586d38bfa9408da96d521ee1af8f0f8afd +size 150120 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/idle3.ogg b/Improved Husks/Characters/Huskmutantbonethresher/idle3.ogg new file mode 100644 index 0000000..9202281 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57481c69a34a96be8098e7aad61ab00ca0a0ee46ef98d9a90531d02c1720405a +size 142763 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/spawnclose.ogg b/Improved Husks/Characters/Huskmutantbonethresher/spawnclose.ogg new file mode 100644 index 0000000..449e835 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5ff58ac9bf0bf610021593c1a7cb25421bd2e0761ecedbd9eb6c6c945b535ce +size 179552 diff --git a/Improved Husks/Characters/Huskmutantbonethresher/spawnfar.ogg b/Improved Husks/Characters/Huskmutantbonethresher/spawnfar.ogg new file mode 100644 index 0000000..9bbaab6 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantbonethresher/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17bf6187eb5b3e41b9038da7f21990526848ae13ede90a1a4a4d217e0b6e701c +size 107668 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimFast.xml b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimFast.xml new file mode 100644 index 0000000..eb3442f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimSlow.xml b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimSlow.xml new file mode 100644 index 0000000..5c86d08 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Animations/HuskmutantcocoonbonethresherSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantacquaticcocoonglow.png b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantacquaticcocoonglow.png new file mode 100644 index 0000000..e204775 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantacquaticcocoonglow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d15817f6b64521e58aa887e5f02ae006e1e147c5283681fb9273ff664fbad34b +size 43217 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.png b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.png new file mode 100644 index 0000000..43ff407 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1637d58ea8713f353e87bd9fc944e016aedf6f6521dce292987b854e31abfa73 +size 658583 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.xml b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.xml new file mode 100644 index 0000000..3f3b588 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Huskmutantcocoonbonethresher.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/Ragdolls/HuskmutantcocoonbonethresherDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Ragdolls/HuskmutantcocoonbonethresherDefaultRagdoll.xml new file mode 100644 index 0000000..f8c06c8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/Ragdolls/HuskmutantcocoonbonethresherDefaultRagdoll.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack1.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack1.ogg new file mode 100644 index 0000000..7fd82b0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8025feb15bd4fdc7c5f09b24cf9acb2a0f4619b56c8b7842fd6f4db6c30ba9c6 +size 107263 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack2.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack2.ogg new file mode 100644 index 0000000..47b4f0d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:670ade8bb0ede84afd2e5c25e4f7e710ebe5b46b96155187e03ee2e2a40fbb1c +size 69971 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack3.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack3.ogg new file mode 100644 index 0000000..2ae8586 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:460d6b94685ecbd8a48f99b8ec360a83a48479d361e2ba03748d0445e3be173b +size 61883 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack4.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack4.ogg new file mode 100644 index 0000000..c6a49a0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/attack4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04c96b7cb02dfa339200814b2a160705abd5fdac9a217e9aa6f9b02770e4dbce +size 92118 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigacidexplosion.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigacidexplosion.ogg new file mode 100644 index 0000000..52b23f5 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigacidexplosion.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af88945fe97a3e1b9e11cc4a4d1d9b7a4fe2e30a7458ae3f4d761679f143ca57 +size 326727 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigspawn.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigspawn.ogg new file mode 100644 index 0000000..7368601 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/bigspawn.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02dd314610ce5a8a7548bfe6c12f0e676ea0d065f29bf17aeb3fe7c29edcef3b +size 290756 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage1.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage1.ogg new file mode 100644 index 0000000..8f036cc --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dac60983cba01d0b540eb61615ef89c821285a5576c63e4f9f8e6c56f0fee95 +size 26031 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage2.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage2.ogg new file mode 100644 index 0000000..fdcf8e2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e3e6f3c13b87b3cd339babfa768c4766d511d1e6ab0aee2be2f8f5309b4d768 +size 26322 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage3.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage3.ogg new file mode 100644 index 0000000..c33cbea --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21aa9f9aadcf51eab51cd3686a76bfd838be551bfe1c64e976989dd3b232bb61 +size 18685 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/death1.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/death1.ogg new file mode 100644 index 0000000..43f2038 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00f3805a027c6768f2ecca50fb2b3683799508aa7123ef3f45e685b4a3c914ad +size 51433 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/death2.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/death2.ogg new file mode 100644 index 0000000..8f590f4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ccd26a0ce0a02fbf694cb6d9a3bc3d2b19b101ea2642224eb5190712000cf9b +size 49824 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle1.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle1.ogg new file mode 100644 index 0000000..48e86d7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed71e08a559fb761a00eef78a292a8ac386f23993a10fbcb46a19cef7e02309a +size 37647 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle2.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle2.ogg new file mode 100644 index 0000000..2af3ffb --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be964a4d8fdda6076e3a54fbbf7171992d476778d18ade605b56833635bf02f4 +size 28333 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle3.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle3.ogg new file mode 100644 index 0000000..f1c9a15 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6b23e1a89b211a35b7f18c35be18320b81c7c25dea89286d6ba4a53dd77e741 +size 36644 diff --git a/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle4.ogg b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle4.ogg new file mode 100644 index 0000000..3364f2c --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocoonbonethresher/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90dd8aa2f2d5db27fdce6063c8ae8e71e6f47ef17119d669468445b2d8950602 +size 32464 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerRun.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerRun.xml new file mode 100644 index 0000000..e8c6d2a --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimFast.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimFast.xml new file mode 100644 index 0000000..4c3dd79 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimSlow.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimSlow.xml new file mode 100644 index 0000000..de64b9f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerWalk.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerWalk.xml new file mode 100644 index 0000000..756e508 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Animations/HuskmutantcocooncrawlerWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Huskmutantcocooncrawler.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Huskmutantcocooncrawler.xml new file mode 100644 index 0000000..9bb7954 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Huskmutantcocooncrawler.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/Ragdolls/HuskmutantcocooncrawlerDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantcocooncrawler/Ragdolls/HuskmutantcocooncrawlerDefaultRagdoll.xml new file mode 100644 index 0000000..bc8c763 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/Ragdolls/HuskmutantcocooncrawlerDefaultRagdoll.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/acidexplosion.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/acidexplosion.ogg new file mode 100644 index 0000000..bb9ebd9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/acidexplosion.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d201197b03a312d8cccc6981e1570d875c671cd612e8e3add4643a4bf49f50e +size 263262 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/attack1.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/attack1.ogg new file mode 100644 index 0000000..0324a02 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aacfce9607fdb9447801a28df0e027b5f82aa0b2d9c889b5981e991df640e7a +size 185324 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/attack2.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/attack2.ogg new file mode 100644 index 0000000..05f5703 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d21766cc4f4593694221e010b12d8df5501f9b494342ed56997f34651a0c13d +size 140779 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/attack3.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/attack3.ogg new file mode 100644 index 0000000..344ef40 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce5d84457e9a6b796f7df699ca07f9a563f8cbc73a2faaa2411f5ab408c3453f +size 236999 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/damage1.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/damage1.ogg new file mode 100644 index 0000000..35cb388 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8ac3a258b09c6e85f8c4e489ef06d9ae9f9b77b9a0972a7e08c02548a42ce3d +size 118450 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/damage2.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/damage2.ogg new file mode 100644 index 0000000..fc1dcb2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f34fbd4c6f03bb96bc00222f8acf36196dda2b36442a182fad8d0b544773ae8 +size 103489 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/damage3.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/damage3.ogg new file mode 100644 index 0000000..4e264b3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27296841dec32dd717f8c9365f5e3503f52c66f43f0c0d0fd27236144d9d2294 +size 76231 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/death1.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/death1.ogg new file mode 100644 index 0000000..cf3dbb4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f411944aa5c9478504327997709b865cfb0ce679163cc9eb788f04feae1ecf24 +size 189118 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/death2.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/death2.ogg new file mode 100644 index 0000000..f871b2d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28c1a7f56e347e6d1d0e801aaf99756a23097e8910cf62e9bbeba281b54fcfc5 +size 303068 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocooncrawler.png b/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocooncrawler.png new file mode 100644 index 0000000..a5f334d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocooncrawler.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40f0b52575740bbe96dc902f027b40be17fae157ab357d80f06bce53b7fe2229 +size 95252 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocoonglow.png b/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocoonglow.png new file mode 100644 index 0000000..cb68312 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/huskmutantcocoonglow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aff826bd6806db75e2a9f04724defaa874cfde1b90618df60db624571d86af14 +size 7772 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/idle1.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/idle1.ogg new file mode 100644 index 0000000..e3306c2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe41778d395dd20344802f373e0a4f17dd05837877585f2079b0c2bd0335c4e3 +size 204430 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/idle2.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/idle2.ogg new file mode 100644 index 0000000..3678fa2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42aa468d5578d2ee39f2094ce6a3a6ffde709b178c0658e67fce4b823aa76b58 +size 158851 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/idle3.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/idle3.ogg new file mode 100644 index 0000000..0b6303f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6208464df8aa41c881a64ad30701ad8006831d5a38f91d568f370500d0d3319b +size 114536 diff --git a/Improved Husks/Characters/Huskmutantcocooncrawler/spawn.ogg b/Improved Husks/Characters/Huskmutantcocooncrawler/spawn.ogg new file mode 100644 index 0000000..bfe45b4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcocooncrawler/spawn.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:465178991b93a7c8516d03febe25ae5488e9eca32a1c337b842318d86a4a7d75 +size 313475 diff --git a/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerRun.xml b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerRun.xml new file mode 100644 index 0000000..84a025a --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimFast.xml b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimFast.xml new file mode 100644 index 0000000..7c03c4d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimSlow.xml b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimSlow.xml new file mode 100644 index 0000000..c714cc2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerWalk.xml b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerWalk.xml new file mode 100644 index 0000000..ada59b2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Animations/HuskmutantcrawlerWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/Huskmutantcrawler.xml b/Improved Husks/Characters/Huskmutantcrawler/Huskmutantcrawler.xml new file mode 100644 index 0000000..8a88b3d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Huskmutantcrawler.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/Ragdolls/HuskmutantcrawlerDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantcrawler/Ragdolls/HuskmutantcrawlerDefaultRagdoll.xml new file mode 100644 index 0000000..1f0bb53 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/Ragdolls/HuskmutantcrawlerDefaultRagdoll.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantcrawler/attack1.ogg b/Improved Husks/Characters/Huskmutantcrawler/attack1.ogg new file mode 100644 index 0000000..e789ed0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c8ed514d6055a5d0652046d1c13c1e13af6fec456b427dd8c1b57d5d873cdd +size 72268 diff --git a/Improved Husks/Characters/Huskmutantcrawler/attack2.ogg b/Improved Husks/Characters/Huskmutantcrawler/attack2.ogg new file mode 100644 index 0000000..8b70a9b --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d321fb1994b964903fb15188c202a7a4349fb1a1e4d53effe4796cc6070b5014 +size 88973 diff --git a/Improved Husks/Characters/Huskmutantcrawler/attack3.ogg b/Improved Husks/Characters/Huskmutantcrawler/attack3.ogg new file mode 100644 index 0000000..7540ff3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d863abc6e775556d3610f64a8270d8ee47a9b308e9340fec43c184ef8e3b1ee +size 83296 diff --git a/Improved Husks/Characters/Huskmutantcrawler/damage1.ogg b/Improved Husks/Characters/Huskmutantcrawler/damage1.ogg new file mode 100644 index 0000000..dfdd739 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98c282b8acbfcd3105e9d6facd5d7c470bef211957eeb6cc41aa5ce55875acf5 +size 48430 diff --git a/Improved Husks/Characters/Huskmutantcrawler/damage2.ogg b/Improved Husks/Characters/Huskmutantcrawler/damage2.ogg new file mode 100644 index 0000000..19833c4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e5a0eba07371e4d3eda17bad4fc3531e256dfd89b1ed5f946b2644df16e8dfb +size 33546 diff --git a/Improved Husks/Characters/Huskmutantcrawler/damage3.ogg b/Improved Husks/Characters/Huskmutantcrawler/damage3.ogg new file mode 100644 index 0000000..a418749 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:814154d231522dac2563cd1e030471d41e3ac51b9c01a4e8d1a7f150bcc9c5cc +size 31967 diff --git a/Improved Husks/Characters/Huskmutantcrawler/death1.ogg b/Improved Husks/Characters/Huskmutantcrawler/death1.ogg new file mode 100644 index 0000000..a2f9eb7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31fb8a3e52802112e86fcb16be8286d48ccfe8352a067113910b7fc107d76b75 +size 69074 diff --git a/Improved Husks/Characters/Huskmutantcrawler/death2.ogg b/Improved Husks/Characters/Huskmutantcrawler/death2.ogg new file mode 100644 index 0000000..bad2103 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5752da1cb98b8089162e2c98cd63f5ea03382869d459a033581101781d631d5 +size 84509 diff --git a/Improved Husks/Characters/Huskmutantcrawler/huskmutantcrawler.png b/Improved Husks/Characters/Huskmutantcrawler/huskmutantcrawler.png new file mode 100644 index 0000000..5336dd7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/huskmutantcrawler.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a25d3c303a26a8f0cd2223418cab618b994c035e07350fc57d2544473f48768 +size 84099 diff --git a/Improved Husks/Characters/Huskmutantcrawler/idle1.ogg b/Improved Husks/Characters/Huskmutantcrawler/idle1.ogg new file mode 100644 index 0000000..7565bd7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a13c2ee58eda599b3979f08e22d926c3290edddc5628aa1303c7e960f03418b +size 49243 diff --git a/Improved Husks/Characters/Huskmutantcrawler/idle2.ogg b/Improved Husks/Characters/Huskmutantcrawler/idle2.ogg new file mode 100644 index 0000000..768b8b7 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a8e5aa7c5958faec2689a216bfab1c425d9dcfde580fe71b80a58e4e610b1ee +size 55730 diff --git a/Improved Husks/Characters/Huskmutantcrawler/idle3.ogg b/Improved Husks/Characters/Huskmutantcrawler/idle3.ogg new file mode 100644 index 0000000..8f2380f --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b984e7fac572eee303655741b2fb4b2f905b4885bad1e934eddb6e1e989242e +size 43462 diff --git a/Improved Husks/Characters/Huskmutantcrawler/idle4.ogg b/Improved Husks/Characters/Huskmutantcrawler/idle4.ogg new file mode 100644 index 0000000..0006ff1 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac3f1189cf1e9a4dc43efd70c175994afdb9042a95dc34b92a5d37850294c8e6 +size 50183 diff --git a/Improved Husks/Characters/Huskmutantcrawler/spawnclose.ogg b/Improved Husks/Characters/Huskmutantcrawler/spawnclose.ogg new file mode 100644 index 0000000..dfd6dec --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e641fd49cc096f51746d3c9794eb4aa4cfa66ab7b0ef186c0fd4465014da81a +size 462744 diff --git a/Improved Husks/Characters/Huskmutantcrawler/spawnfar.ogg b/Improved Husks/Characters/Huskmutantcrawler/spawnfar.ogg new file mode 100644 index 0000000..3f4dce0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantcrawler/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ec6a852246e919f93f17cd3b30ea89675c5bb14c22d774638972af3b7a34d5 +size 104452 diff --git a/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanCrouch.xml b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanCrouch.xml new file mode 100644 index 0000000..67db520 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanRun.xml b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanRun.xml new file mode 100644 index 0000000..d5a43a9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimFast.xml b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimFast.xml new file mode 100644 index 0000000..e533dee --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimSlow.xml b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimSlow.xml new file mode 100644 index 0000000..b969f5b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanWalk.xml b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanWalk.xml new file mode 100644 index 0000000..78ae458 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Animations/HuskmutanthumanWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Huskmutanthuman.xml b/Improved Husks/Characters/Huskmutanthuman/Huskmutanthuman.xml new file mode 100644 index 0000000..df06c04 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Huskmutanthuman.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/Ragdolls/HuskmutanthumanDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutanthuman/Ragdolls/HuskmutanthumanDefaultRagdoll.xml new file mode 100644 index 0000000..ed541fc --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/Ragdolls/HuskmutanthumanDefaultRagdoll.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthuman/attack1.ogg b/Improved Husks/Characters/Huskmutanthuman/attack1.ogg new file mode 100644 index 0000000..932eba9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bea9108abafe138090056184d6103e3314ecc6c4612b45f74179e5d76717a83 +size 91194 diff --git a/Improved Husks/Characters/Huskmutanthuman/attack2.ogg b/Improved Husks/Characters/Huskmutanthuman/attack2.ogg new file mode 100644 index 0000000..cd4ffbc --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a49e91fdebed31a254a01c326b093c67200f347c733ffc24ca37fb76bb1fd0a +size 86960 diff --git a/Improved Husks/Characters/Huskmutanthuman/attack3.ogg b/Improved Husks/Characters/Huskmutanthuman/attack3.ogg new file mode 100644 index 0000000..257a503 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d3549c2a27de533668971fd647e3f7fba58c961f6cce3455bcd2ef1403fb778 +size 79374 diff --git a/Improved Husks/Characters/Huskmutanthuman/damage1.ogg b/Improved Husks/Characters/Huskmutanthuman/damage1.ogg new file mode 100644 index 0000000..c2ee59b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2625bc3682fed12c8a0649306964213946a94dc65a8d25cb70d850f85daa269a +size 34377 diff --git a/Improved Husks/Characters/Huskmutanthuman/damage2.ogg b/Improved Husks/Characters/Huskmutanthuman/damage2.ogg new file mode 100644 index 0000000..98d2d3e --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7383319c03bc8d33101b6b91a09bbf60e269fc9ff0f1f0957e76dc7702bc9ce4 +size 35132 diff --git a/Improved Husks/Characters/Huskmutanthuman/damage3.ogg b/Improved Husks/Characters/Huskmutanthuman/damage3.ogg new file mode 100644 index 0000000..079a0b2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b3e022ac13aef090f19d9aa358d96eef1a6a475725f75a4ac7851bf5119b725 +size 33921 diff --git a/Improved Husks/Characters/Huskmutanthuman/death1.ogg b/Improved Husks/Characters/Huskmutanthuman/death1.ogg new file mode 100644 index 0000000..ccaec05 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6242d072adb3d82968fea79b7cbe8f5e5a7a40041b6e2f6170a237e380abd4a2 +size 95470 diff --git a/Improved Husks/Characters/Huskmutanthuman/death2.ogg b/Improved Husks/Characters/Huskmutanthuman/death2.ogg new file mode 100644 index 0000000..b37a551 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feee6ffa4e881f0155d3e41b195165179a189c3c8448c1ad086717e01ddc02db +size 112941 diff --git a/Improved Husks/Characters/Huskmutanthuman/dismember.ogg b/Improved Husks/Characters/Huskmutanthuman/dismember.ogg new file mode 100644 index 0000000..24572c6 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/dismember.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2532cca16d14dd9abed271eb678072550953c21c6c7f1d9ebfd0c4642a326100 +size 105803 diff --git a/Improved Husks/Characters/Huskmutanthuman/huskmutanthumanhead.png b/Improved Husks/Characters/Huskmutanthuman/huskmutanthumanhead.png new file mode 100644 index 0000000..4fec698 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/huskmutanthumanhead.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11683484ec6fd08e820d3f813e2f03e0888681281d436f89baf730e8458378ef +size 12924 diff --git a/Improved Husks/Characters/Huskmutanthuman/huskmutanthumantorso.png b/Improved Husks/Characters/Huskmutanthuman/huskmutanthumantorso.png new file mode 100644 index 0000000..d2b49de --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/huskmutanthumantorso.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1e9b99d66a3c3d048bdf5c9b760b0deedcf01e7986b0dab05d07249bb2fb9ed +size 59333 diff --git a/Improved Husks/Characters/Huskmutanthuman/idle1.ogg b/Improved Husks/Characters/Huskmutanthuman/idle1.ogg new file mode 100644 index 0000000..8a0b9ae --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fa5b158dd4454c69a80b14087073e86d141b2ed1649b634f005e0ae7baa47d1 +size 38444 diff --git a/Improved Husks/Characters/Huskmutanthuman/idle2.ogg b/Improved Husks/Characters/Huskmutanthuman/idle2.ogg new file mode 100644 index 0000000..0ad6ff6 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8c2938dd14667d79cb83e8e7601315cc86015273ee49ac464a74f388770aaa3 +size 37566 diff --git a/Improved Husks/Characters/Huskmutanthuman/idle3.ogg b/Improved Husks/Characters/Huskmutanthuman/idle3.ogg new file mode 100644 index 0000000..02bc8d9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7db949c7edfd94625934f6a0b1fdf6ac4f252cbafc5ad41798dcd3cef7b8b53f +size 32477 diff --git a/Improved Husks/Characters/Huskmutanthuman/spawnclose.ogg b/Improved Husks/Characters/Huskmutanthuman/spawnclose.ogg new file mode 100644 index 0000000..4638711 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:923e9afaf3a08dc5d99866c5550be5ea58d4ce5042dde12f2433630022f75a40 +size 316254 diff --git a/Improved Husks/Characters/Huskmutanthuman/spawnfar.ogg b/Improved Husks/Characters/Huskmutanthuman/spawnfar.ogg new file mode 100644 index 0000000..4f5c2de --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthuman/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab5989aa51c4dd520b2bc7b396b7ad4967c8195f8e0355ed2e62a209595af7da +size 80784 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadRun.xml b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadRun.xml new file mode 100644 index 0000000..fa87da3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimFast.xml b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimFast.xml new file mode 100644 index 0000000..94891bb --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimSlow.xml b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimSlow.xml new file mode 100644 index 0000000..77aa4f4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadWalk.xml b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadWalk.xml new file mode 100644 index 0000000..12bea87 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Animations/HuskmutanthumanheadWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Huskmutanthumanhead.xml b/Improved Husks/Characters/Huskmutanthumanhead/Huskmutanthumanhead.xml new file mode 100644 index 0000000..8a4aa87 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Huskmutanthumanhead.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/Ragdolls/HuskmutanthumanheadDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutanthumanhead/Ragdolls/HuskmutanthumanheadDefaultRagdoll.xml new file mode 100644 index 0000000..b57577a --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/Ragdolls/HuskmutanthumanheadDefaultRagdoll.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumanhead/attack1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/attack1.ogg new file mode 100644 index 0000000..4a43f25 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37d00018b3b2b8de68224dabe62c6b043dd4d12ca63c1fe16ced6124f9bed570 +size 82357 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/attack2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/attack2.ogg new file mode 100644 index 0000000..4bc923d --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef9b1f3c622f43e0e3ea9f241c4703c432c983c55884302411d5cef1df2ba7b6 +size 70712 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/attack3.ogg b/Improved Husks/Characters/Huskmutanthumanhead/attack3.ogg new file mode 100644 index 0000000..2b40f96 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ceea963af41bf2ad6b24d6e1b595a4c4009f13391b317188a04f28ac313c6e8 +size 74318 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/damage1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/damage1.ogg new file mode 100644 index 0000000..c764579 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ddfb6094329ebff0df676b7206788e34f51190558c16da1c82f7365d5ab183c +size 30514 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/damage2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/damage2.ogg new file mode 100644 index 0000000..914ccf5 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75e4068bbcc20f1791a174091f98195a5966aa77bf12555ea5fab816ad58381e +size 31359 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/damage3.ogg b/Improved Husks/Characters/Huskmutanthumanhead/damage3.ogg new file mode 100644 index 0000000..427b8ae --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c100077597ea5dd186de0830af30131f974ddfe4f583df19ad91add6f8f8b305 +size 33846 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/death1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/death1.ogg new file mode 100644 index 0000000..3c0c302 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ae5b7a1ef30989880778280947bff09a08e075eeeb3a23c9ceebd630e237170 +size 105709 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/death2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/death2.ogg new file mode 100644 index 0000000..e0cba37 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd15f1d2b85758ed6fae06f82b49db2e6dc7540cf30fe42c57b74a78dd970e15 +size 120767 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/headloop.ogg b/Improved Husks/Characters/Huskmutanthumanhead/headloop.ogg new file mode 100644 index 0000000..85146bb --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/headloop.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:947c178266cf0aa6c7e167b6507668b018979b58df0ecc5215662a95f52a3678 +size 292026 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/idle1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/idle1.ogg new file mode 100644 index 0000000..b3c5b73 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ee45c57c168d794cd735ee7974c2f77d49673ac970544fae5489b372f05417d +size 29857 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/idle2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/idle2.ogg new file mode 100644 index 0000000..045d43b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50a67d82cd7160cca660eb4d734bb4566b3c82b5a90f839560ba06441ae180cd +size 34295 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/idle3.ogg b/Improved Husks/Characters/Huskmutanthumanhead/idle3.ogg new file mode 100644 index 0000000..1662a13 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dca64df861a2617c5ce6616fa85d9a6db4ad7666adfadbe4af5bae721541fdde +size 28155 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie.ogg new file mode 100644 index 0000000..d0034c8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fc199b0bf90c9ce8f0b1fb4eeadbae02bd54eff9625679350a49817d2f01601 +size 190340 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie1.ogg new file mode 100644 index 0000000..1b348ed --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackdie1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f10de4c49adb2579fe1aa68cd469dd117541f4bb7c927266db25d4e7caed200 +size 202259 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend.ogg new file mode 100644 index 0000000..0f5bd6c --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7277b791c944e4cb00925c5d7e1eb37968edf685fba4baf574e8b8de2c98e1 +size 208251 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend2.ogg new file mode 100644 index 0000000..fa5ce78 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackend2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aafe5ea242e0c459f4bb99efaa94571d8cdb5eedf2d6e3f7f012fe3683122a8 +size 211003 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackendfar.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackendfar.ogg new file mode 100644 index 0000000..8b11cfe --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackendfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91b76d68fa2819354ef120551b9d4d4f5da864b44b886ef95fba41819f42791a +size 59563 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart.ogg new file mode 100644 index 0000000..b3a4ea6 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a2213f7da820868bb0cf8488ebe27d5fd3abde5be05db5ef1d9fab7e827357 +size 171632 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart1.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart1.ogg new file mode 100644 index 0000000..e9c2825 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed28c3fb85e9829b9e6304cb7070dab7a6db015ff1e26561b8b7060ab9be75ed +size 169976 diff --git a/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart2.ogg b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart2.ogg new file mode 100644 index 0000000..4bc5a0c --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumanhead/severedheadhijackstart2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c91bcebbf99dc3dfaad304b5005a8c1cf2d3e57723246b19e2a1a69163175da +size 172175 diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoRun.xml b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoRun.xml new file mode 100644 index 0000000..c9807b4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimFast.xml b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimFast.xml new file mode 100644 index 0000000..10e75a4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimSlow.xml b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimSlow.xml new file mode 100644 index 0000000..98ac1fa --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoWalk.xml b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoWalk.xml new file mode 100644 index 0000000..0f630a6 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Animations/HuskmutanthumantorsoWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Huskmutanthumantorso.xml b/Improved Husks/Characters/Huskmutanthumantorso/Huskmutanthumantorso.xml new file mode 100644 index 0000000..51c6192 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Huskmutanthumantorso.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/Ragdolls/HuskmutanthumantorsoDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutanthumantorso/Ragdolls/HuskmutanthumantorsoDefaultRagdoll.xml new file mode 100644 index 0000000..abed14e --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/Ragdolls/HuskmutanthumantorsoDefaultRagdoll.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthumantorso/huskmutanthumantorsosevered.png b/Improved Husks/Characters/Huskmutanthumantorso/huskmutanthumantorsosevered.png new file mode 100644 index 0000000..f92aee0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthumantorso/huskmutanthumantorsosevered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c89f065993062f79f9b335c86e2eeac4aa0144c52cf2fa19208b7b6fbae13498 +size 108315 diff --git a/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterCrouch.xml b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterCrouch.xml new file mode 100644 index 0000000..b0329fe --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterRun.xml b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterRun.xml new file mode 100644 index 0000000..b336768 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimFast.xml b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimFast.xml new file mode 100644 index 0000000..1fc5cc9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimSlow.xml b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimSlow.xml new file mode 100644 index 0000000..1879484 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterWalk.xml b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterWalk.xml new file mode 100644 index 0000000..21c001b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Animations/HuskmutanthunterWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Huskmutanthunter.xml b/Improved Husks/Characters/Huskmutanthunter/Huskmutanthunter.xml new file mode 100644 index 0000000..b399376 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Huskmutanthunter.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/Ragdolls/HuskmutanthunterDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutanthunter/Ragdolls/HuskmutanthunterDefaultRagdoll.xml new file mode 100644 index 0000000..51aa554 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/Ragdolls/HuskmutanthunterDefaultRagdoll.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanthunter/attack1.ogg b/Improved Husks/Characters/Huskmutanthunter/attack1.ogg new file mode 100644 index 0000000..36c033c --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08b74a7e088175d5513f0be189e3893fa9fc625311ed3ef36eca313edd780cfe +size 117225 diff --git a/Improved Husks/Characters/Huskmutanthunter/attack2.ogg b/Improved Husks/Characters/Huskmutanthunter/attack2.ogg new file mode 100644 index 0000000..8f0b2b3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48593f8fa08a97c14e515545f52cd2173f6010dc1dc67020df8f651d719484f5 +size 142705 diff --git a/Improved Husks/Characters/Huskmutanthunter/attack3.ogg b/Improved Husks/Characters/Huskmutanthunter/attack3.ogg new file mode 100644 index 0000000..f693ada --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c0fce7ad9cb4b72c848a54743f2409e35438bc72a25fbfcc40f004d1c1e724c +size 160761 diff --git a/Improved Husks/Characters/Huskmutanthunter/carry.ogg b/Improved Husks/Characters/Huskmutanthunter/carry.ogg new file mode 100644 index 0000000..75ce591 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/carry.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20c5005619351e90e878b8ed767ca39dce5b75271cf29cbaaab280085743cc9b +size 1470523 diff --git a/Improved Husks/Characters/Huskmutanthunter/damage1.ogg b/Improved Husks/Characters/Huskmutanthunter/damage1.ogg new file mode 100644 index 0000000..17d8356 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c388094fd58210929d874b6cd51418b799b6aaa027bed7d06fcbfebf4274bb0d +size 40984 diff --git a/Improved Husks/Characters/Huskmutanthunter/damage2.ogg b/Improved Husks/Characters/Huskmutanthunter/damage2.ogg new file mode 100644 index 0000000..e2fe4dc --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:877453acc52697e2dd9a53b1950cd3d127d2d95f872992f001f8eed90dc2ee11 +size 41437 diff --git a/Improved Husks/Characters/Huskmutanthunter/damage3.ogg b/Improved Husks/Characters/Huskmutanthunter/damage3.ogg new file mode 100644 index 0000000..1817824 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:362723cf8611cd6ab5a4def500e4ab1533dbbe11653927d99a452cd10349e5a6 +size 88183 diff --git a/Improved Husks/Characters/Huskmutanthunter/death1.ogg b/Improved Husks/Characters/Huskmutanthunter/death1.ogg new file mode 100644 index 0000000..fb0f3bd --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9602a99d86f1b051a9e1e9d7f7ef94ab4531120b63b3784141a1f369f44a2261 +size 59467 diff --git a/Improved Husks/Characters/Huskmutanthunter/death2.ogg b/Improved Husks/Characters/Huskmutanthunter/death2.ogg new file mode 100644 index 0000000..907f8de --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ceef3eefde69b3da5f1a80038ada6abcaa56836ca9e26d2e253fea9b8871183e +size 105287 diff --git a/Improved Husks/Characters/Huskmutanthunter/huskmutanthunter.png b/Improved Husks/Characters/Huskmutanthunter/huskmutanthunter.png new file mode 100644 index 0000000..e06e00b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/huskmutanthunter.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7297678c8da1b0dd2500ce4cf9a989f3798a5206c7e765a15e01a1a116352da0 +size 41081 diff --git a/Improved Husks/Characters/Huskmutanthunter/huskmutanthunterhead.png b/Improved Husks/Characters/Huskmutanthunter/huskmutanthunterhead.png new file mode 100644 index 0000000..afc39fd --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/huskmutanthunterhead.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e6445d7affc27984c2d57c5104790ed5a52309f06ba9a0c31f14b194b2d9ec2 +size 40382 diff --git a/Improved Husks/Characters/Huskmutanthunter/idle1.ogg b/Improved Husks/Characters/Huskmutanthunter/idle1.ogg new file mode 100644 index 0000000..a5e19eb --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fb226b6afebd6bd04d3f90104830ff0a727ae4254232b088f20abdbecf02296 +size 165525 diff --git a/Improved Husks/Characters/Huskmutanthunter/idle2.ogg b/Improved Husks/Characters/Huskmutanthunter/idle2.ogg new file mode 100644 index 0000000..37e79e2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b6f8ae26e8c64b8e43d4586c53d9f77de13778d83bd6207a026be24d3162144 +size 182611 diff --git a/Improved Husks/Characters/Huskmutanthunter/idle3.ogg b/Improved Husks/Characters/Huskmutanthunter/idle3.ogg new file mode 100644 index 0000000..0386ee0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1737e2275226e5b10b293b0da6b864747100238dd941ba0402e3357a58cbb4be +size 85401 diff --git a/Improved Husks/Characters/Huskmutanthunter/spawnclose.ogg b/Improved Husks/Characters/Huskmutanthunter/spawnclose.ogg new file mode 100644 index 0000000..a92b344 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fbd3ab57f90b4355a7cca4d3c75c488b5cf2537589a076c2e64632a9de673eb +size 206957 diff --git a/Improved Husks/Characters/Huskmutanthunter/spawnfar.ogg b/Improved Husks/Characters/Huskmutanthunter/spawnfar.ogg new file mode 100644 index 0000000..d7424f2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6c3b35ab584a999d7df57d472fbb8187cd9b7608badecff39818514e1700558 +size 33508 diff --git a/Improved Husks/Characters/Huskmutanthunter/spawnhead.ogg b/Improved Husks/Characters/Huskmutanthunter/spawnhead.ogg new file mode 100644 index 0000000..57a9d15 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/spawnhead.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f97335f5665c7df9642ffaafab24666f3a7e3e5b8d01668c1dfce0c7f78586c3 +size 205009 diff --git a/Improved Husks/Characters/Huskmutanthunter/spit.ogg b/Improved Husks/Characters/Huskmutanthunter/spit.ogg new file mode 100644 index 0000000..a7f3e8d --- /dev/null +++ b/Improved Husks/Characters/Huskmutanthunter/spit.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4021bfe5adbe73eeab4a7b27cc4c02ed935aa818385ebc57ff76cf50128e2d97 +size 76519 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorRun.xml b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorRun.xml new file mode 100644 index 0000000..610383b --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimFast.xml b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimFast.xml new file mode 100644 index 0000000..c151275 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimSlow.xml b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimSlow.xml new file mode 100644 index 0000000..2aa974d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorWalk.xml b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorWalk.xml new file mode 100644 index 0000000..fdf16b1 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Animations/HuskmutantmudraptorWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.png b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.png new file mode 100644 index 0000000..b1bd44e --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:082df149e8e3c9cf39f8ceb49c20ab2fe5cabf5fc4731b58f5cd5d9b481c301f +size 301730 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.xml b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.xml new file mode 100644 index 0000000..c8885e0 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptor.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptorglow.png b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptorglow.png new file mode 100644 index 0000000..b0bfef8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Huskmutantmudraptorglow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1922d48713dd73a9026223cd8c9d94547c693627840b7fca706e0691d00b9150 +size 33635 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/Ragdolls/HuskmutantmudraptorDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutantmudraptor/Ragdolls/HuskmutantmudraptorDefaultRagdoll.xml new file mode 100644 index 0000000..8691fc4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/Ragdolls/HuskmutantmudraptorDefaultRagdoll.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutantmudraptor/attack1.ogg b/Improved Husks/Characters/Huskmutantmudraptor/attack1.ogg new file mode 100644 index 0000000..4b9ba05 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0a7af7b80394bbc4cd53e9ee28f1621eba985a0afe6a35b74c58039537fa0a3 +size 134939 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/attack2.ogg b/Improved Husks/Characters/Huskmutantmudraptor/attack2.ogg new file mode 100644 index 0000000..56bf5d8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a49178bd67965c8c6a9da061a84f2d08797ceb16641b6366cd425c5e12799f73 +size 116408 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/damage1.ogg b/Improved Husks/Characters/Huskmutantmudraptor/damage1.ogg new file mode 100644 index 0000000..71d316d --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76c2b711c6ed3e9b091adcdd825b49136526bfd49247562418a0275f61223bed +size 92851 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/damage2.ogg b/Improved Husks/Characters/Huskmutantmudraptor/damage2.ogg new file mode 100644 index 0000000..e456076 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b8fb602b6ddad44e7940225a1f7ac5e16ad958ec8079bbcd994b8775045832d +size 101939 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/death1.ogg b/Improved Husks/Characters/Huskmutantmudraptor/death1.ogg new file mode 100644 index 0000000..cc2c751 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec6485c60b3ac07d6a1f4f86dd5def187297d0ab578099590f710b4723c8039c +size 176139 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/death2.ogg b/Improved Husks/Characters/Huskmutantmudraptor/death2.ogg new file mode 100644 index 0000000..8fb6779 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8db06652af6b7ab9bca4c7c9bc5951266aa376a50926f28edba4635920207b8 +size 133055 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/idle1.ogg b/Improved Husks/Characters/Huskmutantmudraptor/idle1.ogg new file mode 100644 index 0000000..46d85bd --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ff75e782bbd86c470793fd97c8f5af48fe5eb0fb00904e9d6cc5c58c7ff8d43 +size 249171 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/idle2.ogg b/Improved Husks/Characters/Huskmutantmudraptor/idle2.ogg new file mode 100644 index 0000000..d985d91 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a84ba495ebc7be7c515e4b86337d7bb3435cdb997b4a426e673ccb67a8a4e1a +size 155175 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/idle3.ogg b/Improved Husks/Characters/Huskmutantmudraptor/idle3.ogg new file mode 100644 index 0000000..a875539 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:696e251f6f30717fe75a25859c96aa6a5fba362a9b7330e621e8f47a02028b64 +size 210298 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spawnclose.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spawnclose.ogg new file mode 100644 index 0000000..8396866 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70700ed1247dc906dd884e5f755dd55cb844e211e8e5e67127b7dfcbbdb14979 +size 500857 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spawnfar.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spawnfar.ogg new file mode 100644 index 0000000..5fd6465 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ccb2ff66d9279a410e0ecdbb7ce5c747c5a438a57098de2671b8b9461e42b46 +size 114653 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spit.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spit.ogg new file mode 100644 index 0000000..803de60 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spit.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc6ed2d10b293f84c9b5aeab244c18ee9e7e7f61389f672a0621949c72a8e16c +size 168804 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spit2.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spit2.ogg new file mode 100644 index 0000000..4312590 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spit2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8f14cf46c02465e4aa08f4cf220030c4b361cdbacd7771b6117dc340e511fe5 +size 205444 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spit3.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spit3.ogg new file mode 100644 index 0000000..a8991c8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spit3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a23d321288a6b00b18c7d2df5c93f4d2d39c0550909e581088d4179ece21f76 +size 290575 diff --git a/Improved Husks/Characters/Huskmutantmudraptor/spithit.ogg b/Improved Husks/Characters/Huskmutantmudraptor/spithit.ogg new file mode 100644 index 0000000..bfbaad5 --- /dev/null +++ b/Improved Husks/Characters/Huskmutantmudraptor/spithit.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d366a9c19942ba55ec936acc26b92a77d6b9a615c5ed88744e0866feb7b98ad4 +size 58195 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimFast.xml b/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimFast.xml new file mode 100644 index 0000000..3574e97 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimSlow.xml b/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimSlow.xml new file mode 100644 index 0000000..c672b19 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/Animations/HuskmutanttigerthresherSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutantthresher.png b/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutantthresher.png new file mode 100644 index 0000000..2e71737 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutantthresher.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:236251cb37833818b5a20999826cc0ee4e528ab66914926e854e9369b8ff395e +size 389989 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutanttigerthresher.xml b/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutanttigerthresher.xml new file mode 100644 index 0000000..53248ad --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/Huskmutanttigerthresher.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/Ragdolls/HuskmutanttigerthresherDefaultRagdoll.xml b/Improved Husks/Characters/Huskmutanttigerthresher/Ragdolls/HuskmutanttigerthresherDefaultRagdoll.xml new file mode 100644 index 0000000..eb150c9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/Ragdolls/HuskmutanttigerthresherDefaultRagdoll.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/attack1.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/attack1.ogg new file mode 100644 index 0000000..da96c95 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1d78d6d1b80412189f8d95c27f1fc5ebcd6b9393f4c310670005c1383f6cd0d +size 152526 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/attack2.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/attack2.ogg new file mode 100644 index 0000000..bfb8da9 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee6b33d7c65ebf470510bfaeec6f86756350291f9be50a3d7db06e7d3b6cd1e6 +size 153947 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/attack3.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/attack3.ogg new file mode 100644 index 0000000..2ca9b0b --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f82c954df7f5a77f014c1d242c050d1350902db3c3132510e3c97a70d4c0a70f +size 161823 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/damage1.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/damage1.ogg new file mode 100644 index 0000000..b3d4f0f --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2236836787041b0767c8c0e427656b2e8450b92cc10bcce36aea36168f53fc1f +size 55898 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/damage2.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/damage2.ogg new file mode 100644 index 0000000..b5212a3 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:067557c04c4909939fc1b36e7e9e6d154d277521777b71742c7c4b1d1582a05f +size 68953 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/death1.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/death1.ogg new file mode 100644 index 0000000..71884d2 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f0497a2bf6e2a10f57828e473bc259726f15585665ea0fa70abc1bbbc6e325e +size 125750 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/death2.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/death2.ogg new file mode 100644 index 0000000..39355d8 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f3a256f38f30d13eb4a89b4c756038a131981d6c0e1c64b9c37830d53db0dd9 +size 184248 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/idle1.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/idle1.ogg new file mode 100644 index 0000000..470050c --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b033f90a4a14cc43f6b5b2da86dcb7619d949f49b4059de4bba7bb6933f785f7 +size 198395 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/idle2.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/idle2.ogg new file mode 100644 index 0000000..75ef489 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:854f6aa545bdc41ca072035a20a771e9bdf7aa73be3835ef8ae0dfd597586b57 +size 202129 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/idle3.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/idle3.ogg new file mode 100644 index 0000000..b9f633c --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5eb2353afe8fd53bb24e177569a59ac7be4c737dc7dea29957b5fbe070cfe8f7 +size 108965 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/idle4.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/idle4.ogg new file mode 100644 index 0000000..307e150 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa31b36c7f48ba4bc52cf58a959492935a760547154a793b2b07df1fa25564a4 +size 143961 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/spawnclose.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/spawnclose.ogg new file mode 100644 index 0000000..40e53e4 --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/spawnclose.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c8f714639284141e56dde96d53d1adc49b10ff41e9befac44a79fbd68c7f5d1 +size 184850 diff --git a/Improved Husks/Characters/Huskmutanttigerthresher/spawnfar.ogg b/Improved Husks/Characters/Huskmutanttigerthresher/spawnfar.ogg new file mode 100644 index 0000000..3ed197d --- /dev/null +++ b/Improved Husks/Characters/Huskmutanttigerthresher/spawnfar.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e315fce7ff7ac18a905149194a21fed219833ed7c66c75454c1d96391c4e4036 +size 55873 diff --git a/Improved Husks/Characters/Huskold/Animations/HuskoldCrouch.xml b/Improved Husks/Characters/Huskold/Animations/HuskoldCrouch.xml new file mode 100644 index 0000000..3038b43 --- /dev/null +++ b/Improved Husks/Characters/Huskold/Animations/HuskoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Animations/HuskoldRun.xml b/Improved Husks/Characters/Huskold/Animations/HuskoldRun.xml new file mode 100644 index 0000000..8ded1c1 --- /dev/null +++ b/Improved Husks/Characters/Huskold/Animations/HuskoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Animations/HuskoldSwimFast.xml b/Improved Husks/Characters/Huskold/Animations/HuskoldSwimFast.xml new file mode 100644 index 0000000..5b1c681 --- /dev/null +++ b/Improved Husks/Characters/Huskold/Animations/HuskoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Animations/HuskoldSwimSlow.xml b/Improved Husks/Characters/Huskold/Animations/HuskoldSwimSlow.xml new file mode 100644 index 0000000..2d3ac37 --- /dev/null +++ b/Improved Husks/Characters/Huskold/Animations/HuskoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Animations/HuskoldWalk.xml b/Improved Husks/Characters/Huskold/Animations/HuskoldWalk.xml new file mode 100644 index 0000000..b314511 --- /dev/null +++ b/Improved Husks/Characters/Huskold/Animations/HuskoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Huskold.xml b/Improved Husks/Characters/Huskold/Huskold.xml new file mode 100644 index 0000000..b1b3fea --- /dev/null +++ b/Improved Husks/Characters/Huskold/Huskold.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/Ragdolls/HuskoldDefaultRagdoll.xml b/Improved Husks/Characters/Huskold/Ragdolls/HuskoldDefaultRagdoll.xml new file mode 100644 index 0000000..4d8259f --- /dev/null +++ b/Improved Husks/Characters/Huskold/Ragdolls/HuskoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskold/creak.ogg b/Improved Husks/Characters/Huskold/creak.ogg new file mode 100644 index 0000000..0f48cef --- /dev/null +++ b/Improved Husks/Characters/Huskold/creak.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec885816aab756718c47cad56a523115265212103439b62e0e2f018f8666c6e +size 349418 diff --git a/Improved Husks/Characters/Huskold/creak2.ogg b/Improved Husks/Characters/Huskold/creak2.ogg new file mode 100644 index 0000000..faca46f --- /dev/null +++ b/Improved Husks/Characters/Huskold/creak2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e4c9ca39b21037c62b8a5e8c708aa09b83616c51f555b3f6b41ae9fbfb37f8c +size 326462 diff --git a/Improved Husks/Characters/Huskold/creak3.ogg b/Improved Husks/Characters/Huskold/creak3.ogg new file mode 100644 index 0000000..2beebee --- /dev/null +++ b/Improved Husks/Characters/Huskold/creak3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccf414bb206e77c837ecb1ad02b60f7043af21ef3ff7c76becf646d50928a64e +size 184879 diff --git a/Improved Husks/Characters/Huskold/rustedhelmetnormal.png b/Improved Husks/Characters/Huskold/rustedhelmetnormal.png new file mode 100644 index 0000000..4e8c99f --- /dev/null +++ b/Improved Husks/Characters/Huskold/rustedhelmetnormal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0084276988cde84db3334309b2d8a3538582800044efc17e7e2de1001df603f7 +size 28044 diff --git a/Improved Husks/Characters/Huskold/rustedsuit.png b/Improved Husks/Characters/Huskold/rustedsuit.png new file mode 100644 index 0000000..71ce8d7 --- /dev/null +++ b/Improved Husks/Characters/Huskold/rustedsuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11811e65aa2c90e9b28e8c4e6380c2ec37b4f56b1530ceb98046b1f65f91ec0f +size 122065 diff --git a/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldCrouch.xml b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldCrouch.xml new file mode 100644 index 0000000..18764f7 --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldRun.xml b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldRun.xml new file mode 100644 index 0000000..df74a0e --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimFast.xml b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimFast.xml new file mode 100644 index 0000000..95db91e --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimSlow.xml b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimSlow.xml new file mode 100644 index 0000000..28a3d76 --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldWalk.xml b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldWalk.xml new file mode 100644 index 0000000..72dfb6b --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Animations/HuskpucsoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Huskpucsold.xml b/Improved Husks/Characters/Huskpucsold/Huskpucsold.xml new file mode 100644 index 0000000..8a9bf3e --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Huskpucsold.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/Ragdolls/HuskpucsoldDefaultRagdoll.xml b/Improved Husks/Characters/Huskpucsold/Ragdolls/HuskpucsoldDefaultRagdoll.xml new file mode 100644 index 0000000..c538cae --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/Ragdolls/HuskpucsoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskpucsold/pucsheal.ogg b/Improved Husks/Characters/Huskpucsold/pucsheal.ogg new file mode 100644 index 0000000..7817f98 --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/pucsheal.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55982310806e71b18a10e14bad86adf9ec6117be4c3429a33054f506e8fff2d9 +size 273380 diff --git a/Improved Husks/Characters/Huskpucsold/rustedhelmetpucs.png b/Improved Husks/Characters/Huskpucsold/rustedhelmetpucs.png new file mode 100644 index 0000000..71ce50a --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/rustedhelmetpucs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec22bae5fa9f2ba72a2cb9b84c83358e799c0058a58eeb2fa5de266fcb685d4d +size 17911 diff --git a/Improved Husks/Characters/Huskpucsold/rustedpucssuit.png b/Improved Husks/Characters/Huskpucsold/rustedpucssuit.png new file mode 100644 index 0000000..8662cc8 --- /dev/null +++ b/Improved Husks/Characters/Huskpucsold/rustedpucssuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84e760c0a71c8d9b720be6b04f7e417f1ecffa40c4601ff82dd0988ee07e0166 +size 126916 diff --git a/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldCrouch.xml b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldCrouch.xml new file mode 100644 index 0000000..a648e17 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldRun.xml b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldRun.xml new file mode 100644 index 0000000..5128ec9 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimFast.xml b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimFast.xml new file mode 100644 index 0000000..a5cf571 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimSlow.xml b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimSlow.xml new file mode 100644 index 0000000..629398b --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldWalk.xml b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldWalk.xml new file mode 100644 index 0000000..4e135d1 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Animations/HuskslipoldWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Huskslipold.xml b/Improved Husks/Characters/Huskslipold/Huskslipold.xml new file mode 100644 index 0000000..552fbfd --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Huskslipold.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/Ragdolls/HuskslipoldDefaultRagdoll.xml b/Improved Husks/Characters/Huskslipold/Ragdolls/HuskslipoldDefaultRagdoll.xml new file mode 100644 index 0000000..033ace5 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/Ragdolls/HuskslipoldDefaultRagdoll.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Huskslipold/rustedhelmetslipsuit.png b/Improved Husks/Characters/Huskslipold/rustedhelmetslipsuit.png new file mode 100644 index 0000000..cf4e2f9 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/rustedhelmetslipsuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d984e7ee3cdbd5258b01140793e89b97e59d831f5405a5b93f9215fcece2e056 +size 20683 diff --git a/Improved Husks/Characters/Huskslipold/rustedslipsuit.png b/Improved Husks/Characters/Huskslipold/rustedslipsuit.png new file mode 100644 index 0000000..9b24e54 --- /dev/null +++ b/Improved Husks/Characters/Huskslipold/rustedslipsuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29df172426e9dd84be06cd974375c482a8f641e60db6499ce8c5353d4015d349 +size 96873 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskRun.xml b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskRun.xml new file mode 100644 index 0000000..9cdd6cb --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimFast.xml b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimFast.xml new file mode 100644 index 0000000..432e127 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimSlow.xml b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimSlow.xml new file mode 100644 index 0000000..7ffea54 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskWalk.xml b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskWalk.xml new file mode 100644 index 0000000..6cabdf7 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Animations/LegacycrawlerhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Legacycrawlerhusk.xml b/Improved Husks/Characters/Legacycrawlerhusk/Legacycrawlerhusk.xml new file mode 100644 index 0000000..7af8bde --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Legacycrawlerhusk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/Ragdolls/LegacycrawlerhuskDefaultRagdoll.xml b/Improved Husks/Characters/Legacycrawlerhusk/Ragdolls/LegacycrawlerhuskDefaultRagdoll.xml new file mode 100644 index 0000000..4f2e38a --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/Ragdolls/LegacycrawlerhuskDefaultRagdoll.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Legacycrawlerhusk/attack1.ogg b/Improved Husks/Characters/Legacycrawlerhusk/attack1.ogg new file mode 100644 index 0000000..a0c1fdb --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9cafd4ec3973c5ba2a04f7b25d0da1c42f6358c2bbb0d651ad88ee9b7cab329 +size 135198 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/attack2.ogg b/Improved Husks/Characters/Legacycrawlerhusk/attack2.ogg new file mode 100644 index 0000000..8864d91 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ecf5cacdc4085122ada83e438ca027974e1778d8a349478c1a293e93248cad4 +size 108168 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/damage1.ogg b/Improved Husks/Characters/Legacycrawlerhusk/damage1.ogg new file mode 100644 index 0000000..5ab6161 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02cd8b9a9de00adc5396f9d61fcc60339d6a9ed049af7ea6115f7181f4864f3c +size 46608 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/damage2.ogg b/Improved Husks/Characters/Legacycrawlerhusk/damage2.ogg new file mode 100644 index 0000000..423b4a9 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b066963dca95d2e3cc0bbe4dd500b9047506016c8c3a80e0941c0ba71b9b8191 +size 46562 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/death1.ogg b/Improved Husks/Characters/Legacycrawlerhusk/death1.ogg new file mode 100644 index 0000000..2cfbd9e --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0f0037db5f330c4f626dd99f6d85233cf185af951b0f9c483333d00962d9e00 +size 111592 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/death2.ogg b/Improved Husks/Characters/Legacycrawlerhusk/death2.ogg new file mode 100644 index 0000000..58aa5e8 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96f4909cb250a1956b189943d6ebb328221d1a8cc77d19d91fc06c9b915826d5 +size 88359 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/idle1.ogg b/Improved Husks/Characters/Legacycrawlerhusk/idle1.ogg new file mode 100644 index 0000000..0304344 --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d097839ec845bc29ecf68a846ffe2d2d87eae78c8ed1040aa10d01344f1737d0 +size 161420 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/idle2.ogg b/Improved Husks/Characters/Legacycrawlerhusk/idle2.ogg new file mode 100644 index 0000000..aa7e8ea --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44c5502dbdd62b083bb46f8e0b595c463c496acf309e7271cf621d7843d3a24c +size 131021 diff --git a/Improved Husks/Characters/Legacycrawlerhusk/legacycrawlerhusk.png b/Improved Husks/Characters/Legacycrawlerhusk/legacycrawlerhusk.png new file mode 100644 index 0000000..2c4deef --- /dev/null +++ b/Improved Husks/Characters/Legacycrawlerhusk/legacycrawlerhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1d8c188e591a2cac65136c4d342426654ea368549f46b15bfaacd27a40023dc +size 35867 diff --git a/Improved Husks/Characters/Mantishusk/Animations/MantishuskRun.xml b/Improved Husks/Characters/Mantishusk/Animations/MantishuskRun.xml new file mode 100644 index 0000000..2710505 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Animations/MantishuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimFast.xml b/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimFast.xml new file mode 100644 index 0000000..d8898ca --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimSlow.xml b/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimSlow.xml new file mode 100644 index 0000000..9fa95c5 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Animations/MantishuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/Animations/MantishuskWalk.xml b/Improved Husks/Characters/Mantishusk/Animations/MantishuskWalk.xml new file mode 100644 index 0000000..e959fc7 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Animations/MantishuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/Mantishusk.xml b/Improved Husks/Characters/Mantishusk/Mantishusk.xml new file mode 100644 index 0000000..bb40494 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Mantishusk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/Ragdolls/MantishuskDefaultRagdoll.xml b/Improved Husks/Characters/Mantishusk/Ragdolls/MantishuskDefaultRagdoll.xml new file mode 100644 index 0000000..341ac0e --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/Ragdolls/MantishuskDefaultRagdoll.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mantishusk/attack1.ogg b/Improved Husks/Characters/Mantishusk/attack1.ogg new file mode 100644 index 0000000..844adaa --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae3fc3eb9d486ce7ada01b655d7ea477db239ddd76cf984356ac9c1eac88716 +size 140470 diff --git a/Improved Husks/Characters/Mantishusk/attack2.ogg b/Improved Husks/Characters/Mantishusk/attack2.ogg new file mode 100644 index 0000000..86a081a --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33a4e9f97d4d88169b7bc184d3fbe6b1f0f024e1838b7e6e353af0f743b61667 +size 113889 diff --git a/Improved Husks/Characters/Mantishusk/damage1.ogg b/Improved Husks/Characters/Mantishusk/damage1.ogg new file mode 100644 index 0000000..30770a6 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4c4b6c848dd3f98c9c9ff442595800af85a28d5e1afef03081730ec7484a626 +size 58216 diff --git a/Improved Husks/Characters/Mantishusk/damage2.ogg b/Improved Husks/Characters/Mantishusk/damage2.ogg new file mode 100644 index 0000000..6a9da1c --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6977c52971ea2833e9465fc1ec57e90b5129213c0968d97b17090f51945b279 +size 86205 diff --git a/Improved Husks/Characters/Mantishusk/death.ogg b/Improved Husks/Characters/Mantishusk/death.ogg new file mode 100644 index 0000000..048e68a --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72a881e05344911c1601b9dae69eb7d54d6502a244c7e0a8c2e767b9b2fcab2d +size 136352 diff --git a/Improved Husks/Characters/Mantishusk/death2.ogg b/Improved Husks/Characters/Mantishusk/death2.ogg new file mode 100644 index 0000000..d0473cf --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d05f3d327d9e53f678b4446c96f3714d7be457e609e7a4ac4b127cd6e367162 +size 158008 diff --git a/Improved Husks/Characters/Mantishusk/idle1.ogg b/Improved Husks/Characters/Mantishusk/idle1.ogg new file mode 100644 index 0000000..04f69e1 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:410c6dd12ccb9786c4d46c5c43fa9ee888056d7f9adda594bcf36a258467286f +size 310832 diff --git a/Improved Husks/Characters/Mantishusk/idle2.ogg b/Improved Husks/Characters/Mantishusk/idle2.ogg new file mode 100644 index 0000000..e1ccb85 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9c9c30ecd42793c0cf45de8d2c0732ffddc82be3b2c8280aed460ef0efcbb0b +size 446925 diff --git a/Improved Husks/Characters/Mantishusk/idle3.ogg b/Improved Husks/Characters/Mantishusk/idle3.ogg new file mode 100644 index 0000000..bf442c2 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5bb8067dceb5820e5e4b664fcf8f2c400c5925a8a3e6fbacf8f39863303a1c8 +size 614804 diff --git a/Improved Husks/Characters/Mantishusk/mantishusk.png b/Improved Husks/Characters/Mantishusk/mantishusk.png new file mode 100644 index 0000000..0fb4036 --- /dev/null +++ b/Improved Husks/Characters/Mantishusk/mantishusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a570e6dda0cd3253b510c39b7ccbf193305d821a031880a1c7e16b0ade540a7 +size 79470 diff --git a/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimFast.xml b/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimFast.xml new file mode 100644 index 0000000..1320667 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimSlow.xml b/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimSlow.xml new file mode 100644 index 0000000..8a4e51e --- /dev/null +++ b/Improved Husks/Characters/Micoteron/Animations/MicoteronSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Micoteron/Micoteron.xml b/Improved Husks/Characters/Micoteron/Micoteron.xml new file mode 100644 index 0000000..0efa7b3 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/Micoteron.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Micoteron/Ragdolls/MicoteronDefaultRagdoll.xml b/Improved Husks/Characters/Micoteron/Ragdolls/MicoteronDefaultRagdoll.xml new file mode 100644 index 0000000..60e42cb --- /dev/null +++ b/Improved Husks/Characters/Micoteron/Ragdolls/MicoteronDefaultRagdoll.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Micoteron/attack1.ogg b/Improved Husks/Characters/Micoteron/attack1.ogg new file mode 100644 index 0000000..46641bc --- /dev/null +++ b/Improved Husks/Characters/Micoteron/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b84379291a6ae63d825ea1537957283a590c5c162566db6f8c6a6de47c4eb794 +size 294051 diff --git a/Improved Husks/Characters/Micoteron/attack2.ogg b/Improved Husks/Characters/Micoteron/attack2.ogg new file mode 100644 index 0000000..c9918cf --- /dev/null +++ b/Improved Husks/Characters/Micoteron/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90734a6467a2f91fc28020a203463fd096d6c46fd85b55bee948e322688ed7d1 +size 288645 diff --git a/Improved Husks/Characters/Micoteron/damage1.ogg b/Improved Husks/Characters/Micoteron/damage1.ogg new file mode 100644 index 0000000..a6296f3 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f951755a87ece4fee72de2f04e5423dfb5648a55b909053a5969900376cf379 +size 142865 diff --git a/Improved Husks/Characters/Micoteron/damage2.ogg b/Improved Husks/Characters/Micoteron/damage2.ogg new file mode 100644 index 0000000..278f25f --- /dev/null +++ b/Improved Husks/Characters/Micoteron/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66bfbf14ab592f3f4a731a5065d16ae3ef2aac090b38569578195da1c81905bf +size 240527 diff --git a/Improved Husks/Characters/Micoteron/death1.ogg b/Improved Husks/Characters/Micoteron/death1.ogg new file mode 100644 index 0000000..deabad3 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd47937f5cb5ccf94b6b928c97284a4240dd5c951400a5b90df9a14043dc79ab +size 293294 diff --git a/Improved Husks/Characters/Micoteron/death2.ogg b/Improved Husks/Characters/Micoteron/death2.ogg new file mode 100644 index 0000000..d1d45d3 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2d59fc65d1acecb2a3b4b78645020bea45520bf3c1c5fd4bca1907bce29febd +size 315010 diff --git a/Improved Husks/Characters/Micoteron/idle1.ogg b/Improved Husks/Characters/Micoteron/idle1.ogg new file mode 100644 index 0000000..355d8e7 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d2ecb08a9532dd3c275cb0693d9c05e7e1e617ba05f9ebe9a3a8a9665d654d3 +size 287391 diff --git a/Improved Husks/Characters/Micoteron/idle2.ogg b/Improved Husks/Characters/Micoteron/idle2.ogg new file mode 100644 index 0000000..0f521e9 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0b683947dfd90f8600487b8dc3d8536283c60d9b323d1e8491535fa5ffcafb0 +size 214975 diff --git a/Improved Husks/Characters/Micoteron/idle3.ogg b/Improved Husks/Characters/Micoteron/idle3.ogg new file mode 100644 index 0000000..e12736c --- /dev/null +++ b/Improved Husks/Characters/Micoteron/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b636d2ce9b1e6b1465e927744f39e44f1f4b2d67e2ea5698bd3558b7a8a9f4f1 +size 191059 diff --git a/Improved Husks/Characters/Micoteron/micoteron.png b/Improved Husks/Characters/Micoteron/micoteron.png new file mode 100644 index 0000000..15d4d75 --- /dev/null +++ b/Improved Husks/Characters/Micoteron/micoteron.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd50a4034b94b2a23695cd8df4b60ffe578c0cd5ba9895b9c22132f1c828f2fd +size 37887 diff --git a/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimFast.xml b/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimFast.xml new file mode 100644 index 0000000..e6ce129 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimSlow.xml b/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimSlow.xml new file mode 100644 index 0000000..7e207c3 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/Animations/MolochbabyhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochbabyhusk/Molochbabyhusk.xml b/Improved Husks/Characters/Molochbabyhusk/Molochbabyhusk.xml new file mode 100644 index 0000000..f356b77 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/Molochbabyhusk.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochbabyhusk/Ragdolls/MolochbabyhuskDefaultRagdoll.xml b/Improved Husks/Characters/Molochbabyhusk/Ragdolls/MolochbabyhuskDefaultRagdoll.xml new file mode 100644 index 0000000..ac6f7a6 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/Ragdolls/MolochbabyhuskDefaultRagdoll.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochbabyhusk/alarm1.ogg b/Improved Husks/Characters/Molochbabyhusk/alarm1.ogg new file mode 100644 index 0000000..f610ffb --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/alarm1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd648e2a1bba57e54113fc80a8083f9e8a7ce2f2b56e56ce50b1c63e158c1fc2 +size 292234 diff --git a/Improved Husks/Characters/Molochbabyhusk/alarm2.ogg b/Improved Husks/Characters/Molochbabyhusk/alarm2.ogg new file mode 100644 index 0000000..aed0485 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/alarm2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99dc9bcafbc5f4165ddc86af5b40e07566bf42dd46aaaac5ec42690ca6620109 +size 155954 diff --git a/Improved Husks/Characters/Molochbabyhusk/alarm3.ogg b/Improved Husks/Characters/Molochbabyhusk/alarm3.ogg new file mode 100644 index 0000000..90205ea --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/alarm3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13fe491f012e4e7c6d5a16af443a4c7df7f7214a4cb2c5d0b3f0c3c194805693 +size 218861 diff --git a/Improved Husks/Characters/Molochbabyhusk/alarm4.ogg b/Improved Husks/Characters/Molochbabyhusk/alarm4.ogg new file mode 100644 index 0000000..8de1567 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/alarm4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96ec4aaa20fe553c9cce3755bf7c1e8c2a25e4bb9f3b54ddf4a34a6d07866405 +size 155102 diff --git a/Improved Husks/Characters/Molochbabyhusk/damage1.ogg b/Improved Husks/Characters/Molochbabyhusk/damage1.ogg new file mode 100644 index 0000000..1deed11 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a38db842689a6328ea3f930a2cf1f23eb9afcc73e39e574db34ee45bbe9659c8 +size 85444 diff --git a/Improved Husks/Characters/Molochbabyhusk/damage2.ogg b/Improved Husks/Characters/Molochbabyhusk/damage2.ogg new file mode 100644 index 0000000..fdd549f --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a814c8e9c5efc0268b9a085c7643f934d92d8c60fca96eefd1c9fefd516369ab +size 80022 diff --git a/Improved Husks/Characters/Molochbabyhusk/damage3.ogg b/Improved Husks/Characters/Molochbabyhusk/damage3.ogg new file mode 100644 index 0000000..9efaf4f --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a90b1bc282ae3fcc1ebe1d903a79b7eb93b3a9e1a429ae956575a016b61b4b36 +size 89124 diff --git a/Improved Husks/Characters/Molochbabyhusk/damage4.ogg b/Improved Husks/Characters/Molochbabyhusk/damage4.ogg new file mode 100644 index 0000000..a2a3dfc --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/damage4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e4108d0211b609a25cd76ee4388e330799c4178fd12e30e2357a59d5fdb9e93 +size 73098 diff --git a/Improved Husks/Characters/Molochbabyhusk/damage5.ogg b/Improved Husks/Characters/Molochbabyhusk/damage5.ogg new file mode 100644 index 0000000..e1a4ef2 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/damage5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f012cb43491c3e42676c823e2aaa9220536a74c4caf652497d73dc15d15645c +size 77576 diff --git a/Improved Husks/Characters/Molochbabyhusk/death1.ogg b/Improved Husks/Characters/Molochbabyhusk/death1.ogg new file mode 100644 index 0000000..e2a6a36 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89d00bfd904e3d3e9c0ac24e80bf4f074354679a7205ad7b1cf5a303409a2fe0 +size 181036 diff --git a/Improved Husks/Characters/Molochbabyhusk/death2.ogg b/Improved Husks/Characters/Molochbabyhusk/death2.ogg new file mode 100644 index 0000000..b9878e0 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:931a7214b82e0dee0d68ccb76dc583430f7e82c85eab01de1f905057f67f9752 +size 179106 diff --git a/Improved Husks/Characters/Molochbabyhusk/death3.ogg b/Improved Husks/Characters/Molochbabyhusk/death3.ogg new file mode 100644 index 0000000..db0e22d --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/death3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:434ea0b8a2907792925749de67732d2dba682b1202cacf385300d9dfa02033b4 +size 206616 diff --git a/Improved Husks/Characters/Molochbabyhusk/idle1.ogg b/Improved Husks/Characters/Molochbabyhusk/idle1.ogg new file mode 100644 index 0000000..cbd7006 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09499c3c293aa927dcd3de9e3d09ac05db8c3a6d22ec697fd8588eb886a78edb +size 69500 diff --git a/Improved Husks/Characters/Molochbabyhusk/idle2.ogg b/Improved Husks/Characters/Molochbabyhusk/idle2.ogg new file mode 100644 index 0000000..2059ab4 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce3df2f1d11fdea4dab15aa5458be235a71a9e92b6bb840078877293da5449d9 +size 73643 diff --git a/Improved Husks/Characters/Molochbabyhusk/idle3.ogg b/Improved Husks/Characters/Molochbabyhusk/idle3.ogg new file mode 100644 index 0000000..64bef09 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0deb885dafad29f7ca704089b307371d82078d8d6d36f80284517f2b304475d4 +size 68679 diff --git a/Improved Husks/Characters/Molochbabyhusk/idle4.ogg b/Improved Husks/Characters/Molochbabyhusk/idle4.ogg new file mode 100644 index 0000000..33c4954 --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96cd653f57ab82a3460e7df82f37b2e67a2e1cbf23d5ddfd218e3bdd39487f29 +size 86411 diff --git a/Improved Husks/Characters/Molochbabyhusk/molochbabyhusk.png b/Improved Husks/Characters/Molochbabyhusk/molochbabyhusk.png new file mode 100644 index 0000000..e11ea0b --- /dev/null +++ b/Improved Husks/Characters/Molochbabyhusk/molochbabyhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b268031e787f771ecff9356356cdb36f4e6f9c08aee526ac5646172c94b67321 +size 109779 diff --git a/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimFast.xml b/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimFast.xml new file mode 100644 index 0000000..e1594d1 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimSlow.xml b/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimSlow.xml new file mode 100644 index 0000000..91ac0fb --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Animations/MolochhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochhusk/Molochblackhusk.png b/Improved Husks/Characters/Molochhusk/Molochblackhusk.png new file mode 100644 index 0000000..670772f --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Molochblackhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fce1795618367f907553fe7fec851ea4f71d5cdd1066d7d63b4046602be1b23 +size 3204775 diff --git a/Improved Husks/Characters/Molochhusk/Molochhusk.png b/Improved Husks/Characters/Molochhusk/Molochhusk.png new file mode 100644 index 0000000..5544a33 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Molochhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2ed612bc90123899aaedca710e78bdda4e6869dc37f0c04092297d9206f53cd +size 3208970 diff --git a/Improved Husks/Characters/Molochhusk/Molochhusk.xml b/Improved Husks/Characters/Molochhusk/Molochhusk.xml new file mode 100644 index 0000000..9cf0a8e --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Molochhusk.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochhusk/Ragdolls/MolochhuskDefaultRagdoll.xml b/Improved Husks/Characters/Molochhusk/Ragdolls/MolochhuskDefaultRagdoll.xml new file mode 100644 index 0000000..3fd9c23 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/Ragdolls/MolochhuskDefaultRagdoll.xml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Molochhusk/attack1.ogg b/Improved Husks/Characters/Molochhusk/attack1.ogg new file mode 100644 index 0000000..b33e031 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af7ef702d7fb8bcb07f1abbc6744e18230865f475d1642654b84fa31841881c7 +size 269329 diff --git a/Improved Husks/Characters/Molochhusk/attack2.ogg b/Improved Husks/Characters/Molochhusk/attack2.ogg new file mode 100644 index 0000000..0776287 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe5d928e0c25f6dc27d6959b7fee4ac44834e30f80a5b15939979dbd0c0d0cab +size 304983 diff --git a/Improved Husks/Characters/Molochhusk/attack3.ogg b/Improved Husks/Characters/Molochhusk/attack3.ogg new file mode 100644 index 0000000..a1dd63b --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12515f17511194034b5f5c35f658adc906b3506ee80bb35242931796296bed8f +size 263135 diff --git a/Improved Husks/Characters/Molochhusk/attack4.ogg b/Improved Husks/Characters/Molochhusk/attack4.ogg new file mode 100644 index 0000000..d5d7f81 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/attack4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0104153c860ecea7a5b27d46ef187bcfe9276941960b0158bc7c9c9db0270a32 +size 262824 diff --git a/Improved Husks/Characters/Molochhusk/bumpAttack.ogg b/Improved Husks/Characters/Molochhusk/bumpAttack.ogg new file mode 100644 index 0000000..b569e64 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/bumpAttack.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdef44f906eaa34f02e14c16902f5baed95539820dafc981a05a0fe092105f0e +size 391265 diff --git a/Improved Husks/Characters/Molochhusk/damage1.ogg b/Improved Husks/Characters/Molochhusk/damage1.ogg new file mode 100644 index 0000000..e40df61 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2159521f0eb52ea96f86d807428ec00057e383c9922ad3fb5ed2b66017fe4b22 +size 185224 diff --git a/Improved Husks/Characters/Molochhusk/damage2.ogg b/Improved Husks/Characters/Molochhusk/damage2.ogg new file mode 100644 index 0000000..5b223a0 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71bee7804021612c529c2320d8127069c71bee6b9b6e84f3d6ae14f7304f0de6 +size 246418 diff --git a/Improved Husks/Characters/Molochhusk/death1.ogg b/Improved Husks/Characters/Molochhusk/death1.ogg new file mode 100644 index 0000000..b2fb077 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f349c91b48b22372b932170420efa7fc66c193214dc7105c3050282637b002df +size 337683 diff --git a/Improved Husks/Characters/Molochhusk/death2.ogg b/Improved Husks/Characters/Molochhusk/death2.ogg new file mode 100644 index 0000000..a01f41d --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:365a49917cff1e1e090f64047da437d2beecaf32a1b6b21cefd56e9b05fafe4c +size 336194 diff --git a/Improved Husks/Characters/Molochhusk/hit.ogg b/Improved Husks/Characters/Molochhusk/hit.ogg new file mode 100644 index 0000000..d98a179 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/hit.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2a97aaa814335adcc9c63fcacbeedce586ebbe4a762d6c5c0fe8cf1b0072379 +size 157981 diff --git a/Improved Husks/Characters/Molochhusk/idle1.ogg b/Improved Husks/Characters/Molochhusk/idle1.ogg new file mode 100644 index 0000000..37d0302 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bde30f48f29eb89065ee47641afb7e1f121c5b7ccb4287f5cca3df97e8426c59 +size 369096 diff --git a/Improved Husks/Characters/Molochhusk/idle2.ogg b/Improved Husks/Characters/Molochhusk/idle2.ogg new file mode 100644 index 0000000..518006d --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5364f693abbdaa4dd6df9f6507ea132b693a6057f9c4fa53b31de6d1ffb8fb2d +size 387253 diff --git a/Improved Husks/Characters/Molochhusk/idle3.ogg b/Improved Husks/Characters/Molochhusk/idle3.ogg new file mode 100644 index 0000000..f50afa3 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:751f8df4c8b17c11503d8ec2aedc642ae70e765db1c490d49faa15f214f05f04 +size 380123 diff --git a/Improved Husks/Characters/Molochhusk/idle4.ogg b/Improved Husks/Characters/Molochhusk/idle4.ogg new file mode 100644 index 0000000..eb6c444 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9cab575347ec7c114a92e518b424bf4caa5f6c3c4a66285c875ab8c7abfe84d +size 349330 diff --git a/Improved Husks/Characters/Molochhusk/launch.ogg b/Improved Husks/Characters/Molochhusk/launch.ogg new file mode 100644 index 0000000..6abf96f --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/launch.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd397db5554bffc134bb0448eb871d8035f768c70cfeb77fe0db9f566c1b0ac0 +size 179527 diff --git a/Improved Husks/Characters/Molochhusk/moving.ogg b/Improved Husks/Characters/Molochhusk/moving.ogg new file mode 100644 index 0000000..864d051 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/moving.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89a959cd57919f28f120cdef62ebd7a372c18f4d1af960d507fbc50c450cdaee +size 1178333 diff --git a/Improved Husks/Characters/Molochhusk/pull.ogg b/Improved Husks/Characters/Molochhusk/pull.ogg new file mode 100644 index 0000000..6843180 --- /dev/null +++ b/Improved Husks/Characters/Molochhusk/pull.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c12e411b600be941c19487c233407224e37464e2483e4bc3a30bf59c62771df +size 55297 diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskRun.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskRun.xml new file mode 100644 index 0000000..d461253 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimFast.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimFast.xml new file mode 100644 index 0000000..68c1b31 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimSlow.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimSlow.xml new file mode 100644 index 0000000..4793315 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskWalk.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskWalk.xml new file mode 100644 index 0000000..97b8cfb --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Animations/Mudraptor_hatchlinghuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptor_hatchlinghusk.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptor_hatchlinghusk.xml new file mode 100644 index 0000000..911f7e4 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptor_hatchlinghusk.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptorhatchlinghusk.png b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptorhatchlinghusk.png new file mode 100644 index 0000000..50bf5be --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Mudraptorhatchlinghusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bd6cf590ad0764161f3c60cee3083000ae08b1ff1e9d4e268c9456e60b81e10 +size 379897 diff --git a/Improved Husks/Characters/Mudraptor_hatchlinghusk/Ragdolls/Mudraptor_hatchlinghuskDefaultRagdoll.xml b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Ragdolls/Mudraptor_hatchlinghuskDefaultRagdoll.xml new file mode 100644 index 0000000..d0a5624 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_hatchlinghusk/Ragdolls/Mudraptor_hatchlinghuskDefaultRagdoll.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskRun.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskRun.xml new file mode 100644 index 0000000..0b78752 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimFast.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimFast.xml new file mode 100644 index 0000000..8fd8f9b --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimSlow.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimSlow.xml new file mode 100644 index 0000000..b3077bb --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskWalk.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskWalk.xml new file mode 100644 index 0000000..fbcbc61 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Animations/Mudraptor_unarmoredhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Mudraptor_unarmoredhusk.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Mudraptor_unarmoredhusk.xml new file mode 100644 index 0000000..e01103d --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Mudraptor_unarmoredhusk.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptor_unarmoredhusk/Ragdolls/Mudraptor_unarmoredhuskDefaultRagdoll.xml b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Ragdolls/Mudraptor_unarmoredhuskDefaultRagdoll.xml new file mode 100644 index 0000000..3b6fa41 --- /dev/null +++ b/Improved Husks/Characters/Mudraptor_unarmoredhusk/Ragdolls/Mudraptor_unarmoredhuskDefaultRagdoll.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskRun.xml b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskRun.xml new file mode 100644 index 0000000..add2b88 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimFast.xml b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimFast.xml new file mode 100644 index 0000000..9a038fd --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimSlow.xml b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimSlow.xml new file mode 100644 index 0000000..19326e8 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskWalk.xml b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskWalk.xml new file mode 100644 index 0000000..5b30998 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Animations/MudraptorhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.png b/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.png new file mode 100644 index 0000000..9132066 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2aa85c57ea07f45a0bf5a41b162cb2af5956cdf364e34a9e81f529b4be4a31c +size 524949 diff --git a/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.xml b/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.xml new file mode 100644 index 0000000..61715a9 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Mudraptorhusk.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/Ragdolls/MudraptorhuskDefaultRagdoll.xml b/Improved Husks/Characters/Mudraptorhusk/Ragdolls/MudraptorhuskDefaultRagdoll.xml new file mode 100644 index 0000000..b397052 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/Ragdolls/MudraptorhuskDefaultRagdoll.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Mudraptorhusk/attack1.ogg b/Improved Husks/Characters/Mudraptorhusk/attack1.ogg new file mode 100644 index 0000000..8e13fae --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2d29500b417cdebb0c3f7e09550b464c8edb0682aa0b45e461358e1fa94fff8 +size 51687 diff --git a/Improved Husks/Characters/Mudraptorhusk/attack2.ogg b/Improved Husks/Characters/Mudraptorhusk/attack2.ogg new file mode 100644 index 0000000..75a106f --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:551411203e01d30a09af2fa412d1a9ee85c8f9631f0c130b2ef06a358ec45b57 +size 42234 diff --git a/Improved Husks/Characters/Mudraptorhusk/damage1.ogg b/Improved Husks/Characters/Mudraptorhusk/damage1.ogg new file mode 100644 index 0000000..b9ecb04 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe41209ea01e34a43a6defe2bb555cb05ae81b5ccae6988a1e495cc4b8f4fbfd +size 40006 diff --git a/Improved Husks/Characters/Mudraptorhusk/damage2.ogg b/Improved Husks/Characters/Mudraptorhusk/damage2.ogg new file mode 100644 index 0000000..a66beb1 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1d276824aab43003f85d3e4c074362b8fd284613ad5480a34612092c376007c +size 46694 diff --git a/Improved Husks/Characters/Mudraptorhusk/death.ogg b/Improved Husks/Characters/Mudraptorhusk/death.ogg new file mode 100644 index 0000000..7968383 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:972e67276e3637f8dee39a3bfc3ae02f398b7f3376537af9084d43d5cf94f386 +size 73779 diff --git a/Improved Husks/Characters/Mudraptorhusk/idle1.ogg b/Improved Husks/Characters/Mudraptorhusk/idle1.ogg new file mode 100644 index 0000000..b907ec7 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:000171be3d7836d3fb12158a16b5065215a5aa9aefbb3281d0495ef61b45e09c +size 45964 diff --git a/Improved Husks/Characters/Mudraptorhusk/idle2.ogg b/Improved Husks/Characters/Mudraptorhusk/idle2.ogg new file mode 100644 index 0000000..5f6d980 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0453209af4dd048160ea7e819c2e60801281fa9cb09248d6597d0e171bddea78 +size 37480 diff --git a/Improved Husks/Characters/Mudraptorhusk/idle3.ogg b/Improved Husks/Characters/Mudraptorhusk/idle3.ogg new file mode 100644 index 0000000..b4a18f3 --- /dev/null +++ b/Improved Husks/Characters/Mudraptorhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:320f306cc4f2993763f45ddbfb9155aa77af1cf13518e2efc0f4650dfa2dd55b +size 49994 diff --git a/Improved Husks/Characters/Nibbler/Animations/NibblerRun.xml b/Improved Husks/Characters/Nibbler/Animations/NibblerRun.xml new file mode 100644 index 0000000..33a8db6 --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Animations/NibblerRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Nibbler/Animations/NibblerSwimFast.xml b/Improved Husks/Characters/Nibbler/Animations/NibblerSwimFast.xml new file mode 100644 index 0000000..c8dcc0c --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Animations/NibblerSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Nibbler/Animations/NibblerSwimSlow.xml b/Improved Husks/Characters/Nibbler/Animations/NibblerSwimSlow.xml new file mode 100644 index 0000000..ab2ca4b --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Animations/NibblerSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Nibbler/Animations/NibblerWalk.xml b/Improved Husks/Characters/Nibbler/Animations/NibblerWalk.xml new file mode 100644 index 0000000..c95fde2 --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Animations/NibblerWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Nibbler/Nibbler.xml b/Improved Husks/Characters/Nibbler/Nibbler.xml new file mode 100644 index 0000000..b7e970f --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Nibbler.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Nibbler/Ragdolls/NibblerDefaultRagdoll.xml b/Improved Husks/Characters/Nibbler/Ragdolls/NibblerDefaultRagdoll.xml new file mode 100644 index 0000000..4d514fd --- /dev/null +++ b/Improved Husks/Characters/Nibbler/Ragdolls/NibblerDefaultRagdoll.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskRun.xml b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskRun.xml new file mode 100644 index 0000000..d7520db --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimFast.xml b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimFast.xml new file mode 100644 index 0000000..ce68553 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimSlow.xml b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimSlow.xml new file mode 100644 index 0000000..6a71870 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskWalk.xml b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskWalk.xml new file mode 100644 index 0000000..31b93ce --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Animations/OrangeboyhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Orangeboyhusk.xml b/Improved Husks/Characters/Orangeboyhusk/Orangeboyhusk.xml new file mode 100644 index 0000000..b726c62 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Orangeboyhusk.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/Ragdolls/OrangeboyhuskDefaultRagdoll.xml b/Improved Husks/Characters/Orangeboyhusk/Ragdolls/OrangeboyhuskDefaultRagdoll.xml new file mode 100644 index 0000000..4b5497c --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/Ragdolls/OrangeboyhuskDefaultRagdoll.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Orangeboyhusk/attack1.ogg b/Improved Husks/Characters/Orangeboyhusk/attack1.ogg new file mode 100644 index 0000000..04b13a0 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:471ee433e5af262230360c2ec514885e0ceccb6541349dcdae78cdb3dd861c5d +size 35419 diff --git a/Improved Husks/Characters/Orangeboyhusk/attack2.ogg b/Improved Husks/Characters/Orangeboyhusk/attack2.ogg new file mode 100644 index 0000000..49323f3 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8764f6683719fad8ab9d5b6c999b957a5fc2c1e514b4a9bdc328cf044f674a6 +size 38203 diff --git a/Improved Husks/Characters/Orangeboyhusk/damage1.ogg b/Improved Husks/Characters/Orangeboyhusk/damage1.ogg new file mode 100644 index 0000000..d3012b5 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7e9923af0fa46f43cffceb17919922e6f01ac943521539c43215e215e5f261 +size 65435 diff --git a/Improved Husks/Characters/Orangeboyhusk/damage2.ogg b/Improved Husks/Characters/Orangeboyhusk/damage2.ogg new file mode 100644 index 0000000..81185bc --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db554bd18a71ac6d5fafae80d00034e02b8f655a61df22e7e4183a28230c9e5e +size 60454 diff --git a/Improved Husks/Characters/Orangeboyhusk/idle1.ogg b/Improved Husks/Characters/Orangeboyhusk/idle1.ogg new file mode 100644 index 0000000..977e07f --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f48a01859b00812eb02c0c432bf0db5bc05cf7de0d94578cf843cabd83f84b79 +size 83925 diff --git a/Improved Husks/Characters/Orangeboyhusk/idle2.ogg b/Improved Husks/Characters/Orangeboyhusk/idle2.ogg new file mode 100644 index 0000000..152df76 --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:164f9653360c061b1718c42b53fa7a8a566ef78ba021d5927bca0c30d2ecbda4 +size 81899 diff --git a/Improved Husks/Characters/Orangeboyhusk/idle3.ogg b/Improved Husks/Characters/Orangeboyhusk/idle3.ogg new file mode 100644 index 0000000..fe6c1cb --- /dev/null +++ b/Improved Husks/Characters/Orangeboyhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c78dc8b32723618d68590b8f9300954a6fd58f284ec5cb28f06b11cdddf92a94 +size 72355 diff --git a/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskRun.xml b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskRun.xml new file mode 100644 index 0000000..3080eb2 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimFast.xml b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimFast.xml new file mode 100644 index 0000000..95aa273 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimSlow.xml b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimSlow.xml new file mode 100644 index 0000000..118bb49 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskWalk.xml b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskWalk.xml new file mode 100644 index 0000000..691f888 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Animations/PeanuthuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/Peanuthusk.xml b/Improved Husks/Characters/Peanuthusk/Peanuthusk.xml new file mode 100644 index 0000000..c9f368e --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Peanuthusk.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/Ragdolls/PeanuthuskDefaultRagdoll.xml b/Improved Husks/Characters/Peanuthusk/Ragdolls/PeanuthuskDefaultRagdoll.xml new file mode 100644 index 0000000..2034f63 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/Ragdolls/PeanuthuskDefaultRagdoll.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Peanuthusk/attack1.ogg b/Improved Husks/Characters/Peanuthusk/attack1.ogg new file mode 100644 index 0000000..fa389ba --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a512768e237145f3364c3eb763ce63388b86bfaa3dad2a8cdda6b4f6bd64f44 +size 32606 diff --git a/Improved Husks/Characters/Peanuthusk/attack2.ogg b/Improved Husks/Characters/Peanuthusk/attack2.ogg new file mode 100644 index 0000000..0c002a0 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccf1216c779e581423f7a50076788394439ec727599e9418f3f6f5d259c10df6 +size 27219 diff --git a/Improved Husks/Characters/Peanuthusk/damage1.ogg b/Improved Husks/Characters/Peanuthusk/damage1.ogg new file mode 100644 index 0000000..9d7b5de --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68b2fe50c6959ff815afc80960e4d3561112f6adb99e2e5825a0dbeb83509b3c +size 20165 diff --git a/Improved Husks/Characters/Peanuthusk/damage2.ogg b/Improved Husks/Characters/Peanuthusk/damage2.ogg new file mode 100644 index 0000000..de4310c --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f534e14ae751b44a956bd1a1baec9641974f56db10d50c3d1da7c64b4c5846bd +size 24868 diff --git a/Improved Husks/Characters/Peanuthusk/idle1.ogg b/Improved Husks/Characters/Peanuthusk/idle1.ogg new file mode 100644 index 0000000..7fa6d72 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82d3f0bcc4761a81e78b4e1ec1d7bb44a6b3dc6dcbb178aac539f6fadc25aaa2 +size 107512 diff --git a/Improved Husks/Characters/Peanuthusk/idle2.ogg b/Improved Husks/Characters/Peanuthusk/idle2.ogg new file mode 100644 index 0000000..8846a21 --- /dev/null +++ b/Improved Husks/Characters/Peanuthusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f2e569813243bc75391179839f928540545695a4353687d74f764963bb5868b +size 162049 diff --git a/Improved Husks/Characters/Pets/death.ogg b/Improved Husks/Characters/Pets/death.ogg new file mode 100644 index 0000000..264fddd --- /dev/null +++ b/Improved Husks/Characters/Pets/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2bca0c78c3bc21499d95710f312401508b731637b50099ff365866c08963351 +size 51795 diff --git a/Improved Husks/Characters/Pets/huskpets.png b/Improved Husks/Characters/Pets/huskpets.png new file mode 100644 index 0000000..bae74c6 --- /dev/null +++ b/Improved Husks/Characters/Pets/huskpets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3007a565d5bafa755961f9e11788a50fbb89486ccdc828efa1aed91369575ee3 +size 108037 diff --git a/Improved Husks/Characters/Pets/infect.ogg b/Improved Husks/Characters/Pets/infect.ogg new file mode 100644 index 0000000..da80b53 --- /dev/null +++ b/Improved Husks/Characters/Pets/infect.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a479704d3673ced5289023cfed69095f80e61cbf2c71fb67c40454c462fd27c9 +size 116154 diff --git a/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskRun.xml b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskRun.xml new file mode 100644 index 0000000..45bae6d --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimFast.xml b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimFast.xml new file mode 100644 index 0000000..b0b00c3 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimSlow.xml b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimSlow.xml new file mode 100644 index 0000000..3da2b9d --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskWalk.xml b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskWalk.xml new file mode 100644 index 0000000..bd2382c --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Animations/PsilotoadhuskWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/Psilotoadhusk.xml b/Improved Husks/Characters/Psilotoadhusk/Psilotoadhusk.xml new file mode 100644 index 0000000..7c17f63 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Psilotoadhusk.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/Ragdolls/PsilotoadhuskDefaultRagdoll.xml b/Improved Husks/Characters/Psilotoadhusk/Ragdolls/PsilotoadhuskDefaultRagdoll.xml new file mode 100644 index 0000000..f2c7724 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/Ragdolls/PsilotoadhuskDefaultRagdoll.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Psilotoadhusk/attack1.ogg b/Improved Husks/Characters/Psilotoadhusk/attack1.ogg new file mode 100644 index 0000000..fca6730 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa3502998254f35e5d4d4b6fd687d75a1912a46a6710051bd4068610359fd7b +size 105366 diff --git a/Improved Husks/Characters/Psilotoadhusk/attack2.ogg b/Improved Husks/Characters/Psilotoadhusk/attack2.ogg new file mode 100644 index 0000000..99e90b2 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1d70c85fccf7eada65ad85a3a206625f7c202e6bac418acb024a5f581609902 +size 186656 diff --git a/Improved Husks/Characters/Psilotoadhusk/damage1.ogg b/Improved Husks/Characters/Psilotoadhusk/damage1.ogg new file mode 100644 index 0000000..75882fb --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ed53b7aad82acf00949061fffc56d8ef49dff5c39d7b2115f4a26f1410501a3 +size 74657 diff --git a/Improved Husks/Characters/Psilotoadhusk/damage2.ogg b/Improved Husks/Characters/Psilotoadhusk/damage2.ogg new file mode 100644 index 0000000..078b260 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5c2df2684994f79ed6fc67c8f69e2228b6f9dd6f5f72f4c1b8fc4c1db7f82a3 +size 53025 diff --git a/Improved Husks/Characters/Psilotoadhusk/idle1.ogg b/Improved Husks/Characters/Psilotoadhusk/idle1.ogg new file mode 100644 index 0000000..13ff887 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08d9bde4ef42a196409debef732f1d80a48ad6359bcbdc04ccfd8ad89bd93a21 +size 57671 diff --git a/Improved Husks/Characters/Psilotoadhusk/idle2.ogg b/Improved Husks/Characters/Psilotoadhusk/idle2.ogg new file mode 100644 index 0000000..527ac68 --- /dev/null +++ b/Improved Husks/Characters/Psilotoadhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c7ae0c7a9d9bf0c5bd5c788ef77e8089cee8ebbc209297bd56bfd4212c367c0 +size 102352 diff --git a/Improved Husks/Characters/Snatcher/Animations/SnatcherRun.xml b/Improved Husks/Characters/Snatcher/Animations/SnatcherRun.xml new file mode 100644 index 0000000..dc48086 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Animations/SnatcherRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimFast.xml b/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimFast.xml new file mode 100644 index 0000000..b216a82 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimSlow.xml b/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimSlow.xml new file mode 100644 index 0000000..41914a2 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Animations/SnatcherSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/Animations/SnatcherWalk.xml b/Improved Husks/Characters/Snatcher/Animations/SnatcherWalk.xml new file mode 100644 index 0000000..2f1640c --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Animations/SnatcherWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/Ragdolls/SnatcherDefaultRagdoll.xml b/Improved Husks/Characters/Snatcher/Ragdolls/SnatcherDefaultRagdoll.xml new file mode 100644 index 0000000..ef04e8e --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Ragdolls/SnatcherDefaultRagdoll.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/Snatcher.xml b/Improved Husks/Characters/Snatcher/Snatcher.xml new file mode 100644 index 0000000..bd80235 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/Snatcher.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Snatcher/attack1.ogg b/Improved Husks/Characters/Snatcher/attack1.ogg new file mode 100644 index 0000000..fc68c70 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f1d0d8133c4d993ddf5e66d228619c0378c002b4f8341867f3f13bb9bd323be +size 95047 diff --git a/Improved Husks/Characters/Snatcher/attack2.ogg b/Improved Husks/Characters/Snatcher/attack2.ogg new file mode 100644 index 0000000..e383617 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c82dbbecaec2043fa7950024a58c3e9fa48b2cd388c8195f6460ea5fbb7070de +size 92808 diff --git a/Improved Husks/Characters/Snatcher/damage1.ogg b/Improved Husks/Characters/Snatcher/damage1.ogg new file mode 100644 index 0000000..8f41aa8 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06198a4fe59c671bce657ce50a4f71997c16837232e1a50ce9746c98c562a7c6 +size 16975 diff --git a/Improved Husks/Characters/Snatcher/damage2.ogg b/Improved Husks/Characters/Snatcher/damage2.ogg new file mode 100644 index 0000000..b5238cd --- /dev/null +++ b/Improved Husks/Characters/Snatcher/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab070da11c45695af3f80d7dd1472c40dc06947dbbbd991ba9587ca28f456fc1 +size 20386 diff --git a/Improved Husks/Characters/Snatcher/damage3.ogg b/Improved Husks/Characters/Snatcher/damage3.ogg new file mode 100644 index 0000000..018b323 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a830c7b6bb25d2345b43b3c59aa9003ba12378885d7567146115297aba8a34a8 +size 21227 diff --git a/Improved Husks/Characters/Snatcher/idle1.ogg b/Improved Husks/Characters/Snatcher/idle1.ogg new file mode 100644 index 0000000..8c8af91 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c142650bff4fd4027a97b463d8fbfc2280ac495ae15fc8190e9e520ec1fc1dc +size 20321 diff --git a/Improved Husks/Characters/Snatcher/idle2.ogg b/Improved Husks/Characters/Snatcher/idle2.ogg new file mode 100644 index 0000000..8a38153 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c8ac164db4493662448bc459a8aefaf46450805f04fa9205bb2cb763eea9f18 +size 22139 diff --git a/Improved Husks/Characters/Snatcher/idle3.ogg b/Improved Husks/Characters/Snatcher/idle3.ogg new file mode 100644 index 0000000..e9a3de8 --- /dev/null +++ b/Improved Husks/Characters/Snatcher/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d6c256d7d4a57ac7f9c6ff59eedf9a9509a4b43bc883e04ae128db55ffbd134 +size 26990 diff --git a/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimFast.xml b/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimFast.xml new file mode 100644 index 0000000..3d86c4e --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimSlow.xml b/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimSlow.xml new file mode 100644 index 0000000..a1c8176 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/Animations/SpinelinghuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Spinelinghusk/Ragdolls/SpinelinghuskDefaultRagdoll.xml b/Improved Husks/Characters/Spinelinghusk/Ragdolls/SpinelinghuskDefaultRagdoll.xml new file mode 100644 index 0000000..2b4c285 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/Ragdolls/SpinelinghuskDefaultRagdoll.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.png b/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.png new file mode 100644 index 0000000..4bade85 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a37f4fcb52ca7a255c9e52b8e3068773934bdb13964b18e50b199b676d2e116 +size 88325 diff --git a/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.xml b/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.xml new file mode 100644 index 0000000..4550a93 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/Spinelinghusk.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Spinelinghusk/attackprojectile1.ogg b/Improved Husks/Characters/Spinelinghusk/attackprojectile1.ogg new file mode 100644 index 0000000..267906a --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/attackprojectile1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f70bbd70cabcfa44de7ce0a38caf8e5ebc0c905811e469b6cb1dfd5e096d5fe +size 77940 diff --git a/Improved Husks/Characters/Spinelinghusk/attackprojectile2.ogg b/Improved Husks/Characters/Spinelinghusk/attackprojectile2.ogg new file mode 100644 index 0000000..73fda5b --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/attackprojectile2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96d59dba65d49ca7de7b72157cc9b4970d84654d30cdc9661b5ddc07340166b5 +size 64825 diff --git a/Improved Husks/Characters/Spinelinghusk/damage1.ogg b/Improved Husks/Characters/Spinelinghusk/damage1.ogg new file mode 100644 index 0000000..e3d3ca5 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08f36c479d6bd299fedefe6813616aae25de0d1167f5fa151a208e11c112ac62 +size 56264 diff --git a/Improved Husks/Characters/Spinelinghusk/damage2.ogg b/Improved Husks/Characters/Spinelinghusk/damage2.ogg new file mode 100644 index 0000000..1767c06 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2cd2c9c60e55f19b2fe6f17f5feb4cd4128d63a59a1f7d719ae9b03cec9f0d0 +size 81715 diff --git a/Improved Husks/Characters/Spinelinghusk/damage3.ogg b/Improved Husks/Characters/Spinelinghusk/damage3.ogg new file mode 100644 index 0000000..de41cfd --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab7cb39b8672a93ca6278be82b2e33131d40c94927b022acf98cd6e3ba600ef2 +size 76491 diff --git a/Improved Husks/Characters/Spinelinghusk/damage4.ogg b/Improved Husks/Characters/Spinelinghusk/damage4.ogg new file mode 100644 index 0000000..667a47b --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/damage4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:667a6a4bda64bac942c1e0d4c3d10d9e7f7382b55b5a030e6d81a8e2e692c8e7 +size 84094 diff --git a/Improved Husks/Characters/Spinelinghusk/dead1.ogg b/Improved Husks/Characters/Spinelinghusk/dead1.ogg new file mode 100644 index 0000000..294d1c4 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/dead1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c23363aec7a37897c820c66f6ddd2d1e9c6c337407caeb12f7b36347fb0b227 +size 121119 diff --git a/Improved Husks/Characters/Spinelinghusk/dead2.ogg b/Improved Husks/Characters/Spinelinghusk/dead2.ogg new file mode 100644 index 0000000..948aa68 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/dead2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e66fe2e844d3d7b6b0febdd0f55a84c1c584bc35c9d060c309ad5f566fa39422 +size 97809 diff --git a/Improved Husks/Characters/Spinelinghusk/idle1.ogg b/Improved Husks/Characters/Spinelinghusk/idle1.ogg new file mode 100644 index 0000000..9c94854 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4acd20acb4fa7ea196995b2759e6625b16796993f3abd0c59b3777788567632f +size 236048 diff --git a/Improved Husks/Characters/Spinelinghusk/idle2.ogg b/Improved Husks/Characters/Spinelinghusk/idle2.ogg new file mode 100644 index 0000000..6f26323 --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ec72b6643a6a0c5b154284662b1d945f28abb6beb7260d90cbe1b03683c61c9 +size 216445 diff --git a/Improved Husks/Characters/Spinelinghusk/idle3.ogg b/Improved Husks/Characters/Spinelinghusk/idle3.ogg new file mode 100644 index 0000000..6ad3a8f --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd5c5cc31bc7da08c73b59f90609668e914741ba21e9c95b5930f1077838fd8 +size 265626 diff --git a/Improved Husks/Characters/Spinelinghusk/idle4.ogg b/Improved Husks/Characters/Spinelinghusk/idle4.ogg new file mode 100644 index 0000000..cb2cffe --- /dev/null +++ b/Improved Husks/Characters/Spinelinghusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55c63e507a1f1f93eb20b76004d7d9b80398403eb92ba67da17adff84feca43d +size 185709 diff --git a/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimFast.xml b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimFast.xml new file mode 100644 index 0000000..11c1086 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimSlow.xml b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimSlow.xml new file mode 100644 index 0000000..edafc83 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Animations/Tigerthresher_hatchlinghuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Ragdolls/Tigerthresher_hatchlinghuskDefaultRagdoll.xml b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Ragdolls/Tigerthresher_hatchlinghuskDefaultRagdoll.xml new file mode 100644 index 0000000..6e60d01 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Ragdolls/Tigerthresher_hatchlinghuskDefaultRagdoll.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresher_hatchlinghusk.xml b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresher_hatchlinghusk.xml new file mode 100644 index 0000000..3004c32 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresher_hatchlinghusk.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresherhatchlinghusk.png b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresherhatchlinghusk.png new file mode 100644 index 0000000..168cc1e --- /dev/null +++ b/Improved Husks/Characters/Tigerthresher_hatchlinghusk/Tigerthresherhatchlinghusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:655a372578a0dab736d3ec8aa46f667fe6399fdf0b59fcb6ea707e975f199806 +size 121960 diff --git a/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimFast.xml b/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimFast.xml new file mode 100644 index 0000000..82cf239 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimSlow.xml b/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimSlow.xml new file mode 100644 index 0000000..7c49d3b --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/Animations/TigerthresherhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresherhusk/Ragdolls/TigerthresherhuskDefaultRagdoll.xml b/Improved Husks/Characters/Tigerthresherhusk/Ragdolls/TigerthresherhuskDefaultRagdoll.xml new file mode 100644 index 0000000..8067205 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/Ragdolls/TigerthresherhuskDefaultRagdoll.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresherhusk/Thresherhusk.png b/Improved Husks/Characters/Tigerthresherhusk/Thresherhusk.png new file mode 100644 index 0000000..44178d1 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/Thresherhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:271b4e24e00d159ec8b079d05f86cc11e87512450f0e76022055cac958e0898e +size 364022 diff --git a/Improved Husks/Characters/Tigerthresherhusk/Tigerthresherhusk.xml b/Improved Husks/Characters/Tigerthresherhusk/Tigerthresherhusk.xml new file mode 100644 index 0000000..67826f6 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/Tigerthresherhusk.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Tigerthresherhusk/attack1.ogg b/Improved Husks/Characters/Tigerthresherhusk/attack1.ogg new file mode 100644 index 0000000..08c5570 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cacd493a169012cdea33b47474b61bdeec3e0f95b3e96c641f561fa2067a8c93 +size 103973 diff --git a/Improved Husks/Characters/Tigerthresherhusk/attack2.ogg b/Improved Husks/Characters/Tigerthresherhusk/attack2.ogg new file mode 100644 index 0000000..23b6ecf --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49a96231bbcaba39404b90861dc86b4dd08813a627bba76f21c5bce477abb856 +size 93534 diff --git a/Improved Husks/Characters/Tigerthresherhusk/damage1.ogg b/Improved Husks/Characters/Tigerthresherhusk/damage1.ogg new file mode 100644 index 0000000..e51f00d --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:576ed509e0e4b130d1a461f2cd76336350d5cf0bea74323567898a3d55495bc2 +size 49274 diff --git a/Improved Husks/Characters/Tigerthresherhusk/damage2.ogg b/Improved Husks/Characters/Tigerthresherhusk/damage2.ogg new file mode 100644 index 0000000..caa0e66 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec2feefb057277245445bcdeb303a60df0a2dae321717239e6a68568593ced6 +size 55204 diff --git a/Improved Husks/Characters/Tigerthresherhusk/death1.ogg b/Improved Husks/Characters/Tigerthresherhusk/death1.ogg new file mode 100644 index 0000000..18d35a2 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/death1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d79b26ccee243c516eb6ad9ce259e5d699d2fdeec23b922b75ef48f03a22185 +size 90927 diff --git a/Improved Husks/Characters/Tigerthresherhusk/death2.ogg b/Improved Husks/Characters/Tigerthresherhusk/death2.ogg new file mode 100644 index 0000000..093a78d --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/death2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4c46f7f5f8e8a12fe797042b36f2376bd2d41fa3e767082818332cb922ff03a +size 81351 diff --git a/Improved Husks/Characters/Tigerthresherhusk/idle1.ogg b/Improved Husks/Characters/Tigerthresherhusk/idle1.ogg new file mode 100644 index 0000000..92b6e80 --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01968cc02c5553c1b7ab44994aa092ca6638c00c4670f4bc981337a5b5036e65 +size 73711 diff --git a/Improved Husks/Characters/Tigerthresherhusk/idle2.ogg b/Improved Husks/Characters/Tigerthresherhusk/idle2.ogg new file mode 100644 index 0000000..ee6ba4e --- /dev/null +++ b/Improved Husks/Characters/Tigerthresherhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ab93d6fbe87cf2555b14ff9abb80482f8e1238218037530756b9d470c5cc58 +size 75327 diff --git a/Improved Husks/Characters/Variants/Hammerhead_mhusk.xml b/Improved Husks/Characters/Variants/Hammerhead_mhusk.xml new file mode 100644 index 0000000..5dc3fe0 --- /dev/null +++ b/Improved Husks/Characters/Variants/Hammerhead_mhusk.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Hammerheadgold_mhusk.xml b/Improved Husks/Characters/Variants/Hammerheadgold_mhusk.xml new file mode 100644 index 0000000..b6f8486 --- /dev/null +++ b/Improved Husks/Characters/Variants/Hammerheadgold_mhusk.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonhuman.xml b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonhuman.xml new file mode 100644 index 0000000..1668bb7 --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonhuman.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonmudraptor.xml b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonmudraptor.xml new file mode 100644 index 0000000..738360d --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoonmudraptor.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.png b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.png new file mode 100644 index 0000000..026d89d --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f62200ab8d713a5f1596b35b793543dd475a46e2b3123f1c6b4d6b4ae17ed670 +size 659631 diff --git a/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.xml b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.xml new file mode 100644 index 0000000..adda5fb --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/Huskmutantcocoontigerthresher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonhuman.png b/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonhuman.png new file mode 100644 index 0000000..7c0ad58 --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonhuman.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07979e9f0739ed2e27755e40140e6f6521fb2fc653b88ef5ca90fe17226d55dd +size 95314 diff --git a/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonmudraptor.png b/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonmudraptor.png new file mode 100644 index 0000000..ade00b5 --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskcocoons/huskmutantcocoonmudraptor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37aa3382916f7408da75eaf94535cc06a13d2beb6b4e16014167cbe5c1e6ccb6 +size 95311 diff --git a/Improved Husks/Characters/Variants/Huskmutanthumanheadthrown.xml b/Improved Husks/Characters/Variants/Huskmutanthumanheadthrown.xml new file mode 100644 index 0000000..b19068f --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskmutanthumanheadthrown.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Huskmutanthunterranged.xml b/Improved Husks/Characters/Variants/Huskmutanthunterranged.xml new file mode 100644 index 0000000..6b1ad9f --- /dev/null +++ b/Improved Husks/Characters/Variants/Huskmutanthunterranged.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Moloch_mhusk.xml b/Improved Husks/Characters/Variants/Moloch_mhusk.xml new file mode 100644 index 0000000..525f1cc --- /dev/null +++ b/Improved Husks/Characters/Variants/Moloch_mhusk.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Molochblack_mhusk.xml b/Improved Husks/Characters/Variants/Molochblack_mhusk.xml new file mode 100644 index 0000000..58ab3cc --- /dev/null +++ b/Improved Husks/Characters/Variants/Molochblack_mhusk.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Molochblackhusk.xml b/Improved Husks/Characters/Variants/Molochblackhusk.xml new file mode 100644 index 0000000..49acdb3 --- /dev/null +++ b/Improved Husks/Characters/Variants/Molochblackhusk.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Nibbler2.xml b/Improved Husks/Characters/Variants/Nibbler2.xml new file mode 100644 index 0000000..0f85675 --- /dev/null +++ b/Improved Husks/Characters/Variants/Nibbler2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Snatcher2.xml b/Improved Husks/Characters/Variants/Snatcher2.xml new file mode 100644 index 0000000..5595c0f --- /dev/null +++ b/Improved Husks/Characters/Variants/Snatcher2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Variants/Swarmcrawlerhusk.xml b/Improved Husks/Characters/Variants/Swarmcrawlerhusk.xml new file mode 100644 index 0000000..abc3843 --- /dev/null +++ b/Improved Husks/Characters/Variants/Swarmcrawlerhusk.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimFast.xml b/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimFast.xml new file mode 100644 index 0000000..64041f4 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimSlow.xml b/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimSlow.xml new file mode 100644 index 0000000..a811985 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/Animations/WatcherhuskSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Improved Husks/Characters/Watcherhusk/Ragdolls/WatcherhuskDefaultRagdoll.xml b/Improved Husks/Characters/Watcherhusk/Ragdolls/WatcherhuskDefaultRagdoll.xml new file mode 100644 index 0000000..9976a94 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/Ragdolls/WatcherhuskDefaultRagdoll.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Watcherhusk/Watcherhusk.png b/Improved Husks/Characters/Watcherhusk/Watcherhusk.png new file mode 100644 index 0000000..eff53fa --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/Watcherhusk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc49e57daa907d9fbb8284d62bb0daea7149bbf26d79aad31b4d2cc2d2c6de8b +size 1769079 diff --git a/Improved Husks/Characters/Watcherhusk/Watcherhusk.xml b/Improved Husks/Characters/Watcherhusk/Watcherhusk.xml new file mode 100644 index 0000000..0c855c7 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/Watcherhusk.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Characters/Watcherhusk/attack1.ogg b/Improved Husks/Characters/Watcherhusk/attack1.ogg new file mode 100644 index 0000000..92a0ebb --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/attack1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f08d6809ddda98d211ddae4cf51d1cdb77936aa6fc65c6109b116ee4c98e492 +size 239395 diff --git a/Improved Husks/Characters/Watcherhusk/attack2.ogg b/Improved Husks/Characters/Watcherhusk/attack2.ogg new file mode 100644 index 0000000..75bd32b --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/attack2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1aeb9b5a2eecf2e5119e0836c4da80c633c81a265eb3d1fb4d2ea3c8131cb9f +size 90505 diff --git a/Improved Husks/Characters/Watcherhusk/attack3.ogg b/Improved Husks/Characters/Watcherhusk/attack3.ogg new file mode 100644 index 0000000..58e3329 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/attack3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21c3cf9ce69a452d1429cbc1bee7949c091351cbaef8dc04298606af90370ce4 +size 90854 diff --git a/Improved Husks/Characters/Watcherhusk/damage1.ogg b/Improved Husks/Characters/Watcherhusk/damage1.ogg new file mode 100644 index 0000000..820f0ef --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/damage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32717df6de52e7f85390627bcf8e0d2af0e31bc9f19ff4dafa8714b23a91ebb6 +size 111834 diff --git a/Improved Husks/Characters/Watcherhusk/damage2.ogg b/Improved Husks/Characters/Watcherhusk/damage2.ogg new file mode 100644 index 0000000..6be5ef6 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/damage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60287861ae30376dc21c9c8e4ade8d7e0216708b6e542653608387701c3cd2ce +size 189795 diff --git a/Improved Husks/Characters/Watcherhusk/damage3.ogg b/Improved Husks/Characters/Watcherhusk/damage3.ogg new file mode 100644 index 0000000..0b1f8dd --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/damage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efc1fc7df83245a817437d12490b06846efebabccf5533e2211778580ecc9a52 +size 117103 diff --git a/Improved Husks/Characters/Watcherhusk/death.ogg b/Improved Husks/Characters/Watcherhusk/death.ogg new file mode 100644 index 0000000..a6a2ccc --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/death.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d35898f88835f6939de95d381309437dabad7b7a54e9c22b2b39b1692a62eba +size 130343 diff --git a/Improved Husks/Characters/Watcherhusk/derailed.ogg b/Improved Husks/Characters/Watcherhusk/derailed.ogg new file mode 100644 index 0000000..2daea41 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/derailed.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f02603fb57a4d63fcf0ac3e6cb291ba504d2e543c3d67e252f96b4cfd5cc00b +size 1455896 diff --git a/Improved Husks/Characters/Watcherhusk/idle1.ogg b/Improved Husks/Characters/Watcherhusk/idle1.ogg new file mode 100644 index 0000000..70704c5 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/idle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67f0b6d9c5ffbe209f140ca4d943108c1e52dc822626a217d710313cdedf7036 +size 86710 diff --git a/Improved Husks/Characters/Watcherhusk/idle2.ogg b/Improved Husks/Characters/Watcherhusk/idle2.ogg new file mode 100644 index 0000000..5970858 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/idle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b0c63cf19711eba09087f325abf8c59a297bc3daa0c3f7b94e6a28c9c4f114d +size 130023 diff --git a/Improved Husks/Characters/Watcherhusk/idle3.ogg b/Improved Husks/Characters/Watcherhusk/idle3.ogg new file mode 100644 index 0000000..399c2bd --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/idle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a0a95d1f44015dc2157d2fd5675187da9c5886813777ada1e43b8b2dd99e4d3 +size 101606 diff --git a/Improved Husks/Characters/Watcherhusk/idle4.ogg b/Improved Husks/Characters/Watcherhusk/idle4.ogg new file mode 100644 index 0000000..2a9880e --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/idle4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e691c641effba2b382908d90f427719ac60dc69e6a0eaa45df521decdbe2f25f +size 120245 diff --git a/Improved Husks/Characters/Watcherhusk/idleloop.ogg b/Improved Husks/Characters/Watcherhusk/idleloop.ogg new file mode 100644 index 0000000..6eded87 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/idleloop.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e9a1ad20a5e4d10e42909a93edbcf3505bfa56627d17c1102ee62483e40a52a +size 1797755 diff --git a/Improved Husks/Characters/Watcherhusk/screech1.ogg b/Improved Husks/Characters/Watcherhusk/screech1.ogg new file mode 100644 index 0000000..572f9f9 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/screech1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70a92487faece7f8844a7305eba73eba01ccd5c2e1491b4555e45214dccea013 +size 364209 diff --git a/Improved Husks/Characters/Watcherhusk/screech1far.ogg b/Improved Husks/Characters/Watcherhusk/screech1far.ogg new file mode 100644 index 0000000..89e575c --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/screech1far.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6b81b29715e6aad0ddcd88da3d1cf737d0d795c9e2b42b3bfc07920a23c8073 +size 81131 diff --git a/Improved Husks/Characters/Watcherhusk/screech2.ogg b/Improved Husks/Characters/Watcherhusk/screech2.ogg new file mode 100644 index 0000000..14194e1 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/screech2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5cc8016233b46f3909e5b76164fac277a82ff0b9757119694fabf7a2b9e3a43 +size 393729 diff --git a/Improved Husks/Characters/Watcherhusk/screech2far.ogg b/Improved Husks/Characters/Watcherhusk/screech2far.ogg new file mode 100644 index 0000000..a0f8cb3 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/screech2far.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88bfc6b384edbdc2f63944d211c805335c461a89c89801a8a20439247b1a3d0f +size 95962 diff --git a/Improved Husks/Characters/Watcherhusk/watcheroverlay.png b/Improved Husks/Characters/Watcherhusk/watcheroverlay.png new file mode 100644 index 0000000..476d9d8 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/watcheroverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af644a24edc9f191c104eb0bb91a5e9f96cda3f8e4f24da1a3af4172dc571e45 +size 1488287 diff --git a/Improved Husks/Characters/Watcherhusk/watcherstinger.png b/Improved Husks/Characters/Watcherhusk/watcherstinger.png new file mode 100644 index 0000000..17f26e9 --- /dev/null +++ b/Improved Husks/Characters/Watcherhusk/watcherstinger.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d235a3ab5150c230927d89627868f9c93e691450ac5746a820499c2af81a3ad +size 242758 diff --git a/Improved Husks/HuskModConversations_English.xml b/Improved Husks/HuskModConversations_English.xml new file mode 100644 index 0000000..9d3ee74 --- /dev/null +++ b/Improved Husks/HuskModConversations_English.xml @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Items/calyxinjector.png b/Improved Husks/Items/calyxinjector.png new file mode 100644 index 0000000..7dbae0b --- /dev/null +++ b/Improved Husks/Items/calyxinjector.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ddc3aa50704f2d21ead91550f78e2114e2b57fcb23433eae26d3abb8511315a +size 1938 diff --git a/Improved Husks/Items/calyxinjectorbooster.png b/Improved Husks/Items/calyxinjectorbooster.png new file mode 100644 index 0000000..352a5a2 --- /dev/null +++ b/Improved Husks/Items/calyxinjectorbooster.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:431d45f4c629d7a37aed1f430390178383437cb70a3d51d0b5ad95175aeb768a +size 2043 diff --git a/Improved Husks/Items/calyxinjectorboosterinventory.png b/Improved Husks/Items/calyxinjectorboosterinventory.png new file mode 100644 index 0000000..9bd8d5f --- /dev/null +++ b/Improved Husks/Items/calyxinjectorboosterinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c8d7f4a5431d1a2fcf2e624d634baa5b82cc437e725739cec410b6f68b35fd4 +size 2436 diff --git a/Improved Husks/Items/calyxinjectorinventory.png b/Improved Husks/Items/calyxinjectorinventory.png new file mode 100644 index 0000000..498707d --- /dev/null +++ b/Improved Husks/Items/calyxinjectorinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bda79c467fa5e001044f3d8e6d4c48d36dbeb35fcc5cd2ae0693a1573fc85782 +size 2349 diff --git a/Improved Husks/Items/calyxinjectorsymbiotic.png b/Improved Husks/Items/calyxinjectorsymbiotic.png new file mode 100644 index 0000000..de73068 --- /dev/null +++ b/Improved Husks/Items/calyxinjectorsymbiotic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2133bc331f289fd1a71889438c78fe281259a1053d78ce234233e22df45c009 +size 2088 diff --git a/Improved Husks/Items/calyxinjectorsymbioticinventory.png b/Improved Husks/Items/calyxinjectorsymbioticinventory.png new file mode 100644 index 0000000..3351139 --- /dev/null +++ b/Improved Husks/Items/calyxinjectorsymbioticinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:053beaba09e6bccee00d266adbd65cd09a274904a3badf45df16b0dd8fee7ad0 +size 2507 diff --git a/Improved Husks/Items/grow.ogg b/Improved Husks/Items/grow.ogg new file mode 100644 index 0000000..ebe42a8 --- /dev/null +++ b/Improved Husks/Items/grow.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e2ad8dd56dbc4735bf4393d30e08acad118f027b13179dca0f33ec28a9a7f20 +size 324799 diff --git a/Improved Husks/Items/huskclicking1.ogg b/Improved Husks/Items/huskclicking1.ogg new file mode 100644 index 0000000..57c8631 --- /dev/null +++ b/Improved Husks/Items/huskclicking1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94b595f13448f28c9ff9d7a1c5932cb3a275a7803804315012a23c0597096c59 +size 17836 diff --git a/Improved Husks/Items/huskclicking2.ogg b/Improved Husks/Items/huskclicking2.ogg new file mode 100644 index 0000000..8c7a34d --- /dev/null +++ b/Improved Husks/Items/huskclicking2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0590de2c410b6a21e62d246124e60ef2de6bb448c7ea46ed985a5745d65f826d +size 17224 diff --git a/Improved Husks/Items/huskclicking3.ogg b/Improved Husks/Items/huskclicking3.ogg new file mode 100644 index 0000000..cb72445 --- /dev/null +++ b/Improved Husks/Items/huskclicking3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9099e7d9f77ae7eb7f8bc5d9537c402ce825307519d06594f2c1fbb5c571bbca +size 20305 diff --git a/Improved Husks/Items/huskmoditems.xml b/Improved Husks/Items/huskmoditems.xml new file mode 100644 index 0000000..7add8fc --- /dev/null +++ b/Improved Husks/Items/huskmoditems.xml @@ -0,0 +1,1200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Items/huskmutantembryo.png b/Improved Husks/Items/huskmutantembryo.png new file mode 100644 index 0000000..f04f911 --- /dev/null +++ b/Improved Husks/Items/huskmutantembryo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2af0e6bd931b30dcf8e479810e7e08d19ac69684183aff8454d11fcf271bcd2 +size 4605 diff --git a/Improved Husks/Items/huskmutantembryoinventory.png b/Improved Husks/Items/huskmutantembryoinventory.png new file mode 100644 index 0000000..6b58af6 --- /dev/null +++ b/Improved Husks/Items/huskmutantembryoinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbba5fa962040d48dfd07706ac1f5154d29d91e18ce0af849d2e1f4a9473bcbb +size 4425 diff --git a/Improved Husks/Items/huskstinger.xml b/Improved Husks/Items/huskstinger.xml new file mode 100644 index 0000000..cbbeac3 --- /dev/null +++ b/Improved Husks/Items/huskstinger.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Items/medical.xml b/Improved Husks/Items/medical.xml new file mode 100644 index 0000000..4f162fb --- /dev/null +++ b/Improved Husks/Items/medical.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Items/stinger.png b/Improved Husks/Items/stinger.png new file mode 100644 index 0000000..53b7d23 --- /dev/null +++ b/Improved Husks/Items/stinger.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6a0d9aa66ffcab3e0871dd5debb182a7fd8ba56bc6df0c9c6e9013faa47b097 +size 6674 diff --git a/Improved Husks/Items/stingerinventory.png b/Improved Husks/Items/stingerinventory.png new file mode 100644 index 0000000..7978c30 --- /dev/null +++ b/Improved Husks/Items/stingerinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e295f9b3df68b174c4a8ff9ced5385554f607cc04a658586677c14cba07b2568 +size 3280 diff --git a/Improved Husks/Items/symbiotichuskinject.ogg b/Improved Husks/Items/symbiotichuskinject.ogg new file mode 100644 index 0000000..b20d07c --- /dev/null +++ b/Improved Husks/Items/symbiotichuskinject.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35f14c404bb5c28ee97749eadfbbabd937fa7d9b43a74e71c5fb1ffa642913a4 +size 150812 diff --git a/Improved Husks/Items/unstablehuskeggs.png b/Improved Husks/Items/unstablehuskeggs.png new file mode 100644 index 0000000..8592fbb --- /dev/null +++ b/Improved Husks/Items/unstablehuskeggs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67e3e965a7a5701cf07413635ef5d3639a9b731eef9bc9aecc2c2ab326aa6ebd +size 4311 diff --git a/Improved Husks/Items/unstablehuskeggsinventory.png b/Improved Husks/Items/unstablehuskeggsinventory.png new file mode 100644 index 0000000..5bb0dc1 --- /dev/null +++ b/Improved Husks/Items/unstablehuskeggsinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ca3fce0831b0ef23cb4fb92b4ee24aa5d5e43659b8bdbef48faea3804340a10 +size 4785 diff --git a/Improved Husks/Items/unstablestinger.png b/Improved Husks/Items/unstablestinger.png new file mode 100644 index 0000000..3e73cfb --- /dev/null +++ b/Improved Husks/Items/unstablestinger.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0844095231b58ba6f5ce28196e0be67a7518f6f8af38593c5e89acdcc78ef1cc +size 1362 diff --git a/Improved Husks/Items/unstablestingerinventory.png b/Improved Husks/Items/unstablestingerinventory.png new file mode 100644 index 0000000..c66dbab --- /dev/null +++ b/Improved Husks/Items/unstablestingerinventory.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fc94d25af373eef8ca9c55d047c118d44d672f2949477ad2233688c3fd7bd24 +size 2321 diff --git a/Improved Husks/Localization/BrazilianPortuguese.xml b/Improved Husks/Localization/BrazilianPortuguese.xml new file mode 100644 index 0000000..4fa5e99 --- /dev/null +++ b/Improved Husks/Localization/BrazilianPortuguese.xml @@ -0,0 +1,45 @@ + + + + Reptante Mutante + Raptor de Terra Mutante + Parasita-Carcaça Mutante Blindado + Parasita-Carcaça Mutante Caçador + Parasita-Carcaça Mutante + Casulo de Parasita-Carcaça + Debrulhador Mutante + Debrulhador Mutante + Aranha-Sequestradora + Verme Faminto + Micoteron + + Ovos de Velonaceps Calyx Instáveis + Ovos dormentes da forma de vida europana conhecida popularmente como 'Parasita-Carcaça'. Esses estão repletos de atividade! + Ferrão de Parasita-Carcaça Instável + Um ferrão escuro rígido. Parece pulsar vez ou outra. + Massa Contorcida + Embrião Mutante + Uma criatura estranha pouco desenvolvida. Atualmente está inativa. + Injetor de Calyx + Uma engenhoca que parece ser um injetor. Usado para fabricação. + Injetor de Calyx Simbiótico + Uma engenhoca que parece ser um injetor. Injeta uma versão modificada da infecção de parasita-carcaça que trará benefícios (e efeitos colaterais) de ser um parasita-carcaça ao usuário. + Injetor de Reforço Calyx + Uma engenhoca que parece ser um injetor. Injeta uma mistura que aumenta temporariamente a velocidade de alguns processos internos do paciente, como cura e crescimento. Pode ter efeitos colaterais indesejados. + + Mutação de Parasita-Carcaça + A pele se contorce e os ossos racham... algo horrível está acontecendo. + Infecção de Parasita-Carcaça Simbiótica + Algo alienígena, mas benéfico, prospera internamente... + Regeneração de Parasita-Carcaça + O parasita-carcaça simbiótico mantém seu corpo oxigenado e produz outras substâncias benéficas que podem fazer você se recuperar de um estado crítico. + Afinidade a Infecção de Parasita-Carcaça + O parasita-carcaça simbiótico estabeleceu-se totalmente dentro do seu corpo, proporcionando resistência à pressão e controle sobre a infecção comum de parasita-carcaça, impedindo que ela o domine completamente. + Deslocamento de Cabeça + Uma cabeça decepada está tentando deslocar seu crânio! Tentar afastá-la sozinho parece ser inútil... Você precisa pedir a outra pessoa para atirar nela! + Toxina Escura + Veias pretas latejantes estão se espalhando pela pele do paciente, espalhando algum tipo de líquido escuro a uma taxa alarmante. + Infecção de Parasita-Carcaça de Reforço + Uma mistura poderosa, mas volátil, de células-tronco se integram rapidamente ao seu corpo, permitindo uma cura extremamente rápida. + Crescimento + \ No newline at end of file diff --git a/Improved Husks/Localization/English.xml b/Improved Husks/Localization/English.xml new file mode 100644 index 0000000..a03081e --- /dev/null +++ b/Improved Husks/Localization/English.xml @@ -0,0 +1,45 @@ + + + + Mutant Crawler + Mutant Mudraptor + Armored Mutant Husk + Hunter Mutant Husk + Mutant Husk + Husk Cocoon + Mutant Thresher + Mutant Thresher + Snatcher + Nibbler + Micoteron + + Unstable Velonaceps Calyx Eggs + Eggs of the Europan lifeform colloquially referred to as 'husk parasite'. These ones are teeming with activity! + Unstable Husk Stinger + A hardened Black Stinger. It seems to pulse every so often. + Wriggling Mass + Mutant Embryo + A strange underdeveloped creature. It is currently inactive. + Calyx Injector + An ominous injector-like contraption. Used for crafting. + Symbiotic Calyx Injector + An ominous injector-like contraption. Injects a modified version of the husk infection that will bring the benefits (and drawbacks) of being a husk to its host. + Booster Calyx Injector + An ominous injector-like contraption. Injects a concotion that temporarily boost the some of the patient's internal processes' speed, such as healing and growth. May have unintended side effects. + + Husk Mutation + The skin contorts and the bones crack... something foul is happening. + Symbiotic Husk Infection + Something alien but benevolent thrives within... + Husk Infection Healing + The symbiotic husk keeps your body oxygenated and produces other beneficial substances that can make you recover from a critical state. + Husk Infection Affinity + The symbiotic husk has fully established itself within your body, providing pressure resistance and control over the common husk infection, preventing it from taking over you entirely. + Head Hijacking + A severed head is attempting to dislocate your skull! Attempting to push it away by yourself seems to be futile... You need to ask someone else to shoot it off! + Black Toxin + Throbbing black veins are spreading around the patient's skin, spreading some sort of black liquid at an alarming rate. + Booster Husk Infection + A powerful but volatile mixture of stem-like cells quickly integrate themselves in your body, allowing for extremely quick healing. + Growth + \ No newline at end of file diff --git a/Improved Husks/Localization/Japanese.xml b/Improved Husks/Localization/Japanese.xml new file mode 100644 index 0000000..2af0c51 --- /dev/null +++ b/Improved Husks/Localization/Japanese.xml @@ -0,0 +1,45 @@ + + + + 変異体クローラー + 変異体ムドラプター + 武装した変異体殻 + 変異体殻ハンター + 変異体人殻 + 繭形殻変異体 + 変異体タイガーシャーク + 変異体ボーンタイガーシャーク + スナッチャー + ニブラー + ミコテロン + + 不安定なベロナセプスの萼卵 + ‘殻寄生虫’と口語的に呼ばれるユーロパ生命体の卵。この卵は目覚めているみたいです + 不安定なハスクスティンガー + 硬化した黒いスティンガー,間に合わせの刺突器具。 + 蠢くミサ + 変異共生体殻の胚 + 開発が未完全な殻の胚,今だに眠っています + 萼形生命体注射器 + 不気味な注射器形装置,合成として使いにられる + 殻共生体注射器 + 不気味な注射器形装置,遺伝子が操られていた殻の胚を含めている,普通のベロナセプスの萼感染と比べると,こういう共生体殻に持ち出す感染は宿主にもっとメリットになる + 肉体活性化注射器 + 不気味な注射器形装置,肉体を活性化し,新陳代謝を増幅する化合物が含めている,体を急速に回復や成長ができる。だが副作用をおこる可能性もあります。 + + 殻寄生虫感染変異状態 + 肌のフェスターと骨の擦れる音と共に、悪いことが起こってしまう + 共生態殻寄生虫感染 + 何かおかしいだが違和感やダメージを感じられないものが身体に生えています... + 殻共生プロテクト + 共生態の殻寄生虫が体に酸素と有益な物質を提供する同時に,ピンチな時に素早く自我回復を与えられる + 殻寄生アフィニティ + 共生態にいる殻寄生虫はあなたの生理システムと完全に馴染んでいた,水圧抗性を与える同時に普通の殻寄生虫感染を完全に免疫する + 殻寄生の頭侵害中 + 急いて誰かに撃ち落とせ!! + 污毒 + 黒い毒が静脈血管に登って,驚くほどのスピードで血脈系を侵入しています。 + 强化共生態殻回復 + 強力でありながら揮発性の幹細胞のような細胞混合物があなたの体に素早く溶け込み、あなたの回復を非常に速くします。 + 成長 + \ No newline at end of file diff --git a/Improved Husks/Localization/Polish.xml b/Improved Husks/Localization/Polish.xml new file mode 100644 index 0000000..1ab928c --- /dev/null +++ b/Improved Husks/Localization/Polish.xml @@ -0,0 +1,45 @@ + + + + Zainfekowany Pełzacz + Zainfekowany Błotozaur + Opancerzony Skorupnik Mutant + Zainfekowana Krewoliszka łowca + Skorupnik Mutant + Kokon Skoupnika + Zainfekowany Mutant młocarz tygrysi + Młocarz Tygrysi Mutant + łazik + Dziobacz + Mikoteron + + Niestabilne jajka skorupnika + Jajka Europejskiego skorupnika nazywanego "pasożytem", Jajka charekteryzują sie wysoką aktywnością! + Niestabilny kolec skorupnika + Wzmocniony kolec skorupnika. Widać jak bardzo pulsuje + Masa do wirówki + Zmutowany enbriom skorupnika + Dziwne, niezindetifikowane ciało. Aktualnie nie daje oznak życia. + Strzykawka obcych + Strzykawka wykorzystywana w wytwórstwie. + Strzykawka symbiozy skorupnika + Strzykawka skorupnika, wytwarza symbioze z hostem dając odpornosci nie przejmując kontroli. + Strzykawka wzmocnienia skorupnika + Strzykawka symbiozy ze skorpunikiem dające pozytywne efekty. + + Mutacja skorupnika + Skóra jest ciemna i lekpa... coś dziwnego sie dzieje. + Symbioza skorupnika + Obca forma życia działająca pozytywnie i podtrzymuje na życiu. + Regeneracja skorupnika + Symbioza skorupnika utrzymuje cie natlenionego i odpornego na cisinienie, regeneruje ciało z krytycznego stanu. + Odpornosc skorupnika + Symbioza w pełni z skorupnikiem, odpornosc na cisnienie i zarazenie skorupnikiem do stanu utraty kontroli. + Wyrostek głowy + Widac kawałek wyrastającej głwy z czaszki, co powoduje problemy, musisz poprosic kogos by ją odstrzelić! + Czarna toksyna + Powoduje Czarną lepką skóre i żyły, pacjent nie przeżuje długo. + wzmocnienie skorupnika + Regeneracja skorupnika, daje ekstremalną regeneracje, moze zainfekowac ciało. + Przyrost + \ No newline at end of file diff --git a/Improved Husks/Localization/Russian.xml b/Improved Husks/Localization/Russian.xml new file mode 100644 index 0000000..45bd7bb --- /dev/null +++ b/Improved Husks/Localization/Russian.xml @@ -0,0 +1,45 @@ + + + + Ползун-мутант + Грязевой раптор-мутант + Крепкая Оболочка-мутант + Оболочка-мутант + Заражённый Коконообразный + Оболочка-мутант Охотник + Акулий тигр-мутант + Костяной тигр-мутант + Схватка + Кусачий + Микотерон + + Нестабильные яйца Велонацепса Каликса + Спящие яйца организма, более известного как «трупный паразит». Эти изобилуют деятельностью! + Нестабильное жало оболочки + Жесткое Черное Жало. Кажется, пульсирует время от времени. + Извивающаяся масса + Эмбрион мутанта + Странное недоразвитое существо. В настоящее время оно неактивно. + Хранилище яиц паразита + Зловещая штуковина, похожая на инжектор. Используется для крафта. + Хранилище симбиотических яиц паразита + Зловещая штуковина, похожая на инжектор. Внедряет модифицированную версию инфекции шелухи, которая принесет пользу (и недостатки) своего хозяина. + Сверхбыстрая инъекция Каликсанида + Зловещая штуковина, похожая на инжектор. Вводит смесь, которая временно ускоряет некоторые внутренние жизненные процессы пациента, такие как лечение и рост. Может иметь непредвиденные побочные эффекты. + + Мутация паразита + Кожа деформируется, кости трескаются... происходит что-то неприятное. + Симбиотический Паразит + Что-то чуждое, но доброжелательное процветает внутри... + Исцеление паразитом + Симбиотическая оболочка насыщает ваше тело кислородом и производит другие полезные вещества, которые могут помочь вам выздороветь из критического состояния. + Объеденение с оболочкой + Симбиотическая оболочка полностью утвердилась в вашем теле, обеспечивая сопротивление давлению и контроль на обычным паразитом, не давая ему полностью захватить Вас. + Битва за голову + Отрубленная голова пытается вывихнуть Ваш череп! Пытаться оттолкнуть её самостоятельно, похоже, бесполезно... Вам нужно попросить кого-нибудь отстрелить её! + Черный токсин + Пульсирующие черные вены распространяются по коже пациента всем с непонятной жидкостью внутри них. + Сверхбыстрая инъекция яиц хаска + Мощная, но опасная смесь стволоподобных клеток быстро интегрирующихся в ваше тело, обеспечиваю чрезвычайно быстрое лечение. + Рост + \ No newline at end of file diff --git a/Improved Husks/Localization/SimplifiedChinese.xml b/Improved Husks/Localization/SimplifiedChinese.xml new file mode 100644 index 0000000..dd2592b --- /dev/null +++ b/Improved Husks/Localization/SimplifiedChinese.xml @@ -0,0 +1,45 @@ + + + + 变异藻鬃爬行者 + 变异泥偶迅猛龙 + 武装画皮寄生变异体 + 画皮寄生变异体猎人 + 画皮寄生变异体 + 画皮胚胎茧寄生体 + 变异虎尾鱼蛇 + 变异碎骨鲨 + 抓手 + 咬人的 + 米科泰隆 + + 不稳定的萼型体内转续拟寄生物卵 + 木卫二某种寄生虫的卵,一般人们称其为“画皮寄生虫”。这些卵似乎处于活跃觉醒的状态,因此也更需要谨慎携带和使用 + 不稳定的画皮寄生虫蛰针 + 一枚硬化的黑色刺针,握在手上会时不时微微颤动 + 蠕动的质量 + 变异画皮共生体胚胎 + 一只未发育完全的奇特的生物胚胎,目前处于休眠状态 + 萼型有机体注射器 + 一个诡异的注射器型装置,可用于加工台合成 + 画皮共生体注射器 + 一个诡异的注射器型装置,包含着经过基因修改的共生态画皮寄生虫,相较于普通的画皮感染,这种共生态的画皮带来的感染会为宿主带来更多的益处。 + 活性强化注射器 + 一个诡异的注射器状器械,其中由活性画皮为主要成分的有机混合药物可暂时强化使用者的代谢速度,从而使其更迅速的恢复或成长。但其不稳定性仍旧可能产生副作用。 + + 画皮变异状态 + 伴随着皮肤的扭转褶皱和骨头嚓嚓的皲裂声... 即将发生些不好的事情 + 共生态画皮寄生虫感染 + 有什么陌生但感受不到异样和损害的东西在体内生长着... + 画皮共生保护 + 共生态的画皮在为你的身体供给氧气并产生其他有益物质,可以让你在濒危时快速自我恢复 + 画皮寄生亲和性 + 处于共生态的画皮已经与你的生理系统完全磨合,提供水压抗性和对普通画皮感染的控制,防止病毒的感染完全占领你。 + 画皮头颅正在侵占你的头部 + 一个被割断的头正试图使你的头骨脱臼!试图自己把它推开似乎是徒劳的。。。你得叫别人把它射下来! + 污毒 + 黑色的毒素顺着你的静脉血管攀爬而上,正在以惊人的速度扩散至你的血脉系统 + 强化共生态画皮感染 + 一种强大但易挥发的干细胞样细胞混合物迅速融入了你的身体,从而使你的恢复变得极为快速。 + 成长 + \ No newline at end of file diff --git a/Improved Husks/Particles/HuskmodParticlePrefabs.xml b/Improved Husks/Particles/HuskmodParticlePrefabs.xml new file mode 100644 index 0000000..462b9fb --- /dev/null +++ b/Improved Husks/Particles/HuskmodParticlePrefabs.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/Particles/huskheadattackparticle.png b/Improved Husks/Particles/huskheadattackparticle.png new file mode 100644 index 0000000..8e2a1ba --- /dev/null +++ b/Improved Husks/Particles/huskheadattackparticle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bee7c0de07f3a3b4a5877de15b2cbcaa943725a361961cd9e7528050fb0ab10 +size 1167 diff --git a/Improved Husks/Particles/watcherscreechparticle.png b/Improved Husks/Particles/watcherscreechparticle.png new file mode 100644 index 0000000..e7e0961 --- /dev/null +++ b/Improved Husks/Particles/watcherscreechparticle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3a570f8ee6560e61ddffed2841867064044bca411cfda13e3a6c4190a1c7acd +size 14719 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep1.ogg b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep1.ogg new file mode 100644 index 0000000..df87102 --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46e57014d425dc73ba48d02f2b20ef75363d6d833822e214e58791d58d3b1a77 +size 37504 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep2.ogg b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep2.ogg new file mode 100644 index 0000000..4b60f8b --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:956ed02a86747f8ef99e261399deb4f790492a7ce5a7106d1607a50c4a0c96c0 +size 37642 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep3.ogg b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep3.ogg new file mode 100644 index 0000000..6e490f1 --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6a62fa7b6b7f4c91a8c07912015ac4329da374e2faddca8f13dde3d91c56977 +size 27663 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep4.ogg b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep4.ogg new file mode 100644 index 0000000..07ce8b0 --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b73eea27fa68fce4556e9dbc31fc108a5f5fb6071179d50e65b281aa14538c67 +size 25024 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep5.ogg b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep5.ogg new file mode 100644 index 0000000..67700ea --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutantarmored/footstep5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b426289de374815851d1180e699a75583d51743c418510c4c73fca0473f93b7 +size 29362 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep1.ogg b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep1.ogg new file mode 100644 index 0000000..0ac83bc --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf7efeb0a05ad6ecd6f52582bdd7c6baf3d4bb52b33052b5001371c1626393e +size 19924 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep2.ogg b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep2.ogg new file mode 100644 index 0000000..63d86df --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ad1fe58c01440534ea212c8df2df632ac624dc25bf5502b858739bc6f9a8c23 +size 21147 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep3.ogg b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep3.ogg new file mode 100644 index 0000000..e74173c --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26d37956e47210063c26a79edbb1719ef96992a8a2e847f294f81b93739a47dc +size 20501 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep4.ogg b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep4.ogg new file mode 100644 index 0000000..a65e862 --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9d7529c7ed6366e6694de5dd806aefdd5a8f53c77127f9524a7c69830299dda +size 18861 diff --git a/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep5.ogg b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep5.ogg new file mode 100644 index 0000000..f426b5b --- /dev/null +++ b/Improved Husks/Sounds/Footsteps/Huskmutanthunter/footstep5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d30fc4b9a9b6a432c13c276f2d3e69bb30090b868f64b70c4a27669f8e41e472 +size 18879 diff --git a/Improved Husks/Sounds/huskmodsounds.xml b/Improved Husks/Sounds/huskmodsounds.xml new file mode 100644 index 0000000..a4a8438 --- /dev/null +++ b/Improved Husks/Sounds/huskmodsounds.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/filelist.xml b/Improved Husks/filelist.xml new file mode 100644 index 0000000..db34c7b --- /dev/null +++ b/Improved Husks/filelist.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/huskevents.xml b/Improved Husks/huskevents.xml new file mode 100644 index 0000000..1d965b8 --- /dev/null +++ b/Improved Husks/huskevents.xml @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Improved Husks/huskeventscampaign.xml b/Improved Husks/huskeventscampaign.xml new file mode 100644 index 0000000..343df14 --- /dev/null +++ b/Improved Husks/huskeventscampaign.xml @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Item IO Framework/CSharp/Client/ItemBox.cs b/Item IO Framework/CSharp/Client/ItemBox.cs new file mode 100644 index 0000000..c07762f --- /dev/null +++ b/Item IO Framework/CSharp/Client/ItemBox.cs @@ -0,0 +1,323 @@ +using Barotrauma.Items.Components; +using Barotrauma; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System.Collections.Generic; +using System; +using System.ComponentModel; +using Barotrauma.Networking; +using System.Linq; + +namespace BaroMod_sjx +{ + partial class ItemBoxImpl + { + + [HarmonyPatch(typeof(Inventory), nameof(Inventory.DrawSlot))] + class Patch_DrawSlot + { + public class context + { + public SpriteBatch spriteBatch; + + public Inventory inventory; + public Sprite? indicatorSprite; + public Sprite? emptyIndicatorSprite; + public Sprite? itemSprite; + public Rectangle conditionIndicatorArea; + + public int max_value; + public int cur_value; + public Vector2 sprite_pos; + public float sprite_scale; + public float rotation; + public Color spriteColor; + public context(SpriteBatch sb, Inventory inv, Sprite? full, Sprite? empty, Sprite? item, Rectangle area, int max, int cur, Vector2 sp, float ss, float rot, Color sc) + { + spriteBatch = sb; + inventory = inv; + indicatorSprite = full; + emptyIndicatorSprite = empty; + itemSprite = item; + conditionIndicatorArea = area; + max_value = max; + cur_value = cur; + sprite_pos = sp; + sprite_scale = ss; + rotation = rot; + spriteColor = sc; + } + } + + static private void Invoke_DrawItemStateIndicator( + SpriteBatch spriteBatch, Inventory inventory, + Sprite indicatorSprite, Sprite emptyIndicatorSprite, Rectangle containedIndicatorArea, float containedState, + bool pulsate = false) + { + AccessTools.Method(typeof(Inventory), "DrawItemStateIndicator")! + .Invoke(null, new object[] { spriteBatch, inventory, indicatorSprite, emptyIndicatorSprite, containedIndicatorArea, containedState, pulsate }); + } + + private static Sprite? GetTargetSprite(ConditionStorage conditionStorage, Inventory iv) + { + Inventory.ItemSlot target_slot; + { + Inventory.ItemSlot[] slots = (AccessTools.Field(typeof(Inventory), "slots").GetValue(iv)! as Inventory.ItemSlot[])!; + if (conditionStorage.slotIndex >= slots.Length) + { + DebugConsole.LogError($"ConditionStorage of {(iv.Owner as Item)!.Prefab.Identifier} specified index {conditionStorage.slotIndex} out of {slots.Length}!"); + return null; + } + target_slot = slots[conditionStorage.slotIndex]; + } + if (target_slot.Any()) + { + Item i = target_slot.First(); + return i.Prefab.InventoryIcon ?? i.Sprite; + } + else + { + return null; + } + } + + public static bool Prefix(out context? __state, + SpriteBatch spriteBatch, Inventory inventory, VisualSlot slot, Item item, int slotIndex) + { + if (inventory != null && item != null && get_componentsByType(item).TryGetValue(typeof(ConditionStorage), out List? comps)) + { + ConditionStorage conditionStorage = (comps.First() as ConditionStorage)!; + if (!conditionStorage.showIcon && !conditionStorage.showCount) + { + __state = null; + return true; + } + + + Rectangle rect = slot.Rect; + rect.Location += slot.DrawOffset.ToPoint(); + + if (slot.HighlightColor.A > 0) + { + float inflateAmount = (slot.HighlightColor.A / 255.0f) * slot.HighlightScaleUpAmount * 0.5f; + rect.Inflate(rect.Width * inflateAmount, rect.Height * inflateAmount); + } + + var itemContainer = item.GetComponent(); + + Sprite? indicatorSprite; + Sprite? emptyIndicatorSprite; + Rectangle conditionIndicatorArea; + if (conditionStorage.showCount) + { + + + if (itemContainer is null) + { + DebugConsole.LogError($"Item {item.Prefab.Identifier} has ConditionStorage but no ItemContainer!"); + __state = null; + return true; + } + if (itemContainer.InventoryTopSprite != null || itemContainer.InventoryBottomSprite != null) + { + __state = null; + return true; + } + int dir = slot.SubInventoryDir; + + if (itemContainer.ShowContainedStateIndicator) + { + conditionIndicatorArea = new Rectangle(rect.X, rect.Bottom - (int)(10 * GUI.Scale), rect.Width, (int)(10 * GUI.Scale)); + } + else + { + conditionIndicatorArea = new Rectangle( + rect.X, dir < 0 ? rect.Bottom + HUDLayoutSettings.Padding / 2 : rect.Y - HUDLayoutSettings.Padding / 2 - Inventory.ContainedIndicatorHeight, + rect.Width, Inventory.ContainedIndicatorHeight); + conditionIndicatorArea.Inflate(-4, 0); + } + + + GUIComponentStyle indicatorStyle = GUIStyle.GetComponentStyle("ContainedStateIndicator.Default")!; + indicatorSprite = indicatorStyle.GetDefaultSprite(); + emptyIndicatorSprite = indicatorStyle.GetSprite(GUIComponent.ComponentState.Hover); + } + else + { + indicatorSprite = null; + emptyIndicatorSprite = null; + conditionIndicatorArea = new Rectangle(); + } + + Vector2 itemPos; + float scale; + float rotation; + Sprite? item_sprite; + Color spriteColor; + + if (conditionStorage.showIcon) + { + item_sprite = GetTargetSprite(conditionStorage, itemContainer.Inventory!); + if (item_sprite != null) + { + scale = Math.Min(Math.Min((rect.Width - 10) / item_sprite.size.X, (rect.Height - 10) / item_sprite.size.Y), 2.0f); + itemPos = rect.Center.ToVector2(); + if (itemPos.Y > GameMain.GraphicsHeight) + { + itemPos.Y -= Math.Min( + (itemPos.Y + item_sprite.size.Y / 2 * scale) - GameMain.GraphicsHeight, + (itemPos.Y - item_sprite.size.Y / 2 * scale) - rect.Y); + } + + rotation = 0.0f; + if (slot.HighlightColor.A > 0) + { + rotation = (float)Math.Sin(slot.HighlightTimer * MathHelper.TwoPi) * slot.HighlightTimer * 0.3f; + } + + spriteColor = item_sprite == item.Sprite ? item.GetSpriteColor() : item.GetInventoryIconColor(); + } + else + { + scale = 1.0f; + rotation = 0.0f; + spriteColor = Color.White; + } + } + else + { + item_sprite = null; + scale = 1.0f; + rotation = 0.0f; + spriteColor = Color.White; + } + Vector2 center = rect.Center.ToVector2() + (new Vector2(conditionStorage.iconShiftX, conditionStorage.iconShiftY)) * slot.Rect.Size.ToVector2() * 0.5f; + __state = new context(spriteBatch, inventory, indicatorSprite, emptyIndicatorSprite, item_sprite, + conditionIndicatorArea, conditionStorage.maxItemCount, conditionStorage.currentItemCount, center, + scale * conditionStorage.iconScale, rotation, spriteColor); + } + else + { + __state = null; + } + return true; + } + public static void Postfix(context? __state) + { + if (__state != null) + { + __state.itemSprite?.Draw(__state.spriteBatch, __state.sprite_pos, __state.spriteColor, __state.rotation, __state.sprite_scale); + if (__state.indicatorSprite != null && __state.emptyIndicatorSprite != null) + { + Invoke_DrawItemStateIndicator(__state.spriteBatch, __state.inventory, __state.indicatorSprite, __state.emptyIndicatorSprite, __state.conditionIndicatorArea, + __state.cur_value / (float)__state.max_value); + string info_text = $"{__state.cur_value}/{__state.max_value}"; + float text_scale = 0.75f; + Vector2 info_size = GUIStyle.SmallFont.MeasureString(info_text) * text_scale; + GUIStyle.SmallFont.DrawString(__state.spriteBatch, info_text, __state.conditionIndicatorArea.Center.ToVector2() - (info_size * 0.5f), Color.White, 0.0f, Vector2.Zero, text_scale, SpriteEffects.None, 0.0f); + } + } + } + } + } + + partial class ConditionStorage : ItemComponent, IServerSerializable + { + private CoroutineHandle? resetPredictionCoroutine = null; + private int? last_server_update_count = null; + private float resetPredictionTimer = 1.0f; + + float last_update_time = 0; + + const double remove_time = 1.0; + + class ItemStackedInfo + { + public Item target; + public Inventory removed_from; + public Character user; + public double timestamp; + public int slot; + public ItemStackedInfo(Item item, Character character, Inventory removedFrom, int from_slot) + { + target = item; + removed_from = removedFrom; + user = character; + slot = from_slot; + timestamp = Timing.TotalTime; + } + } + + // keep a list of items removed on client side so that they can be put back into container after timeour + private List removed = new List(); + + + void RemoveItem_track(Item item, Character user, Inventory removedFrom, int slot) + { + removed.Add(new ItemStackedInfo(item, user, removedFrom, slot)); + } + + void UpdateRemovedItems() + { + var copy = removed.CreateCopy(); + foreach (var item in copy) + { + // updated from server to be removed + if (item.target.Removed) + { + removed.Remove(item); + } + // timeout for removed item. put it back. + else if (Timing.TotalTime - item.timestamp > remove_time) + { + if (!item.removed_from.TryPutItem(item.target, item.slot, false, false, item.user, false, false)) + { + item.target.Drop(item.user, true, true); + } + removed.Remove(item); + } + } + if (removed.Any()) + { + IsActive = true; + } + } + + partial void OnCountPredictionChanged() + { + if (GameMain.Client == null || !last_server_update_count.HasValue) { return; } + if (resetPredictionCoroutine == null || !CoroutineManager.IsCoroutineRunning(resetPredictionCoroutine)) + { + resetPredictionCoroutine = CoroutineManager.StartCoroutine(ResetPredictionAfterDelay()); + } + } + + private IEnumerable ResetPredictionAfterDelay() + { + while (resetPredictionTimer > 0.0f) + { + resetPredictionTimer -= CoroutineManager.DeltaTime; + yield return CoroutineStatus.Running; + } + if (last_server_update_count.HasValue) { SetItemCount(last_server_update_count.Value, false); } + resetPredictionCoroutine = null; + yield return CoroutineStatus.Success; + } + + public void ClientEventRead(IReadMessage msg, float sendingTime) + { + if (last_update_time <= sendingTime) + { + last_update_time = sendingTime; + last_server_update_count = msg.ReadRangedInteger(0, maxItemCount); + SetItemCount(last_server_update_count.Value, true); + } + else + { + // discard the number, but still extract it from stream. + msg.ReadRangedInteger(0, maxItemCount); + } + } + } +} diff --git a/Item IO Framework/CSharp/ItemBox.sln b/Item IO Framework/CSharp/ItemBox.sln new file mode 100644 index 0000000..7dc8d31 --- /dev/null +++ b/Item IO Framework/CSharp/ItemBox.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32825.248 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ItemBoxClient", "ItemBoxClient.csproj", "{D6EE7363-56EC-442E-8A50-C12111C41B59}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ItemBoxServer", "ItemBoxServer.csproj", "{35F1A00E-3387-47F2-BC89-6DB51BF829F4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Debug|x64.ActiveCfg = Debug|x64 + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Debug|x64.Build.0 = Debug|x64 + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Release|Any CPU.Build.0 = Release|Any CPU + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Release|x64.ActiveCfg = Release|x64 + {D6EE7363-56EC-442E-8A50-C12111C41B59}.Release|x64.Build.0 = Release|x64 + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Debug|x64.ActiveCfg = Debug|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Debug|x64.Build.0 = Debug|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Release|Any CPU.Build.0 = Release|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Release|x64.ActiveCfg = Release|Any CPU + {35F1A00E-3387-47F2-BC89-6DB51BF829F4}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BE43C433-493F-4E78-9590-A780226B0FB3} + EndGlobalSection +EndGlobal diff --git a/Item IO Framework/CSharp/ItemBoxClient.csproj b/Item IO Framework/CSharp/ItemBoxClient.csproj new file mode 100644 index 0000000..993d29d --- /dev/null +++ b/Item IO Framework/CSharp/ItemBoxClient.csproj @@ -0,0 +1,46 @@ + + + + net6.0 + enable + enable + AnyCPU;x64 + + + + 1701;1702;CS0122 + $(DefineConstants)TRACE;CLIENT + + + + 1701;1702;CS0122 + $(DefineConstants)TRACE;CLIENT + + + + 1701;1702;CS0122 + $(DefineConstants)TRACE;CLIENT + + + + 1701;1702;CS0122 + $(DefineConstants)TRACE;CLIENT + + + + + ..\Refs\0Harmony.dll + + + ..\Refs\Client\Barotrauma.dll + + + ..\Refs\MonoGame.Framework.Windows.NetStandard.dll + + + ..\Refs\XNATypes.dll + + + + + diff --git a/Item IO Framework/CSharp/ItemBoxServer.csproj b/Item IO Framework/CSharp/ItemBoxServer.csproj new file mode 100644 index 0000000..f9a9b8e --- /dev/null +++ b/Item IO Framework/CSharp/ItemBoxServer.csproj @@ -0,0 +1,34 @@ + + + + net6.0 + enable + enable + + + + $(DefineConstants)TRACE;SERVER + + + + $(DefineConstants)TRACE;SERVER + + + + ..\Refs\0Harmony.dll + + + ..\Refs\Server\DedicatedServer.dll + + + ..\Refs\MonoGame.Framework.Windows.NetStandard.dll + + + ..\Refs\Server\NetScriptAssembly.dll + + + ..\Refs\XNATypes.dll + + + + diff --git a/Item IO Framework/CSharp/RunConfig.xml b/Item IO Framework/CSharp/RunConfig.xml new file mode 100644 index 0000000..5796b9a --- /dev/null +++ b/Item IO Framework/CSharp/RunConfig.xml @@ -0,0 +1,5 @@ + + + Standard + Standard + \ No newline at end of file diff --git a/Item IO Framework/CSharp/Server/ItemBox.cs b/Item IO Framework/CSharp/Server/ItemBox.cs new file mode 100644 index 0000000..4a59392 --- /dev/null +++ b/Item IO Framework/CSharp/Server/ItemBox.cs @@ -0,0 +1,57 @@ +using Barotrauma; +using HarmonyLib; +using System.Reflection; +using System.Linq; +using Barotrauma.Items.Components; +using System.Collections.Generic; +using System; +using Microsoft.Xna.Framework; +using System.ComponentModel; +using Barotrauma.Networking; + +namespace BaroMod_sjx +{ + + partial class ConditionStorage : ItemComponent, IServerSerializable + { + /* + private CoroutineHandle? sendStateCoroutine; + private int lastSentState; + private float sendStateTimer; + */ + partial void OnCountPredictionChanged() + { + /* + sendStateTimer = 0.5f; + if (sendStateCoroutine == null) + { + sendStateCoroutine = CoroutineManager.StartCoroutine(SendStateAfterDelay()); + }*/ + } + + /* + private IEnumerable SendStateAfterDelay() + { + while (sendStateTimer > 0.0f) + { + sendStateTimer -= CoroutineManager.DeltaTime; + yield return CoroutineStatus.Running; + } + + if (Item.Removed || GameMain.NetworkMember == null) + { + yield return CoroutineStatus.Success; + } + + sendStateCoroutine = null; + if (lastSentState != currentItemCount) { Item.CreateServerEvent(this); } + yield return CoroutineStatus.Success; + }*/ + + public void ServerEventWrite(IWriteMessage msg, Client c, NetEntityEvent.IData? extraData = null) + { + EventData eventData = ExtractEventData(extraData); + msg.WriteRangedInteger(eventData.ItemCount, 0, maxItemCount); + } + } +} \ No newline at end of file diff --git a/Item IO Framework/CSharp/Shared/ItemBox.cs b/Item IO Framework/CSharp/Shared/ItemBox.cs new file mode 100644 index 0000000..ec30041 --- /dev/null +++ b/Item IO Framework/CSharp/Shared/ItemBox.cs @@ -0,0 +1,408 @@ +using Barotrauma; +using HarmonyLib; +using System.Reflection; +using System.Linq; +using Barotrauma.Items.Components; +using System.Collections.Generic; +using System; +using Microsoft.Xna.Framework; +using System.ComponentModel; +using Barotrauma.Networking; + +namespace BaroMod_sjx +{ + partial class ItemBoxImpl : ACsMod + { + const string harmony_id = "com.sjx.ItemIOFramework"; + /* + const string box_identifier = "ItemBox"; + const float max_condition = 1.0f; + const int item_count = 1024; + const float increment = max_condition / item_count; + */ + private readonly Harmony harmony; + + public ItemBoxImpl() + { + harmony = new Harmony(harmony_id); + harmony.PatchAll(Assembly.GetExecutingAssembly()); + Barotrauma.DebugConsole.AddWarning("Loaded ItemBox Impl"); + } + + public override void Stop() + { + harmony.UnpatchAll(harmony_id); + } + + + + static Dictionary> get_componentsByType(Item item) + { + return (AccessTools.Field(typeof(Item), "componentsByType").GetValue(item)! as Dictionary>)!; + } + + [HarmonyPatch(typeof(Inventory))] + class Patch_PutItem + { + static MethodBase TargetMethod() + { + Barotrauma.DebugConsole.AddWarning("Patch_PutItem TargetMethod"); + return AccessTools.Method(typeof(Inventory), "PutItem"); + } + + public class context + { + public Character user; + public ConditionStorage target; + public context(Character user, ConditionStorage target) + { + this.user = user; + this.target = target; + } + } + + public static bool Prefix(Inventory __instance, Character user, int i, out context? __state) + { + __state = null; + ConditionStorage? target = ConditionStorage.GetFromInventory(__instance); + if (target != null && i == target.slotIndex) + { + __state = new context(user, target); + } + return true; + } + public static void Postfix(context? __state) + { + if (__state != null) + { + __state.target.OnPutItemDone(__state.user); + } + } + } + + [HarmonyPatch(typeof(Inventory), nameof(Inventory.RemoveItem))] + class Patch_RemoveItem + { + public static bool Prefix(Inventory __instance, out ConditionStorage? __state, Item item) + { + __state = null; + // do not add items if sub is unloading or if removed for overflow. + if (!Submarine.Unloading) + { + ConditionStorage? target = ConditionStorage.GetFromInventory(__instance); + if (target != null) + { + if (target.GetSlot()?.Contains(item) ?? false) + { + if (target.flag_remove_no_spawn) + { + target.flag_remove_no_spawn = false; + } + else + { + target.QualityStacked = item.Quality; + target.ConditionStacked = item.Condition; + target.item_type = item.Prefab; + __state = target; + } + } + } + } + return true; + } + public static void Postfix(ConditionStorage? __state) + { + if (__state != null) + { + __state.OnRemoveItemDone(); + } + } + } + + [HarmonyPatch(typeof(Inventory))] + class Patch_TrySwapping + { + static MethodBase TargetMethod() + { + return AccessTools.Method(typeof(Inventory), "TrySwapping"); + } + + public static bool Prefix(Inventory __instance, Item item, ref bool __result) + { + if (ConditionStorage.GetFromInventory(__instance) != null || + (item != null && item.ParentInventory != null && ConditionStorage.GetFromInventory(item.ParentInventory) != null)) + { + __result = false; + return false; + } + return true; + } + } + + [HarmonyPatch(typeof(Inventory))] + class Patch_CreateNetworkEvent + { + static MethodBase TargetMethod() + { + return AccessTools.Method(typeof(Inventory), "CreateNetworkEvent"); + } + + public static bool Prefix(Inventory __instance, out ConditionStorage? __state) + { + __state = null; + if (GameMain.NetworkMember != null) + { + __state = ConditionStorage.GetFromInventory(__instance); + } + return true; + } + + public static void Postfix(ConditionStorage? __state) + { + if (__state != null) + { + __state.SyncItemCount(); + } + } + } + } + + partial class ConditionStorage : ItemComponent + { + private readonly struct EventData : IEventData + { + public readonly int ItemCount; + + public EventData(int ItemCount) + { + this.ItemCount = ItemCount; + } + } + + [Serialize(0, IsPropertySaveable.No, description: "Index of the stacking slot in same item's ItemContainer component")] + public int slotIndex { get; private set; } + + [Serialize(true, IsPropertySaveable.No, description: "Shows count and percentage of stacking item")] + public bool showCount { get; private set; } + + [Serialize(1024, IsPropertySaveable.No, description: "Maximum number of items stacked within")] + public int maxItemCount { get; private set; } + + [Serialize(true, IsPropertySaveable.No, description: "Shows icon of stacking item")] + public bool showIcon { get; private set; } + + [Serialize(0.6f, IsPropertySaveable.No, description: "icon scale compared to full")] + public float iconScale { get; private set; } + + [Serialize(0.0f, IsPropertySaveable.No, description: "shift x of icon")] + public float iconShiftX { get; private set; } + + [Serialize(0.1f, IsPropertySaveable.No, description: "shift y of icon, down is positive")] + public float iconShiftY { get; private set; } + + [Editable(minValue: 0, maxValue: int.MaxValue), Serialize(0, IsPropertySaveable.Yes, description: "Current item count")] + // camel case needed for save compatibility + public int currentItemCount + { + get => _currentItemCount; + // assume set by + set + { + SetItemCount(value, false); + } + } + + void SetItemCount(int value, bool is_network_event = false) + { + if (is_network_event || GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer) + // authoritative number. will need to send to client later if server. + { + if (value != _currentItemCount) + { + OnCountActualChanged(); + } + } + // predicted number. need to be reset later + else + { + if (value != _currentItemCount) + { + OnCountPredictionChanged(); + } + } + IsActive = true; + _currentItemCount = value; + } + + public ItemInventory itemInventory => Item.OwnInventory; + public ItemContainer itemContainer => Item.GetComponent(); + + public int _currentItemCount; + + // replace setting parent container hack, so that harpoon guns work correctly + public bool flag_remove_no_spawn; + + partial void OnCountActualChanged(); + partial void OnCountPredictionChanged(); + + + [Editable, Serialize("", IsPropertySaveable.Yes, description: "current stacked item")] + public Identifier ItemIdentifier + { + get + { + return item_type?.Identifier ?? ""; + } + set + { + if (value.IsEmpty) + { + item_type = null; + } + else + { + item_type = ItemPrefab.Find("", value.ToIdentifier()); + } + } + } + + public ItemPrefab? item_type; + + [Editable(MinValueInt = 0, MaxValueInt = Quality.MaxQuality), Serialize(0, IsPropertySaveable.Yes, description: "current stacked item quality")] + public int QualityStacked { get; set; } + + [Editable, Serialize(float.NaN, IsPropertySaveable.Yes, description: "current stacked item condition")] + public float ConditionStacked { get; set; } + + + + public ConditionStorage(Item item, ContentXElement element) : base(item, element) { } + + public bool IsFull => currentItemCount >= maxItemCount; + public bool IsEmpty() => currentItemCount <= 0; + + public void SyncItemCount() + { +#if SERVER + Item.CreateServerEvent(this, new EventData(currentItemCount)); +#endif + } + + public override void Update(float deltaTime, Camera cam) + { + base.Update(deltaTime, cam); + SyncItemCount(); + IsActive = false; + } + + public static int SlotPreserveCount(ItemPrefab prefab, Inventory inventory, ItemContainer container, int slot_index) + { + int resolved_stack_size = Math.Min(Math.Min(prefab.GetMaxStackSize(inventory), container.GetMaxStackSize(slot_index)), Inventory.MaxPossibleStackSize); + if (resolved_stack_size <= 1) + { + return 1; + } + else + { + return resolved_stack_size - 1; + } + } + + public static ConditionStorage? GetFromInventory(Inventory inventory) + { + if (inventory.Owner is Item parentItem) + { + return parentItem.GetComponent(); + } + else + { + return null; + } + } + + public Inventory.ItemSlot? GetSlot() + { + Inventory.ItemSlot[] slots = (AccessTools.Field(typeof(Inventory), "slots").GetValue(itemInventory)! as Inventory.ItemSlot[])!; + if (slotIndex >= slots.Length) + { + DebugConsole.LogError($"ConditionStorage of {Item.Prefab.Identifier} specified index {slotIndex} out of {slots.Length}!"); + return null; + } + return slots[slotIndex]; + } + + public void OnPutItemDone(Character user) + { + ItemContainer container = itemContainer; + Inventory.ItemSlot target_slot; + { + Inventory.ItemSlot[] slots = (AccessTools.Field(typeof(Inventory), "slots").GetValue(itemInventory)! as Inventory.ItemSlot[])!; + if (slotIndex >= slots.Length) + { + DebugConsole.LogError($"ConditionStorage of {Item.Prefab.Identifier} specified index {slotIndex} out of {slots.Length}!"); + return; + } + target_slot = slots[slotIndex]; + } + + if (target_slot.Items.Any()) + { + QualityStacked = target_slot.Items.First().Quality; + ConditionStacked = target_slot.Items.First().Condition; + item_type = target_slot.Items.First().Prefab; + if (!IsFull) + { + //bool edited = false; + int preserve = SlotPreserveCount(target_slot.Items.First().Prefab, itemInventory, container, slotIndex); + var it = target_slot.Items.ToArray().AsEnumerable().GetEnumerator(); + while (it.MoveNext() && !IsFull) + { + if (preserve > 0) + { + preserve--; + } + else if (Entity.Spawner != null) + { + // client cannot despawn items, single player needs to despawn + Entity.Spawner.AddItemToRemoveQueue(it.Current); + SetItemCount(currentItemCount + 1); + flag_remove_no_spawn = true; + itemInventory.RemoveItem(it.Current); + break; + } + } + } + } + } + + public void OnRemoveItemDone() + { + Inventory.ItemSlot target_slot; + { + Inventory.ItemSlot[] slots = (AccessTools.Field(typeof(Inventory), "slots").GetValue(itemInventory)! as Inventory.ItemSlot[])!; + if (slotIndex >= slots.Length) + { + DebugConsole.LogError($"ConditionStorage of {(itemInventory.Owner as Item)!.Prefab.Identifier} specified index {slotIndex} out of {slots.Length}!"); + return; + } + target_slot = slots[slotIndex]; + } + + int preserve = SlotPreserveCount(item_type!, itemInventory, itemContainer, slotIndex); + int spawn_count = preserve - target_slot.Items.Count; + int can_spawn = Math.Min(spawn_count, currentItemCount); + + // other may be queued, so spawn only one + if (can_spawn > 0) + { + if (Entity.Spawner != null) + { + SetItemCount(currentItemCount - 1); + + Item.Spawner.AddItemToSpawnQueue(item_type, itemInventory, + ConditionStacked, QualityStacked, spawnIfInventoryFull: true); + } + } + } + } +} diff --git a/Item IO Framework/XML/ItemBox.xml b/Item IO Framework/XML/ItemBox.xml new file mode 100644 index 0000000..9f4507b --- /dev/null +++ b/Item IO Framework/XML/ItemBox.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Item IO Framework/XML/Text/English.xml b/Item IO Framework/XML/Text/English.xml new file mode 100644 index 0000000..df924a0 --- /dev/null +++ b/Item IO Framework/XML/Text/English.xml @@ -0,0 +1,5 @@ + + + Item Box + Stack your stackable items in one entity. + \ No newline at end of file diff --git a/Item IO Framework/XML/Text/SimplifiedChinese.xml b/Item IO Framework/XML/Text/SimplifiedChinese.xml new file mode 100644 index 0000000..63173b5 --- /dev/null +++ b/Item IO Framework/XML/Text/SimplifiedChinese.xml @@ -0,0 +1,5 @@ + + + 物品箱 + 让你可叠加的物品叠加在一个实体上面 + \ No newline at end of file diff --git a/Item IO Framework/filelist.xml b/Item IO Framework/filelist.xml new file mode 100644 index 0000000..e9be450 --- /dev/null +++ b/Item IO Framework/filelist.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ItemIO BetterMergeStack/CSharp/Client/BmsUtil.cs b/ItemIO BetterMergeStack/CSharp/Client/BmsUtil.cs new file mode 100644 index 0000000..3991eb4 --- /dev/null +++ b/ItemIO BetterMergeStack/CSharp/Client/BmsUtil.cs @@ -0,0 +1,78 @@ +using System.Linq; +using Barotrauma; +using Barotrauma.Items.Components; + +using Barotrauma.Extensions; +using System.Collections.Generic; + +namespace BmsUtils +{ + public static class Util + { + private static List GetStackBoxIndex(ItemInventory inv) + { + var stackBoxsIndex = new List(); + for (var i = 0; i < inv.Capacity; i++) + { + var items = inv.GetItemsAt(i).ToList(); + if (items.None()) { continue; } + if (items.First().Prefab.Identifier.ToString() == "StackBox" && items.First().OwnInventories.First().AllItemsMod.Any()) + { + stackBoxsIndex.Add(i); + } + } + return stackBoxsIndex; + } + public static void PushItems(bool toStackBox = false) + { + + var controlCharacter = Character.Controlled; + var selectedContainer = controlCharacter.SelectedItem?.GetComponent(); + var leftHandItems = controlCharacter.Inventory.GetItemsAt(5).FirstOrDefault()?.OwnInventory; + var rightHandItems = controlCharacter.Inventory.GetItemsAt(6).FirstOrDefault()?.OwnInventory; + + if (leftHandItems != null) + { + for (var i = 0; i < leftHandItems.Capacity; i++) + { + foreach (var item in leftHandItems.GetItemsAt(i).ToList()) + { + if (toStackBox) + { + foreach (var boxIndex in GetStackBoxIndex(selectedContainer.Inventory)) + { + selectedContainer.Inventory.TryPutItem(item, boxIndex, allowSwapping: false, allowCombine: true, user: null, createNetworkEvent: true); + } + + } + else + { + selectedContainer.Inventory.TryPutItem(item, controlCharacter, createNetworkEvent: true, ignoreCondition: true); + } + } + } + } + if (rightHandItems != null) + { + for (var i = 0; i < rightHandItems.Capacity; i++) + { + foreach (var item in rightHandItems.GetItemsAt(i).ToList()) + { + if (toStackBox) + { + foreach (var boxIndex in GetStackBoxIndex(selectedContainer.Inventory)) + { + selectedContainer.Inventory.TryPutItem(item, boxIndex, allowSwapping: false, allowCombine: true, user: null, createNetworkEvent: true); + } + + } + else + { + selectedContainer.Inventory.TryPutItem(item, controlCharacter, createNetworkEvent: true, ignoreCondition: true); + } + } + } + } + } + } +} diff --git a/ItemIO BetterMergeStack/CSharp/Client/Bmsmod.cs b/ItemIO BetterMergeStack/CSharp/Client/Bmsmod.cs new file mode 100644 index 0000000..4100505 --- /dev/null +++ b/ItemIO BetterMergeStack/CSharp/Client/Bmsmod.cs @@ -0,0 +1,92 @@ +using System.Reflection; +using Barotrauma.Extensions; +using Microsoft.Xna.Framework; +using HarmonyLib; +using System.Linq; +using Barotrauma; +using BmsUtils; + +// debug +// using System.Diagnostics; + +namespace Bms_Harmony +{ + partial class BmsHarmony : ACsMod + { + const string harmony_id = "com.Bms.Harmony"; + private readonly Harmony harmony; + + public override void Stop() + { + harmony.UnpatchAll(harmony_id); + } + + public BmsHarmony() + { + harmony = new Harmony(harmony_id); + harmony.PatchAll(Assembly.GetExecutingAssembly()); + Barotrauma.DebugConsole.AddWarning("Loaded BmsHarmony"); + } + + [HarmonyPatch(typeof(Barotrauma.Items.Components.ItemContainer))] + class Patch_MergeStacks + { + static MethodBase TargetMethod() + { + Barotrauma.DebugConsole.AddWarning("Patch_MergeStacks TargetMethod"); + return AccessTools.Method(typeof(Barotrauma.Items.Components.ItemContainer), "MergeStacks"); + } + static bool Prefix(Barotrauma.Items.Components.ItemContainer __instance) + { + for (int i = 0; i < __instance.Inventory.Capacity - 1; i++) + { + var items = __instance.Inventory.GetItemsAt(i).ToList(); + if (items.None()) { continue; } + if (items.First().Prefab.Identifier.ToString() == "StackBox" && + items.First().OwnInventories.First().AllItemsMod.Any()) + { + for (int j = 0; j < __instance.Inventory.Capacity - 1; j++) + { + var items2 = __instance.Inventory.GetItemsAt(j).ToList(); + if (items2.None()) { continue; } + if (items2.First().Prefab.Identifier.ToString() != "StackBox") + { + items2.ForEach(it => __instance.Inventory.TryPutItem(it, i, allowSwapping: false, allowCombine: true, user: null, createNetworkEvent: false)); + continue; + } + + } + } + } + return true; + } + } + + [HarmonyPatch(typeof(Barotrauma.Items.Components.ItemContainer))] + class Patch_CreateGUI + { + static MethodBase TargetMethod() + { + Barotrauma.DebugConsole.AddWarning("Patch_CreateGUI TargetMethod"); + return AccessTools.Method(typeof(Barotrauma.Items.Components.ItemContainer), "CreateGUI"); + } + + static void Postfix(Barotrauma.Items.Components.ItemContainer __instance) + { + if (__instance.Inventory.Capacity > 1) + { + var layoutGroup = __instance.GuiFrame.FindChild(c => c is Barotrauma.GUILayoutGroup, recursive: true); + new GUIButton(new RectTransform(Vector2.One, layoutGroup.RectTransform, scaleBasis: ScaleBasis.Smallest), style: "PushButton") + { + ToolTip = TextManager.Get("bms.pushicon"), + OnClicked = (btn, userdata) => + { + Util.PushItems(true); + return true; + } + }; + } + } + } + } +} diff --git a/ItemIO BetterMergeStack/CSharp/RunConfig.xml b/ItemIO BetterMergeStack/CSharp/RunConfig.xml new file mode 100644 index 0000000..5796b9a --- /dev/null +++ b/ItemIO BetterMergeStack/CSharp/RunConfig.xml @@ -0,0 +1,5 @@ + + + Standard + Standard + \ No newline at end of file diff --git a/ItemIO BetterMergeStack/LICENSE b/ItemIO BetterMergeStack/LICENSE new file mode 100644 index 0000000..50bc877 --- /dev/null +++ b/ItemIO BetterMergeStack/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Diemoe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ItemIO BetterMergeStack/Text/English.xml b/ItemIO BetterMergeStack/Text/English.xml new file mode 100644 index 0000000..2770bfb --- /dev/null +++ b/ItemIO BetterMergeStack/Text/English.xml @@ -0,0 +1,6 @@ + + + + All transferred to item box + + \ No newline at end of file diff --git a/ItemIO BetterMergeStack/Text/Push.png b/ItemIO BetterMergeStack/Text/Push.png new file mode 100644 index 0000000..5d07484 --- /dev/null +++ b/ItemIO BetterMergeStack/Text/Push.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13e2b051bb4cca27befc98490a5a11745a83726c1a24686f2b842b5efd50427c +size 653 diff --git a/ItemIO BetterMergeStack/Text/SimplifiedChinese.xml b/ItemIO BetterMergeStack/Text/SimplifiedChinese.xml new file mode 100644 index 0000000..17be29c --- /dev/null +++ b/ItemIO BetterMergeStack/Text/SimplifiedChinese.xml @@ -0,0 +1,6 @@ + + + + 全部转移至物品箱 + + \ No newline at end of file diff --git a/ItemIO BetterMergeStack/Text/style.xml b/ItemIO BetterMergeStack/Text/style.xml new file mode 100644 index 0000000..03dceed --- /dev/null +++ b/ItemIO BetterMergeStack/Text/style.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/ItemIO BetterMergeStack/filelist.xml b/ItemIO BetterMergeStack/filelist.xml new file mode 100644 index 0000000..e1f8e02 --- /dev/null +++ b/ItemIO BetterMergeStack/filelist.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Lexi MkV/Lexi MkV.sub b/Lexi MkV/Lexi MkV.sub new file mode 100644 index 0000000..2d38486 --- /dev/null +++ b/Lexi MkV/Lexi MkV.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90d01f0cda51dc835f96df977c27e4c045984263e61124f7a3f42f2c289e8cfa +size 487350 diff --git a/Lexi MkV/Telli MKIII.sub b/Lexi MkV/Telli MKIII.sub new file mode 100644 index 0000000..bed3db6 --- /dev/null +++ b/Lexi MkV/Telli MKIII.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7259993ebc92c993ea0d24d3c36c4729a2da57b99231a98c2cc66d94d8b70595 +size 243961 diff --git a/Lexi MkV/filelist.xml b/Lexi MkV/filelist.xml new file mode 100644 index 0000000..d5990cc --- /dev/null +++ b/Lexi MkV/filelist.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Lua Editor/Item.xml b/Lua Editor/Item.xml new file mode 100644 index 0000000..bd010d7 --- /dev/null +++ b/Lua Editor/Item.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lua Editor/Lua/Autorun/EditGUI.lua b/Lua Editor/Lua/Autorun/EditGUI.lua new file mode 100644 index 0000000..29f55bd --- /dev/null +++ b/Lua Editor/Lua/Autorun/EditGUI.lua @@ -0,0 +1,5869 @@ +EditGUI = {} +EditGUI.Path = ... + +if not File.Exists(EditGUI.Path .. "/settings.json") then + File.Write(EditGUI.Path .. "/settings.json", json.serialize(dofile(EditGUI.Path .. "/Lua/defaultsettings.lua"))) +end +EditGUI.Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) + +if not SERVER then + if not File.Exists(EditGUI.Path .. "/clientsidesettings.json") then + File.Write(EditGUI.Path .. "/clientsidesettings.json", json.serialize(dofile(EditGUI.Path .. "/Lua/defaultclientsidesettings.lua"))) + end + EditGUI.ClientsideSettings = json.parse(File.Read(EditGUI.Path .. "/clientsidesettings.json")) +end + +local network = dofile(EditGUI.Path .. "/Lua/networking.lua") +local findtarget = dofile(EditGUI.Path .. "/Lua/findtarget.lua") + +LinkAdd = function(itemedit1, itemedit2) + itemedit1.AddLinked(itemedit2) + itemedit2.AddLinked(itemedit1) +end + +LinkRemove = function(itemedit1, itemedit2) + itemedit1.RemoveLinked(itemedit2) + itemedit2.RemoveLinked(itemedit1) +end + +if SERVER then + return +end + +local check = true + +local FindClientCharacter = function(character) + for key, value in pairs(Client.ClientList) do + if value.Character == character then + return value + end + end +end + +EditGUI.AddMessage = function(text, client) + message = ChatMessage.Create("Lua Editor", text, ChatMessageType.Default, nil, nil) + message.Color = Color(255, 95, 31) + + if CLIENT then + Game.ChatBox.AddMessage(message) + else + Game.SendDirectChatMessage(message, client) + end +end + + + frame = GUI.Frame(GUI.RectTransform(Vector2(1, 1)), nil) + frame.CanBeFocused = false + + -- Attribute Draw Functions Start -- + local DrawRequiredItems = function(component, key, list, height, relatedItemType, fieldName, optional, msgTag) + optional = optional or false + local relatedItemClass = LuaUserData.CreateStatic("Barotrauma.RelatedItem") + + local requireditemslayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, height), list.Content.RectTransform), nil) + requireditemslayout.isHorizontal = true + requireditemslayout.Stretch = true + requireditemslayout.RelativeSpacing = 0.001 + + local requireditemstextblock = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), requireditemslayout.RectTransform), fieldName, nil, nil, GUI.Alignment.CenterLeft) + local requireditemstext = GUI.TextBox(GUI.RectTransform(Vector2(0.8, 1), requireditemslayout.RectTransform), "") + + local function getRelatedItem() + local relatedItemsTable = component.requiredItems[relatedItemType] + + if relatedItemsTable == nil then + return nil + end + + return relatedItemsTable[1] + end + + local relatedItem = getRelatedItem() + local joinedIdentifiers = "" + if relatedItem ~= nil then + joinedIdentifiers = relatedItem.JoinedIdentifiers + end + requireditemstext.Text = joinedIdentifiers + + requireditemstext.OnTextChangedDelegate = function() + local relatedItem = getRelatedItem() + joinedIdentifiers = requireditemstext.Text + + local shouldRelatedItemExist = joinedIdentifiers ~= "" + local hasRelatedItem = relatedItem ~= nil + + if shouldRelatedItemExist then + if not hasRelatedItem then + local msgAttribute = "" + if msgTag and msgTag:match("^%s*$") == nil then + msgAttribute = " msg=\"" .. msgTag .."\"" + end + local requiredItemSampleData = string.format([[ +]], tostring(relatedItemType), tostring(optional), msgAttribute) + local xml = XDocument.Parse(requiredItemSampleData).Root + local contentXml = ContentXElement(nil, xml) -- package is nil + + relatedItem = relatedItemClass.__new(contentXml, "LuaEditorRequiredItem") + local tempRequiredItems = component.requiredItems + tempRequiredItems[relatedItemType] = {relatedItem} + component.requiredItems = tempRequiredItems + end + relatedItem.JoinedIdentifiers = joinedIdentifiers + else + if hasRelatedItem then + -- component.requiredItems = {} -- delete other types + -- component.requiredItems[relatedItemType] = nil -- doesn't work + local tempRequiredItems = {} + for requiredType, requiredTypeItems in pairs(component.requiredItems) do + if (requiredType ~= relatedItemType) then + tempRequiredItems[requiredType] = requiredTypeItems + end + end + component.requiredItems = tempRequiredItems + relatedItem = nil + end + end + + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key ..".RequiredItems", component.requiredItems, "RequiredItems") + end + end + end + + local DrawPickedRequired = function(component, key, list, height, optional, msgTag) + local relatedItemType = LuaUserData.CreateEnumTable("Barotrauma.RelatedItem+RelationType") + DrawRequiredItems(component, key, list, height, relatedItemType.Picked, "Picked Required", optional, msgTag) + end + + local DrawEquippedRequired = function(component, key, list, height, optional, msgTag) + local relatedItemType = LuaUserData.CreateEnumTable("Barotrauma.RelatedItem+RelationType") + DrawRequiredItems(component, key, list, height, relatedItemType.Equipped, "Equipped Required", optional, msgTag) + end + -- Attribute Draw Functions End -- + -- Main Component Start -- + local MainComponentfunction = function() + + if not menu then + menu = GUI.Frame(GUI.RectTransform(Vector2(0.55, 1.1), frame.RectTransform, GUI.Anchor.CenterRight), nil) + menu.CanBeFocused = false + menu.RectTransform.AbsoluteOffset = Point(0, -40) + + menuContent = GUI.Frame(GUI.RectTransform(Vector2(0.45, 0.6), menu.RectTransform, GUI.Anchor.CenterRight)) + end + + menuList = GUI.ListBox(GUI.RectTransform(Vector2(0.93, 0.7), menuContent.RectTransform, GUI.Anchor.Center)) + menuList.RectTransform.AbsoluteOffset = Point(0, -17) + + itemList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + itemname = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), itemList.Content.RectTransform), "None", nil, nil, GUI.Alignment.Center) + itemname.TextColor = Color((255), (153), (153)) + itemname.TextScale = 1.3 + + if EditGUI.Settings.spritedepth == true then + local spritedepthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + spritedepthlayout.isHorizontal = true + spritedepthlayout.Stretch = true + spritedepthlayout.RelativeSpacing = 0.001 + + local spritedepthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), spritedepthlayout.RectTransform), "Sprite Depth", nil, nil, GUI.Alignment.CenterLeft) + + spritedepth = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), spritedepthlayout.RectTransform), NumberType.Float) + spritedepth.DecimalsToDisplay = 3 + spritedepth.MinValueFloat = 0.001 + spritedepth.MaxValueFloat = 0.999 + spritedepth.valueStep = 0.1 + if itemedit then + spritedepth.FloatValue = itemedit.SpriteDepth + end + spritedepth.OnValueChanged = function () + if itemedit then + itemedit.SpriteDepth = spritedepth.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "SpriteDepth", itemedit.SpriteDepth) + end + end + end + end + + if EditGUI.Settings.rotation == true and targeting == "items" then + local rotationlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + rotationlayout.isHorizontal = true + rotationlayout.Stretch = true + rotationlayout.RelativeSpacing = 0.001 + + local rotationtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), rotationlayout.RectTransform), "Rotation", nil, nil, GUI.Alignment.CenterLeft) + + rotation = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), rotationlayout.RectTransform), NumberType.Int) + rotation.MinValueInt = 0 + rotation.MaxValueInt = 360 + rotation.valueStep = 10 + if itemedit then + rotation.IntValue = itemedit.Rotation + end + rotation.OnValueChanged = function () + if itemedit then + itemedit.Rotation = rotation.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Rotation", itemedit.Rotation) + end + end + end + end + + if EditGUI.Settings.scale == true and targeting == "items" then + local scalelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + scalelayout.isHorizontal = true + scalelayout.Stretch = true + scalelayout.RelativeSpacing = 0.001 + + local scaletext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), scalelayout.RectTransform), "Scale", nil, nil, GUI.Alignment.CenterLeft) + + scale = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), scalelayout.RectTransform), NumberType.Float) + scale.DecimalsToDisplay = 3 + scale.valueStep = 0.1 + scale.MinValueFloat = EditGUI.Settings.scalemin + scale.MaxValueFloat = EditGUI.Settings.scalemax + if itemedit then + scale.FloatValue = itemedit.Scale + end + scale.OnValueChanged = function () + if itemedit and scale.FloatValue <= scale.MaxValueFloat and scale.FloatValue >= scale.MinValueFloat then + itemedit.Scale = scale.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Scale", itemedit.Scale) + end + end + end + end + + if targeting ~= "items" then + local rectwidthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + rectwidthlayout.isHorizontal = true + rectwidthlayout.Stretch = true + rectwidthlayout.RelativeSpacing = 0.001 + + local rectwithtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), rectwidthlayout.RectTransform), "Width", nil, nil, GUI.Alignment.CenterLeft) + + rectwidth = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), rectwidthlayout.RectTransform), NumberType.Float) + rectwidth.DecimalsToDisplay = 3 + rectwidth.valueStep = 0.1 + if itemedit then + rectwidth.FloatValue = itemedit.RectWidth + end + rectwidth.OnValueChanged = function () + if itemedit then + itemedit.RectWidth = rectwidth.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "RectWidth", rectwidth.FloatValue) + end + end + end + end + + if targeting ~= "items" then + local rectheightlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + rectheightlayout.isHorizontal = true + rectheightlayout.Stretch = true + rectheightlayout.RelativeSpacing = 0.001 + + local rectheighttext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), rectheightlayout.RectTransform), "Height", nil, nil, GUI.Alignment.CenterLeft) + + rectheight = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), rectheightlayout.RectTransform), NumberType.Float) + rectheight.DecimalsToDisplay = 3 + rectheight.valueStep = 0.1 + if itemedit then + rectheight.FloatValue = itemedit.RectHeight + end + rectheight.OnValueChanged = function () + if itemedit then + itemedit.RectHeight = rectheight.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "RectHeight", rectheight.FloatValue) + end + end + end + end + + if EditGUI.Settings.condition == true and targeting == "items" then + local conditionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + conditionlayout.isHorizontal = true + conditionlayout.Stretch = true + conditionlayout.RelativeSpacing = 0.001 + + + local conditiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), conditionlayout.RectTransform), "Condition", nil, nil, GUI.Alignment.CenterLeft) + + condition = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), conditionlayout.RectTransform), NumberType.Float) + condition.MinValueFloat = 0 + condition.MaxValueFloat = 100 + condition.valueStep = 1 + if itemedit then + condition.FloatValue = itemedit.Condition + end + condition.OnValueChanged = function () + if itemedit then + itemedit.Condition = condition.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Condition", condition.FloatValue) + end + end + end + end + + if EditGUI.Settings.spritecolor == true and targeting == "items" or targeting == "walls" then + local colorlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), itemList.Content.RectTransform), nil) + colorlayout.isHorizontal = true + colorlayout.Stretch = true + colorlayout.RelativeSpacing = 0.01 + + local spritecolortext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), colorlayout.RectTransform), "Sprite Color", nil, nil, GUI.Alignment.CenterLeft) + + local redtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "R", nil, nil, GUI.Alignment.Center) + red = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + local greentext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "G", nil, nil, GUI.Alignment.Center) + green = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + local bluetext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "B", nil, nil, GUI.Alignment.Center) + blue = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + + red.MinValueInt = 0 + red.MaxValueInt = 255 + if itemedit then + red.IntValue = itemedit.SpriteColor.R + end + green.MinValueInt = 0 + green.MaxValueInt = 255 + if itemedit then + green.IntValue = itemedit.SpriteColor.G + end + blue.MinValueInt = 0 + blue.MaxValueInt = 255 + if itemedit then + blue.IntValue = itemedit.SpriteColor.B + end + + if EditGUI.Settings.alpha == true then + local alphatext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "A", nil, nil, GUI.Alignment.Center) + + alpha = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + alpha.MinValueInt = 0 + alpha.MaxValueInt = 255 + if itemedit then + alpha.IntValue = itemedit.SpriteColor.A + end + alpha.OnValueChanged = function () + if itemedit and alpha.IntValue <= 255 and alpha.IntValue >= 0 then + itemedit.SpriteColor = Color(itemedit.SpriteColor.r, itemedit.SpriteColor.g, itemedit.SpriteColor.b, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "SpriteColor", itemedit.SpriteColor, "Color") + end + end + end + end + + red.OnValueChanged = function () + if itemedit and red.IntValue <= 255 and red.IntValue >= 0 then + itemedit.SpriteColor = Color(red.IntValue, itemedit.SpriteColor.g, itemedit.SpriteColor.b, itemedit.SpriteColor.a) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "SpriteColor", itemedit.SpriteColor, "Color") + end + end + end + green.OnValueChanged = function () + if itemedit and green.IntValue <= 255 and green.IntValue >= 0 then + itemedit.SpriteColor = Color(itemedit.SpriteColor.r, green.IntValue, itemedit.SpriteColor.b, itemedit.SpriteColor.a) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "SpriteColor", itemedit.SpriteColor, "Color") + end + end + end + blue.OnValueChanged = function () + if itemedit and blue.IntValue <= 255 and blue.IntValue >= 0 then + itemedit.SpriteColor = Color(itemedit.SpriteColor.r, itemedit.SpriteColor.g, blue.IntValue, itemedit.SpriteColor.a) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "SpriteColor", itemedit.SpriteColor, "Color") + end + end + end + end + + if EditGUI.Settings.tags == true and targeting == "items" then + local tagslayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + tagslayout.isHorizontal = true + tagslayout.Stretch = true + tagslayout.RelativeSpacing = 0.001 + + local tagstextblock = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), tagslayout.RectTransform), "Tags", nil, nil, GUI.Alignment.CenterLeft) + + tagstext = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), tagslayout.RectTransform), "") + if itemedit then + tagstext.Text = itemedit.Tags + end + tagstext.OnTextChangedDelegate = function() + if itemedit then + itemedit.Tags = tagstext.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Tags", itemedit.Tags) + end + end + end + end + + if EditGUI.Settings.description == true and targeting == "items" then + local descriptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), itemList.Content.RectTransform), nil) + descriptionlayout.isHorizontal = true + descriptionlayout.Stretch = true + descriptionlayout.RelativeSpacing = 0.001 + + local descriptiontextblock = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), descriptionlayout.RectTransform), "Description", nil, nil, GUI.Alignment.CenterLeft) + + descriptiontext = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 0.1), descriptionlayout.RectTransform), "") + if itemedit then + descriptiontext.Text = itemedit.Description + end + descriptiontext.OnTextChangedDelegate = function() + if itemedit then + itemedit.Description = descriptiontext.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Description", itemedit.Description) + end + end + end + end + + if EditGUI.Settings.noninteractable == true and targeting == "items" then + noninteractable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), itemList.Content.RectTransform), "Non Interactable") + if itemedit then + noninteractable.Selected = itemedit.NonInteractable + end + noninteractable.OnSelected = function() + if itemedit then + itemedit.NonInteractable = noninteractable.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "NonInteractable", itemedit.NonInteractable) + end + end + end + end + + if EditGUI.Settings.nonplayerteaminteractable == true and targeting == "items" then + nonplayerteaminteractable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), itemList.Content.RectTransform), "Non-Player Team Interactable") + if itemedit then + nonplayerteaminteractable.Selected = itemedit.NonPlayerTeamInteractable + end + nonplayerteaminteractable.OnSelected = function() + if itemedit then + itemedit.NonPlayerTeamInteractable = nonplayerteaminteractable.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "NonPlayerTeamInteractable", itemedit.NonPlayerTeamInteractable) + end + end + end + end + + if EditGUI.Settings.invulnerabletodamage == true and targeting == "items" then + invulnerabletodamage = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), itemList.Content.RectTransform), "Invulnerable to Damage") + if itemedit then + invulnerabletodamage.Selected = itemedit.InvulnerableToDamage + end + invulnerabletodamage.OnSelected = function() + if itemedit then + itemedit.InvulnerableToDamage = invulnerabletodamage.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "InvulnerableToDamage", itemedit.InvulnerableToDamage) + end + end + end + end + + if EditGUI.Settings.displaysidebysidewhenlinked == true and targeting == "items" then + displaysidebysidewhenlinked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), itemList.Content.RectTransform), "Display Side By Side When Linked") + if itemedit then + displaysidebysidewhenlinked.Selected = itemedit.DisplaySideBySideWhenLinked + end + displaysidebysidewhenlinked.OnSelected = function() + if itemedit then + itemedit.DisplaySideBySideWhenLinked = displaysidebysidewhenlinked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "DisplaySideBySideWhenLinked", itemedit.DisplaySideBySideWhenLinked) + end + end + end + end + + if EditGUI.Settings.hiddeningame == true and targeting == "items" then + hiddeningame = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), itemList.Content.RectTransform), "Hidden In Game") + if itemedit then + hiddeningame.Selected = itemedit.HiddenInGame + end + hiddeningame.OnSelected = function() + if itemedit then + itemedit.HiddenInGame = hiddeningame.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "HiddenInGame", itemedit.HiddenInGame) + end + end + end + end + + if EditGUI.Settings.mirror == true then + local mirrorlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.04), itemList.Content.RectTransform), nil) + mirrorlayout.isHorizontal = true + mirrorlayout.RelativeSpacing = 0.002 + + local mirrorButtonx = GUI.Button(GUI.RectTransform(Vector2(0.499, 0.2), mirrorlayout.RectTransform), "Mirror X", nil, "GUIButtonSmall") + mirrorButtonx.OnClicked = function() + if itemedit then + if CLIENT and Game.IsMultiplayer then + mirrorx = Networking.Start("flipxnetwork") + mirrorx.WriteUInt16(UShort(itemedit.ID)) + Networking.Send(mirrorx) + else + itemedit.FlipX(false) + end + end + end + + local mirrorButtony = GUI.Button(GUI.RectTransform(Vector2(0.499, 0.2), mirrorlayout.RectTransform), "Mirror Y", nil, "GUIButtonSmall") + mirrorButtony.OnClicked = function() + if itemedit then + if CLIENT and Game.IsMultiplayer then + mirrory = Networking.Start("flipynetwork") + mirrory.WriteUInt16(UShort(itemedit.ID)) + Networking.Send(mirrory) + else + itemedit.FlipY(false) + end + end + end + end + + end + -- Main Component End -- + -- LightComponent Component Start -- + local LightComponentfunction = function(component, key) + + if EditGUI.Settings.lightcomponent == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 1.2), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.07), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local rangelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + rangelayout.isHorizontal = true + rangelayout.Stretch = true + rangelayout.RelativeSpacing = 0.001 + + local rangetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), rangelayout.RectTransform), "Range", nil, nil, GUI.Alignment.CenterLeft) + + local range = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), rangelayout.RectTransform), NumberType.Float) + range.FloatValue = component.Range + range.MinValueFloat = 0 + range.MaxValueFloat = 2048 + range.valueStep = 10 + range.OnValueChanged = function() + component.Range = range.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Range", component.Range) + end + end + + local flickerlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + flickerlayout.isHorizontal = true + flickerlayout.Stretch = true + flickerlayout.RelativeSpacing = 0.001 + + local flickertext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), flickerlayout.RectTransform), "Flicker", nil, nil, GUI.Alignment.CenterLeft) + + local flicker = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), flickerlayout.RectTransform), NumberType.Float) + flicker.FloatValue = component.Flicker + flicker.OnValueChanged = function() + component.Flicker = flicker.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Flicker", component.Flicker) + end + end + + local flickerspeedlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + flickerspeedlayout.isHorizontal = true + flickerspeedlayout.Stretch = true + flickerspeedlayout.RelativeSpacing = 0.001 + + local flickerspeedtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), flickerspeedlayout.RectTransform), "Flicker Speed", nil, nil, GUI.Alignment.CenterLeft) + + local flickerspeed = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), flickerspeedlayout.RectTransform), NumberType.Float) + flickerspeed.FloatValue = component.FlickerSpeed + flickerspeed.OnValueChanged = function() + component.FlickerSpeed = flickerspeed.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FlickerSpeed", component.FlickerSpeed) + end + end + + local pulsefrequencylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + pulsefrequencylayout.isHorizontal = true + pulsefrequencylayout.Stretch = true + pulsefrequencylayout.RelativeSpacing = 0.001 + + local pulsefrequencytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pulsefrequencylayout.RectTransform), "Pulse Frequency", nil, nil, GUI.Alignment.CenterLeft) + + local pulsefrequency = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pulsefrequencylayout.RectTransform), NumberType.Float) + pulsefrequency.FloatValue = component.PulseFrequency + pulsefrequency.OnValueChanged = function() + component.PulseFrequency = pulsefrequency.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PulseFrequency", component.PulseFrequency) + end + end + + local pulseamountlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + pulseamountlayout.isHorizontal = true + pulseamountlayout.Stretch = true + pulseamountlayout.RelativeSpacing = 0.001 + + local pulseamounttext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pulseamountlayout.RectTransform), "Pulse Amount", nil, nil, GUI.Alignment.CenterLeft) + + local pulseamount = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pulseamountlayout.RectTransform), NumberType.Float) + pulseamount.DecimalsToDisplay = 2 + pulseamount.FloatValue = component.PulseAmount + pulseamount.MinValueFloat = 0 + pulseamount.MaxValueFloat = 1 + pulseamount.valueStep = 0.1 + pulseamount.OnValueChanged = function() + component.PulseAmount = pulseamount.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PulseAmount", component.PulseAmount) + end + end + + local blinkfrequencylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + blinkfrequencylayout.isHorizontal = true + blinkfrequencylayout.Stretch = true + blinkfrequencylayout.RelativeSpacing = 0.001 + + local blinkfrequencytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), blinkfrequencylayout.RectTransform), "Blink Frequency", nil, nil, GUI.Alignment.CenterLeft) + + local blinkfrequency = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), blinkfrequencylayout.RectTransform), NumberType.Float) + blinkfrequency.FloatValue = component.BlinkFrequency + blinkfrequency.OnValueChanged = function() + component.BlinkFrequency = blinkfrequency.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".BlinkFrequency", component.BlinkFrequency) + end + end + + local colorlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + colorlayout.isHorizontal = true + colorlayout.Stretch = true + colorlayout.RelativeSpacing = 0.01 + + local colortext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), colorlayout.RectTransform), "Color", nil, nil, GUI.Alignment.CenterLeft) + + local redtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "R", nil, nil, GUI.Alignment.Center) + + local red = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + red.IntValue = component.lightColor.R + red.MinValueInt = 0 + red.MaxValueInt = 255 + + local greentext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "G", nil, nil, GUI.Alignment.Center) + + local green = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + green.IntValue = component.lightColor.G + green.MinValueInt = 0 + green.MaxValueInt = 255 + + local bluetext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "B", nil, nil, GUI.Alignment.Center) + + local blue = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + blue.IntValue = component.lightColor.B + blue.MinValueInt = 0 + blue.MaxValueInt = 255 + + local alphatext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "A", nil, nil, GUI.Alignment.Center) + + local alpha = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + alpha.IntValue = component.lightColor.A + alpha.MinValueInt = 0 + alpha.MaxValueInt = 255 + + red.OnValueChanged = function () + if red.IntValue <= 255 then + component.lightColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".lightColor", component.lightColor, "Color") + end + end + end + green.OnValueChanged = function () + if green.IntValue <= 255 then + component.lightColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".lightColor", component.lightColor, "Color") + end + end + end + blue.OnValueChanged = function () + if blue.IntValue <= 255 then + component.lightColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".lightColor", component.lightColor, "Color") + end + end + end + alpha.OnValueChanged = function () + if alpha.IntValue <= 255 then + component.lightColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".lightColor", component.lightColor, "Color") + end + end + end + + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.055), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local castshadows = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Cast Shadows") + castshadows.Selected = component.CastShadows + castshadows.OnSelected = function() + component.CastShadows = castshadows.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CastShadows", component.CastShadows) + end + end + + local drawbehindsubs = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Draw Behind Subs") + drawbehindsubs.Selected = component.DrawBehindSubs + drawbehindsubs.OnSelected = function() + component.DrawBehindSubs = drawbehindsubs.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".DrawBehindSubs", component.DrawBehindSubs) + end + end + + local ison = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Is On") + ison.Selected = component.IsOn + ison.OnSelected = function() + component.IsOn = ison.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".IsOn", component.IsOn) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.05), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- LightComponent Component End -- + -- Holdable Component Start -- + local Holdablefunction = function(component, key) + + if EditGUI.Settings.holdable == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.46), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local spritedepthwhendroppedlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + spritedepthwhendroppedlayout.isHorizontal = true + spritedepthwhendroppedlayout.Stretch = true + spritedepthwhendroppedlayout.RelativeSpacing = 0.001 + + local spritedepthwhendroppedtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), spritedepthwhendroppedlayout.RectTransform), "Sprite Depth", nil, nil, GUI.Alignment.CenterLeft) + + local spritedepthwhendropped = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), spritedepthwhendroppedlayout.RectTransform), NumberType.Float) + spritedepthwhendropped.DecimalsToDisplay = 3 + spritedepthwhendropped.FloatValue = component.SpriteDepthWhenDropped + spritedepthwhendropped.MinValueFloat = 0.001 + spritedepthwhendropped.MaxValueFloat = 0.999 + spritedepthwhendropped.valueStep = 0.1 + spritedepthwhendropped.OnValueChanged = function () + component.SpriteDepthWhenDropped = spritedepthwhendropped.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".SpriteDepthWhenDropped", component.SpriteDepthWhenDropped) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Holdable Component End -- + -- Connection Panel Component Start -- + local ConnectionPanelfunction = function(component, key) + + if EditGUI.Settings.connectionpanel == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.48), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + DrawEquippedRequired(component, key, List, 0.12, false) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.12), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local locked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Locked") + locked.Selected = component.Locked + locked.OnSelected = function() + component.Locked = locked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Locked", component.Locked) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.155), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Connection Panel Component End -- + -- Fabricator Component Start -- + local Fabricatorfunction = function(component, key) + + if EditGUI.Settings.fabricator == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.58), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.12), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.12), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.12), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.105), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Fabricator Component End -- + -- Deconstructor Component Start -- + local Deconstructorfunction = function(component, key) + + if EditGUI.Settings.deconstructor == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.66), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local deconstructionspeedlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + deconstructionspeedlayout.isHorizontal = true + deconstructionspeedlayout.Stretch = true + deconstructionspeedlayout.RelativeSpacing = 0.001 + + local deconstructionspeedtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), deconstructionspeedlayout.RectTransform), "Deconstruction Speed", nil, nil, GUI.Alignment.CenterLeft) + + local deconstructionspeed = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), deconstructionspeedlayout.RectTransform), NumberType.Float) + deconstructionspeed.FloatValue = component.DeconstructionSpeed + deconstructionspeed.OnValueChanged = function() + component.DeconstructionSpeed = deconstructionspeed.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".DeconstructionSpeed", component.DeconstructionSpeed) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Deconstructor Component End -- + -- Reactor Component Start -- + local Reactorfunction = function(component, key) + + if EditGUI.Settings.reactor == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.925), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxpoweroutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + maxpoweroutputlayout.isHorizontal = true + maxpoweroutputlayout.Stretch = true + maxpoweroutputlayout.RelativeSpacing = 0.001 + + local maxpoweroutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxpoweroutputlayout.RectTransform), "Max Power Output", nil, nil, GUI.Alignment.CenterLeft) + + local maxpoweroutput = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxpoweroutputlayout.RectTransform), NumberType.Float) + maxpoweroutput.FloatValue = component.MaxPowerOutput + maxpoweroutput.OnValueChanged = function() + component.MaxPowerOutput = maxpoweroutput.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxPowerOutput", component.MaxPowerOutput) + end + end + + local meltdowndelaylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + meltdowndelaylayout.isHorizontal = true + meltdowndelaylayout.Stretch = true + meltdowndelaylayout.RelativeSpacing = 0.001 + + local meltdowndelaytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), meltdowndelaylayout.RectTransform), "Meltdown Delay", nil, nil, GUI.Alignment.CenterLeft) + + local meltdowndelay = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), meltdowndelaylayout.RectTransform), NumberType.Float) + meltdowndelay.FloatValue = component.MeltdownDelay + meltdowndelay.OnValueChanged = function() + component.MeltdownDelay = meltdowndelay.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MeltdownDelay", component.MeltdownDelay) + end + end + + local firedelaylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + firedelaylayout.isHorizontal = true + firedelaylayout.Stretch = true + firedelaylayout.RelativeSpacing = 0.001 + + local firedelaytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), firedelaylayout.RectTransform), "Fire Delay", nil, nil, GUI.Alignment.CenterLeft) + + local firedelay = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), firedelaylayout.RectTransform), NumberType.Float) + firedelay.FloatValue = component.FireDelay + firedelay.OnValueChanged = function() + component.FireDelay = firedelay.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FireDelay", component.FireDelay) + end + end + + local fuelconsumptionratelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + fuelconsumptionratelayout.isHorizontal = true + fuelconsumptionratelayout.Stretch = true + fuelconsumptionratelayout.RelativeSpacing = 0.001 + + local fuelconsumptionratetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), fuelconsumptionratelayout.RectTransform), "Fuel Consumption Rate", nil, nil, GUI.Alignment.CenterLeft) + + local fuelconsumptionrate = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), fuelconsumptionratelayout.RectTransform), NumberType.Float) + fuelconsumptionrate.FloatValue = component.FuelConsumptionRate + fuelconsumptionrate.OnValueChanged = function() + component.FuelConsumptionRate = fuelconsumptionrate.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FuelConsumptionRate", component.FuelConsumptionRate) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local explosiondamagesothersubs = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Explosion Damages Other Subs") + explosiondamagesothersubs.Selected = component.ExplosionDamagesOtherSubs + explosiondamagesothersubs.OnSelected = function() + component.ExplosionDamagesOtherSubs = explosiondamagesothersubs.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ExplosionDamagesOtherSubs", component.ExplosionDamagesOtherSubs) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.075), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Reactor Component End -- + -- OxygenGenerator Component Start -- + local OxygenGeneratorfunction = function(component, key) + + if EditGUI.Settings.oxygengenerator == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.66), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local generatedamountlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + generatedamountlayout.isHorizontal = true + generatedamountlayout.Stretch = true + generatedamountlayout.RelativeSpacing = 0.001 + + local generatedamounttext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), generatedamountlayout.RectTransform), "Generated Amount", nil, nil, GUI.Alignment.CenterLeft) + + local generatedamount = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), generatedamountlayout.RectTransform), NumberType.Float) + generatedamount.FloatValue = component.GeneratedAmount + generatedamount.OnValueChanged = function() + component.GeneratedAmount = generatedamount.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".GeneratedAmount", component.GeneratedAmount) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- OxygenGenerator Component End -- + -- Sonar Component Start -- + local Sonarfunction = function(component, key) + + if EditGUI.Settings.sonar == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.78), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local usetransdusers = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Use Transdusers") + usetransdusers.Selected = component.UseTransducers + usetransdusers.OnSelected = function() + component.UseTransducers = usetransdusers.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".UseTransducers", component.UseTransducers) + end + end + + local centerontransducers = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Center On Transdusers") + centerontransducers.Selected = component.CenterOnTransducers + centerontransducers.OnSelected = function() + component.CenterOnTransducers = centerontransducers.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CenterOnTransducers", component.CenterOnTransducers) + end + end + + local hasmineralscanner = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Has Mineral Scanner") + hasmineralscanner.Selected = component.HasMineralScanner + hasmineralscanner.OnSelected = function() + component.HasMineralScanner = hasmineralscanner.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".HasMineralScanner", component.HasMineralScanner) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.088), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Sonar Component End -- + -- Repairable Component Start -- + local Repairablefunction = function(component, key) + + if EditGUI.Settings.repairable == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.85), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.115), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + DrawEquippedRequired(component, key, List, 0.08, false) + + local deteriorationspeedlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + deteriorationspeedlayout.isHorizontal = true + deteriorationspeedlayout.Stretch = true + deteriorationspeedlayout.RelativeSpacing = 0.001 + + local deteriorationspeedtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), deteriorationspeedlayout.RectTransform), "Deterioration Speed", nil, nil, GUI.Alignment.CenterLeft) + + local deteriorationspeed = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), deteriorationspeedlayout.RectTransform), NumberType.Float) + deteriorationspeed.FloatValue = component.DeteriorationSpeed + deteriorationspeed.MinValueFloat = 0 + deteriorationspeed.MaxValueFloat = 100 + deteriorationspeed.valueStep = 1 + deteriorationspeed.OnValueChanged = function () + component.DeteriorationSpeed = deteriorationspeed.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".DeteriorationSpeed", component.DeteriorationSpeed) + end + end + + local mindeteriorationdelaylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + mindeteriorationdelaylayout.isHorizontal = true + mindeteriorationdelaylayout.Stretch = true + mindeteriorationdelaylayout.RelativeSpacing = 0.001 + + local mindeteriorationdelaytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), mindeteriorationdelaylayout.RectTransform), "Min Deterioration Delay", nil, nil, GUI.Alignment.CenterLeft) + + local mindeteriorationdelay = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), mindeteriorationdelaylayout.RectTransform), NumberType.Float) + mindeteriorationdelay.DecimalsToDisplay = 2 + mindeteriorationdelay.FloatValue = component.MinDeteriorationDelay + mindeteriorationdelay.MinValueFloat = 0 + mindeteriorationdelay.MaxValueFloat = 1000 + mindeteriorationdelay.valueStep = 10 + mindeteriorationdelay.OnValueChanged = function () + component.MinDeteriorationDelay = mindeteriorationdelay.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinDeteriorationDelay", component.MinDeteriorationDelay) + end + end + + local maxdeteriorationdelaylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + maxdeteriorationdelaylayout.isHorizontal = true + maxdeteriorationdelaylayout.Stretch = true + maxdeteriorationdelaylayout.RelativeSpacing = 0.001 + + local maxdeteriorationdelaytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxdeteriorationdelaylayout.RectTransform), "Max Deterioration Delay", nil, nil, GUI.Alignment.CenterLeft) + + local maxdeteriorationdelay = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), maxdeteriorationdelaylayout.RectTransform), NumberType.Float) + maxdeteriorationdelay.DecimalsToDisplay = 2 + maxdeteriorationdelay.FloatValue = component.MaxDeteriorationDelay + maxdeteriorationdelay.MinValueFloat = 0 + maxdeteriorationdelay.MaxValueFloat = 1000 + maxdeteriorationdelay.valueStep = 10 + maxdeteriorationdelay.OnValueChanged = function () + component.MaxDeteriorationDelay = maxdeteriorationdelay.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxDeteriorationDelay", component.MaxDeteriorationDelay) + end + end + + local mindeteriorationconditionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + mindeteriorationconditionlayout.isHorizontal = true + mindeteriorationconditionlayout.Stretch = true + mindeteriorationconditionlayout.RelativeSpacing = 0.001 + + local mindeteriorationconditiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), mindeteriorationconditionlayout.RectTransform), "Min Deterioration Condition", nil, nil, GUI.Alignment.CenterLeft) + + local mindeteriorationcondition = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), mindeteriorationconditionlayout.RectTransform), NumberType.Float) + mindeteriorationcondition.FloatValue = component.MinDeteriorationCondition + mindeteriorationcondition.MinValueFloat = 0 + mindeteriorationcondition.MaxValueFloat = 100 + mindeteriorationcondition.valueStep = 1 + mindeteriorationcondition.OnValueChanged = function () + component.MinDeteriorationCondition = mindeteriorationcondition.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinDeteriorationCondition", component.MinDeteriorationCondition) + end + end + + local repairthresholdlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + repairthresholdlayout.isHorizontal = true + repairthresholdlayout.Stretch = true + repairthresholdlayout.RelativeSpacing = 0.001 + + local repairthresholdtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), repairthresholdlayout.RectTransform), "Repair Threshold", nil, nil, GUI.Alignment.CenterLeft) + + local repairthreshold = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), repairthresholdlayout.RectTransform), NumberType.Float) + repairthreshold.FloatValue = component.RepairThreshold + repairthreshold.MinValueFloat = 0 + repairthreshold.MaxValueFloat = 100 + repairthreshold.valueStep = 1 + repairthreshold.OnValueChanged = function () + component.RepairThreshold = repairthreshold.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".RepairThreshold", component.RepairThreshold) + end + end + + local fixdurationlowskilllayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + fixdurationlowskilllayout.isHorizontal = true + fixdurationlowskilllayout.Stretch = true + fixdurationlowskilllayout.RelativeSpacing = 0.001 + + local fixdurationlowskilltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), fixdurationlowskilllayout.RectTransform), "Fix Duration Low Skill", nil, nil, GUI.Alignment.CenterLeft) + + local fixdurationlowskill = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), fixdurationlowskilllayout.RectTransform), NumberType.Float) + fixdurationlowskill.FloatValue = component.FixDurationLowSkill + fixdurationlowskill.MinValueFloat = 0 + fixdurationlowskill.MaxValueFloat = 100 + fixdurationlowskill.valueStep = 1 + fixdurationlowskill.OnValueChanged = function () + component.FixDurationLowSkill = fixdurationlowskill.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FixDurationLowSkill", component.FixDurationLowSkill) + end + end + + local fixdurationhighskilllayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + fixdurationhighskilllayout.isHorizontal = true + fixdurationhighskilllayout.Stretch = true + fixdurationhighskilllayout.RelativeSpacing = 0.001 + + local fixdurationhighskilltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), fixdurationhighskilllayout.RectTransform), "Fix Duration High Skill", nil, nil, GUI.Alignment.CenterLeft) + + local fixdurationhighskill = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), fixdurationhighskilllayout.RectTransform), NumberType.Float) + fixdurationhighskill.FloatValue = component.FixDurationHighSkill + fixdurationhighskill.MinValueFloat = 0 + fixdurationhighskill.MaxValueFloat = 100 + fixdurationhighskill.valueStep = 1 + fixdurationhighskill.OnValueChanged = function () + component.FixDurationHighSkill = fixdurationhighskill.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FixDurationHighSkill", component.FixDurationHighSkill) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Repairable Component End -- + -- Power Transfer Component Start -- + local PowerTransferfunction = function(component, key) + + if EditGUI.Settings.powertransfer == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.66), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local overloadvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + overloadvoltagelayout.isHorizontal = true + overloadvoltagelayout.Stretch = true + overloadvoltagelayout.RelativeSpacing = 0.001 + + local overloadvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), overloadvoltagelayout.RectTransform), "Overload Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local overloadvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), overloadvoltagelayout.RectTransform), NumberType.Float) + overloadvoltage.FloatValue = component.OverloadVoltage + overloadvoltage.OnValueChanged = function() + component.OverloadVoltage = overloadvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".OverloadVoltage", component.OverloadVoltage) + end + end + + local fireprobabilitylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + fireprobabilitylayout.isHorizontal = true + fireprobabilitylayout.Stretch = true + fireprobabilitylayout.RelativeSpacing = 0.001 + + local fireprobabilitytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), fireprobabilitylayout.RectTransform), "Fire Probability", nil, nil, GUI.Alignment.CenterLeft) + + local fireprobability = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), fireprobabilitylayout.RectTransform), NumberType.Float) + fireprobability.MinValueFloat = 0 + fireprobability.MaxValueFloat = 1 + fireprobability.valueStep = 0.1 + fireprobability.FloatValue = component.FireProbability + fireprobability.OnValueChanged = function() + component.FireProbability = fireprobability.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FireProbability", component.FireProbability) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbeoverloaded = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Overloaded") + canbeoverloaded.Selected = component.CanBeOverloaded + canbeoverloaded.OnSelected = function() + component.CanBeOverloaded = canbeoverloaded.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBeOverloaded", component.CanBeOverloaded) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Power Transfer Component End -- + -- Item Container Component Start -- + local ItemContainerfunction = function(component, key) + + if EditGUI.Settings.itemcontainer == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.6), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + DrawPickedRequired(component, key, List, 0.18, false, "ItemMsgUnauthorizedAccess") + + local containablerestrictionslayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + containablerestrictionslayout.isHorizontal = true + containablerestrictionslayout.Stretch = true + containablerestrictionslayout.RelativeSpacing = 0.001 + + local containablerestrictionstext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), containablerestrictionslayout.RectTransform), "Containable Tags", nil, nil, GUI.Alignment.CenterLeft) + + local containablerestrictions = GUI.TextBox(GUI.RectTransform(Vector2(0.8, 1), containablerestrictionslayout.RectTransform), "") + containablerestrictions.text = component.ContainableRestrictions + containablerestrictions.OnTextChangedDelegate = function() + component.ContainableRestrictions = containablerestrictions.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ContainableRestrictions", component.ContainableRestrictions) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.6), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Item Container Component End -- + -- Door Component Start -- + local Doorfunction = function(component, key) + if EditGUI.Settings.door == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.5), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.172), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + DrawPickedRequired(component, key, List, 0.138, true, "ItemMsgUnauthorizedAccess") + DrawEquippedRequired(component, key, List, 0.138, true) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.138), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.138), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.138), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.138), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Door Component End -- + -- Label Component Start -- + local ItemLabelfunction = function(component, key) + + if EditGUI.Settings.itemlabel == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.65), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.15), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local textlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + textlayout.isHorizontal = true + textlayout.Stretch = true + textlayout.RelativeSpacing = 0.001 + + local texttext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), textlayout.RectTransform), "Text", nil, nil, GUI.Alignment.CenterLeft) + + local text = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), textlayout.RectTransform), "") + text.Text = component.Text + text.OnTextChangedDelegate = function() + component.Text = text.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Text", component.Text) + end + end + + local textscalelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + textscalelayout.isHorizontal = true + textscalelayout.Stretch = true + textscalelayout.RelativeSpacing = 0.001 + + local textscaletext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), textscalelayout.RectTransform), "Text Scale", nil, nil, GUI.Alignment.CenterLeft) + + local textscale = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), textscalelayout.RectTransform), NumberType.Float) + textscale.FloatValue = component.TextScale + textscale.OnValueChanged = function() + component.TextScale = textscale.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TextScale", component.TextScale) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local colorlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.125), List.Content.RectTransform), nil) + colorlayout.isHorizontal = true + colorlayout.Stretch = true + colorlayout.RelativeSpacing = 0.01 + + local colortext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), colorlayout.RectTransform), "Color", nil, nil, GUI.Alignment.CenterLeft) + + local redtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "R", nil, nil, GUI.Alignment.Center) + + local red = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + red.IntValue = component.TextColor.R + red.MinValueInt = 0 + red.MaxValueInt = 255 + + local greentext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "G", nil, nil, GUI.Alignment.Center) + + local green = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + green.IntValue = component.TextColor.G + green.MinValueInt = 0 + green.MaxValueInt = 255 + + local bluetext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "B", nil, nil, GUI.Alignment.Center) + + local blue = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + blue.IntValue = component.TextColor.B + blue.MinValueInt = 0 + blue.MaxValueInt = 255 + + local alphatext = GUI.TextBlock(GUI.RectTransform(Vector2(0.1, 1), colorlayout.RectTransform), "A", nil, nil, GUI.Alignment.Center) + + local alpha = GUI.NumberInput(GUI.RectTransform(Vector2(0.4, 1), colorlayout.RectTransform), NumberType.Int) + alpha.IntValue = component.TextColor.A + alpha.MinValueInt = 0 + alpha.MaxValueInt = 255 + + red.OnValueChanged = function () + if red.IntValue <= 255 then + component.TextColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TextColor", component.TextColor, "Color") + end + end + end + green.OnValueChanged = function () + if green.IntValue <= 255 then + component.TextColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TextColor", component.TextColor, "Color") + end + end + end + blue.OnValueChanged = function () + if blue.IntValue <= 255 then + component.TextColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TextColor", component.TextColor, "Color") + end + end + end + alpha.OnValueChanged = function () + if alpha.IntValue <= 255 then + component.TextColor = Color(red.IntValue, green.IntValue, blue.IntValue, alpha.IntValue) + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TextColor", component.TextColor, "Color") + end + end + end + + local ignorelocalization = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Ignore Localization") + ignorelocalization.Selected = component.IgnoreLocalization + ignorelocalization.OnSelected = function() + component.IgnoreLocalization = ignorelocalization.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".IgnoreLocalization", component.IgnoreLocalization) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Label Component End -- + -- Quality Component Start -- + local Qualityfunction = function(component, key) + + if EditGUI.Settings.quality == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.3), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.3), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local qualitylevellayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.4), List.Content.RectTransform), nil) + qualitylevellayout.isHorizontal = true + qualitylevellayout.Stretch = true + qualitylevellayout.RelativeSpacing = 0.001 + + local qualityleveltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), qualitylevellayout.RectTransform), "Quality Level", nil, nil, GUI.Alignment.CenterLeft) + + local qualitylevel = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), qualitylevellayout.RectTransform), NumberType.Int) + qualitylevel.IntValue = component.QualityLevel + qualitylevel.MinValueInt = 0 + qualitylevel.MaxValueInt = 3 + qualitylevel.valueStep = 1 + qualitylevel.OnValueChanged = function () + component.QualityLevel = qualitylevel.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".QualityLevel", component.QualityLevel) + end + end + + end + -- Quality Component End -- + -- And Component Start -- + local AndComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- And Component End -- + -- Greater Component Start -- + local GreaterComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Greater Component End -- + -- Equals Component Start -- + local EqualsComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Equals Component End -- + -- Xor Component Start -- + local XorComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Xor Component End -- + -- Or Component Start -- + local OrComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Or Component End -- + -- SignalCheck Component Start -- + local SignalCheckComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local targetsignallayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + targetsignallayout.isHorizontal = true + targetsignallayout.Stretch = true + targetsignallayout.RelativeSpacing = 0.001 + + local targetsignaltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), targetsignallayout.RectTransform), "Target Signal", nil, nil, GUI.Alignment.CenterLeft) + + local targetsignal = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), targetsignallayout.RectTransform), "") + targetsignal.text = component.TargetSignal + targetsignal.OnTextChangedDelegate = function() + component.TargetSignal = targetsignal.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TargetSignal", component.TargetSignal) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- SignalCheck Component End -- + -- Concat Component Start -- + local ConcatComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + end + + local separatorlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + separatorlayout.isHorizontal = true + separatorlayout.Stretch = true + separatorlayout.RelativeSpacing = 0.001 + + local separatortext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), separatorlayout.RectTransform), "Separator", nil, nil, GUI.Alignment.CenterLeft) + + local separator = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), separatorlayout.RectTransform), "") + separator.text = component.Separator + separator.OnTextChangedDelegate = function() + component.Separator = separator.text + end + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + end + + end + -- Concat Component End -- + -- Memory Component Start -- + local MemoryComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxvaluelengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxvaluelengthlayout.isHorizontal = true + maxvaluelengthlayout.Stretch = true + maxvaluelengthlayout.RelativeSpacing = 0.001 + + local maxvaluelengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxvaluelengthlayout.RectTransform), "Max Value Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxvaluelength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxvaluelengthlayout.RectTransform), NumberType.Int) + maxvaluelength.IntValue = component.MaxValueLength + maxvaluelength.MinValueInt = -1000000000 + maxvaluelength.MaxValueInt = 1000000000 + maxvaluelength.valueStep = 1 + maxvaluelength.OnValueChanged = function() + component.MaxValueLength = maxvaluelength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxValueLength", component.MaxValueLength) + end + end + + local valuelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + valuelayout.isHorizontal = true + valuelayout.Stretch = true + valuelayout.RelativeSpacing = 0.001 + + local valuetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), valuelayout.RectTransform), "Value", nil, nil, GUI.Alignment.CenterLeft) + + local value = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), valuelayout.RectTransform), "") + value.text = component.Value + value.OnTextChangedDelegate = function() + component.Value = value.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Value", component.Value) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local writeable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Writeable") + writeable.Selected = component.Writeable + writeable.OnSelected = function() + component.Writeable = writeable.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Writeable", component.Writeable) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Memory Component End -- + -- Subtract Component Start -- + local SubtractComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local clampmaxlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + clampmaxlayout.isHorizontal = true + clampmaxlayout.Stretch = true + clampmaxlayout.RelativeSpacing = 0.001 + + local clampmaxtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), clampmaxlayout.RectTransform), "Clamp max", nil, nil, GUI.Alignment.CenterLeft) + + local clampmax = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), clampmaxlayout.RectTransform), NumberType.Float) + clampmax.MinValueFloat = -999999 + clampmax.MaxValueFloat = 999999 + clampmax.valueStep = 0.1 + clampmax.FloatValue = component.Clampmax + clampmax.OnValueChanged = function() + component.Clampmax = clampmax.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Clampmax", component.Clampmax) + end + end + + local clampminlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + clampminlayout.isHorizontal = true + clampminlayout.Stretch = true + clampminlayout.RelativeSpacing = 0.001 + + local clampmintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), clampminlayout.RectTransform), "Clamp min", nil, nil, GUI.Alignment.CenterLeft) + + local clampmin = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), clampminlayout.RectTransform), NumberType.Float) + clampmin.MinValueFloat = -999999 + clampmin.MaxValueFloat = 999999 + clampmin.valueStep = 0.1 + clampmin.FloatValue = component.Clampmin + clampmin.OnValueChanged = function() + component.Clampmin = clampmin.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Clampmin", component.Clampmin) + end + end + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Subtract Component End -- + -- Divide Component Start -- + local DivideComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local clampmaxlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + clampmaxlayout.isHorizontal = true + clampmaxlayout.Stretch = true + clampmaxlayout.RelativeSpacing = 0.001 + + local clampmaxtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), clampmaxlayout.RectTransform), "Clamp max", nil, nil, GUI.Alignment.CenterLeft) + + local clampmax = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), clampmaxlayout.RectTransform), NumberType.Float) + clampmax.MinValueFloat = -999999 + clampmax.MaxValueFloat = 999999 + clampmax.valueStep = 0.1 + clampmax.FloatValue = component.Clampmax + clampmax.OnValueChanged = function() + component.Clampmax = clampmax.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Clampmax", component.Clampmax) + end + end + + local clampminlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + clampminlayout.isHorizontal = true + clampminlayout.Stretch = true + clampminlayout.RelativeSpacing = 0.001 + + local clampmintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), clampminlayout.RectTransform), "Clamp min", nil, nil, GUI.Alignment.CenterLeft) + + local clampmin = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), clampminlayout.RectTransform), NumberType.Float) + clampmin.MinValueFloat = -999999 + clampmin.MaxValueFloat = 999999 + clampmin.valueStep = 0.1 + clampmin.FloatValue = component.Clampmin + clampmin.OnValueChanged = function() + component.Clampmin = clampmin.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Clampmin", component.Clampmin) + end + end + + local timeframelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + timeframelayout.isHorizontal = true + timeframelayout.Stretch = true + timeframelayout.RelativeSpacing = 0.001 + + local timeframetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), timeframelayout.RectTransform), "Timeframe", nil, nil, GUI.Alignment.CenterLeft) + + local timeframe = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), timeframelayout.RectTransform), NumberType.Float) + timeframe.DecimalsToDisplay = 2 + timeframe.FloatValue = component.TimeFrame + timeframe.OnValueChanged = function() + component.TimeFrame = timeframe.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".TimeFrame", component.TimeFrame) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Divide Component End -- + -- Oscillator Component Start -- + local OscillatorComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.7), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.13), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local outputtypelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputtypelayout.isHorizontal = true + outputtypelayout.Stretch = true + outputtypelayout.RelativeSpacing = 0.001 + + local outputtypetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputtypelayout.RectTransform), "Output Type", nil, nil, GUI.Alignment.CenterLeft) + + local outputtype = GUI.DropDown(GUI.RectTransform(Vector2(1.2, 1), outputtypelayout.RectTransform), "", 3, nil, false) + outputtype.AddItem("Pulse", component.WaveType.Pulse) + outputtype.AddItem("Sawtooth", component.WaveType.Sawtooth) + outputtype.AddItem("Sine", component.WaveType.Sine) + outputtype.AddItem("Square", component.WaveType.Square) + outputtype.AddItem("Triangle", component.WaveType.Triangle) + outputtype.OnSelected = function (guiComponent, object) + component.OutputType = object + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".OutputType", component.OutputType) + end + end + + local frequencylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + frequencylayout.isHorizontal = true + frequencylayout.Stretch = true + frequencylayout.RelativeSpacing = 0.001 + + local frequencytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), frequencylayout.RectTransform), "Frequency", nil, nil, GUI.Alignment.CenterLeft) + + local frequency = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), frequencylayout.RectTransform), NumberType.Float) + frequency.DecimalsToDisplay = 2 + frequency.FloatValue = component.Frequency + frequency.OnValueChanged = function() + component.Frequency = frequency.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Frequency", component.Frequency) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Oscillator Component End -- + -- Color Component Start -- + local ColorComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local usehsv = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Use HSV") + usehsv.Selected = component.UseHSV + usehsv.OnSelected = function() + component.UseHSV = usehsv.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".UseHSV", component.UseHSV) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Color Component End -- + -- Not Component Start -- + local NotComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local continuousoutput = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Continuous Output") + continuousoutput.Selected = component.ContinuousOutput + continuousoutput.OnSelected = function() + component.ContinuousOutput = continuousoutput.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ContinuousOutput", component.ContinuousOutput) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Not Component End -- + -- TrigonometricFunction Component Start -- + local TrigonometricComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local useradians = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Use Radians") + useradians.Selected = component.UseRadians + useradians.OnSelected = function() + component.UseRadians = useradians.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".UseRadians", component.UseRadians) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- TrigonometricFunction Component End -- + -- Function Component Start -- + local FunctionComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Function Component End -- + -- Exponentiation Component Start -- + local ExponentiationComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local exponent = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Exponent") + exponent.Selected = component.Exponent + exponent.OnSelected = function() + component.Exponent = exponent.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Exponent", component.Exponent) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Exponentiation Component End -- + -- Modulo Component Start -- + local ModuloComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.52), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.18), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local modulus = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Modulus") + modulus.Selected = component.Modulus + modulus.OnSelected = function() + component.Modulus = modulus.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Modulus", component.Modulus) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.145), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Modulo Component End -- + -- Delay Component Start -- + local DelayComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.6), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local delaylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.09), List.Content.RectTransform), nil) + delaylayout.isHorizontal = true + delaylayout.Stretch = true + delaylayout.RelativeSpacing = 0.001 + + local delaytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), delaylayout.RectTransform), "Delay", nil, nil, GUI.Alignment.CenterLeft) + + local delay = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), delaylayout.RectTransform), NumberType.Float) + delay.DecimalsToDisplay = 2 + delay.MinValueFloat = 0 + delay.MaxValueFloat = 60 + delay.valueStep = 0.1 + delay.FloatValue = component.Delay + delay.OnValueChanged = function() + component.Delay = delay.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Delay", component.Delay) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.16), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local resetwhensignalreceived = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Reset When Signal Received") + resetwhensignalreceived.Selected = component.ResetWhenSignalReceived + resetwhensignalreceived.OnSelected = function() + component.ResetWhenSignalReceived = resetwhensignalreceived.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ResetWhenSignalReceived", component.ResetWhenSignalReceived) + end + end + + local resetwhendifferentsignalreceived = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Reset When Different Signal Received") + resetwhendifferentsignalreceived.Selected = component.ResetWhenDifferentSignalReceived + resetwhendifferentsignalreceived.OnSelected = function() + component.ResetWhenDifferentSignalReceived = resetwhendifferentsignalreceived.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ResetWhenDifferentSignalReceived", component.ResetWhenDifferentSignalReceived) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.5), List.Content.RectTransform), "Allow In-game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.125), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Delay Component End -- + -- Relay Component Start -- + local RelayComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.95), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.125), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxpowerlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + maxpowerlayout.isHorizontal = true + maxpowerlayout.Stretch = true + maxpowerlayout.RelativeSpacing = 0.001 + + local maxpowertext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxpowerlayout.RectTransform), "Max Power", nil, nil, GUI.Alignment.CenterLeft) + + local maxpower = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxpowerlayout.RectTransform), NumberType.Float) + maxpower.FloatValue = component.MaxPower + maxpower.OnValueChanged = function() + component.MaxPower = maxpower.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxPower", component.MaxPower) + end + end + + local overloadvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + overloadvoltagelayout.isHorizontal = true + overloadvoltagelayout.Stretch = true + overloadvoltagelayout.RelativeSpacing = 0.001 + + local overloadvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), overloadvoltagelayout.RectTransform), "Overload Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local overloadvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), overloadvoltagelayout.RectTransform), NumberType.Float) + overloadvoltage.FloatValue = component.OverloadVoltage + overloadvoltage.OnValueChanged = function() + component.OverloadVoltage = overloadvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".OverloadVoltage", component.OverloadVoltage) + end + end + + local fireprobabilitylayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + fireprobabilitylayout.isHorizontal = true + fireprobabilitylayout.Stretch = true + fireprobabilitylayout.RelativeSpacing = 0.001 + + local fireprobabilitytext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), fireprobabilitylayout.RectTransform), "Fire Probability", nil, nil, GUI.Alignment.CenterLeft) + + local fireprobability = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), fireprobabilitylayout.RectTransform), NumberType.Float) + fireprobability.MinValueFloat = 0 + fireprobability.MaxValueFloat = 1 + fireprobability.valueStep = 0.1 + fireprobability.FloatValue = component.FireProbability + fireprobability.OnValueChanged = function() + component.FireProbability = fireprobability.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FireProbability", component.FireProbability) + end + end + + local minvoltagelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + minvoltagelayout.isHorizontal = true + minvoltagelayout.Stretch = true + minvoltagelayout.RelativeSpacing = 0.001 + + local minvoltagetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minvoltagelayout.RectTransform), "Min Voltage", nil, nil, GUI.Alignment.CenterLeft) + + local minvoltage = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minvoltagelayout.RectTransform), NumberType.Float) + minvoltage.FloatValue = component.MinVoltage + minvoltage.OnValueChanged = function() + component.MinVoltage = minvoltage.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinVoltage", component.MinVoltage) + end + end + + local powerconsumptionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + powerconsumptionlayout.isHorizontal = true + powerconsumptionlayout.Stretch = true + powerconsumptionlayout.RelativeSpacing = 0.001 + + local powerconsumptiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), powerconsumptionlayout.RectTransform), "Power Consumption", nil, nil, GUI.Alignment.CenterLeft) + + local powerconsumption = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), powerconsumptionlayout.RectTransform), NumberType.Float) + powerconsumption.FloatValue = component.PowerConsumption + powerconsumption.OnValueChanged = function() + component.PowerConsumption = powerconsumption.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PowerConsumption", component.PowerConsumption) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.08), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local ison = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Is On") + ison.Selected = component.IsOn + ison.OnSelected = function() + component.IsOn = ison.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".IsOn", component.IsOn) + end + end + + local canbeoverloaded = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Overloaded") + canbeoverloaded.Selected = component.CanBeOverloaded + canbeoverloaded.OnSelected = function() + component.CanBeOverloaded = canbeoverloaded.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBeOverloaded", component.CanBeOverloaded) + end + end + + local vulnerabletoemp = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Vulnerable To EMP") + vulnerabletoemp.Selected = component.VulnerableToEMP + vulnerabletoemp.OnSelected = function() + component.VulnerableToEMP = vulnerabletoemp.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".VulnerableToEMP", component.VulnerableToEMP) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Relay Component End -- + -- Wifi Component Start -- + local WifiComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.66), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local rangelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + rangelayout.isHorizontal = true + rangelayout.Stretch = true + rangelayout.RelativeSpacing = 0.001 + + local rangetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), rangelayout.RectTransform), "Range", nil, nil, GUI.Alignment.CenterLeft) + + local range = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), rangelayout.RectTransform), NumberType.Float) + range.FloatValue = component.Range + range.OnValueChanged = function() + component.Range = range.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Range", component.Range) + end + end + + local channellayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + channellayout.isHorizontal = true + channellayout.Stretch = true + channellayout.RelativeSpacing = 0.001 + + local channeltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), channellayout.RectTransform), "Channel", nil, nil, GUI.Alignment.CenterLeft) + + local channel = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), channellayout.RectTransform), NumberType.Float) + channel.MinValueFloat = -1000000000 + channel.MaxValueFloat = 1000000000 + channel.valueStep = 1 + channel.FloatValue = component.Channel + channel.OnValueChanged = function() + component.Channel = channel.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Channel", component.Channel) + end + end + + local minchatmessageintervallayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + minchatmessageintervallayout.isHorizontal = true + minchatmessageintervallayout.Stretch = true + minchatmessageintervallayout.RelativeSpacing = 0.001 + + local minchatmessageintervaltext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), minchatmessageintervallayout.RectTransform), "Min Chat Message Interval", nil, nil, GUI.Alignment.CenterLeft) + + local minchatmessageinterval = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), minchatmessageintervallayout.RectTransform), NumberType.Float) + minchatmessageinterval.FloatValue = component.MinChatMessageInterval + minchatmessageinterval.OnValueChanged = function() + component.MinChatMessageInterval = minchatmessageinterval.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MinChatMessageInterval", component.MinChatMessageInterval) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local allowcrossteamcommunication = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow Cross-Team Communication") + allowcrossteamcommunication.Selected = component.AllowCrossTeamCommunication + allowcrossteamcommunication.OnSelected = function() + component.AllowCrossTeamCommunication = allowcrossteamcommunication.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowCrossTeamCommunication", component.AllowCrossTeamCommunication) + end + end + + local linktochat = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Link to Chat") + linktochat.Selected = component.LinkToChat + linktochat.OnSelected = function() + component.LinkToChat = linktochat.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".LinkToChat", component.LinkToChat) + end + end + + local discardduplicatechatmessages = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Discard Duplicate Chat Messages") + discardduplicatechatmessages.Selected = component.DiscardDuplicateChatMessages + discardduplicatechatmessages.OnSelected = function() + component.DiscardDuplicateChatMessages = discardduplicatechatmessages.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".DiscardDuplicateChatMessages", component.DiscardDuplicateChatMessages) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Wifi Component End -- + -- Regex Find Component Start -- + local RegExFindComponentfunction = function(component, key) + + if EditGUI.Settings.components == false then + return + end + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), menuList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local List = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.66), menuList.Content.RectTransform, GUI.Anchor.TopCenter)) + + local guiElement = { + listBox = List, + lineFrame = LineFrame, + } + table.insert(componentGUIElements, guiElement) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), component.Name, nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.3 + maintext.TextColor = Color(255,255,255) + + local maxoutputlengthlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + maxoutputlengthlayout.isHorizontal = true + maxoutputlengthlayout.Stretch = true + maxoutputlengthlayout.RelativeSpacing = 0.001 + + local maxoutputlengthtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), maxoutputlengthlayout.RectTransform), "Max Output Length", nil, nil, GUI.Alignment.CenterLeft) + + local maxoutputlength = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), maxoutputlengthlayout.RectTransform), NumberType.Int) + maxoutputlength.IntValue = component.MaxOutputLength + maxoutputlength.MinValueInt = -1000000000 + maxoutputlength.MaxValueInt = 1000000000 + maxoutputlength.valueStep = 1 + maxoutputlength.OnValueChanged = function() + component.MaxOutputLength = maxoutputlength.IntValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".MaxOutputLength", component.MaxOutputLength) + end + end + + local outputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + outputlayout.isHorizontal = true + outputlayout.Stretch = true + outputlayout.RelativeSpacing = 0.001 + + local outputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), outputlayout.RectTransform), "Output", nil, nil, GUI.Alignment.CenterLeft) + + local output = GUI.TextBox(GUI.RectTransform(Vector2(1.2 , 1), outputlayout.RectTransform), "") + output.text = component.Output + output.OnTextChangedDelegate = function() + component.Output = output.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Output", component.Output) + end + end + + local falseoutputlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + falseoutputlayout.isHorizontal = true + falseoutputlayout.Stretch = true + falseoutputlayout.RelativeSpacing = 0.001 + + local falseoutputtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), falseoutputlayout.RectTransform), "False Output", nil, nil, GUI.Alignment.CenterLeft) + + local falseoutput = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), falseoutputlayout.RectTransform), "") + falseoutput.text = component.FalseOutput + falseoutput.OnTextChangedDelegate = function() + component.FalseOutput = falseoutput.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".FalseOutput", component.FalseOutput) + end + end + + local expressionlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.11), List.Content.RectTransform), nil) + expressionlayout.isHorizontal = true + expressionlayout.Stretch = true + expressionlayout.RelativeSpacing = 0.001 + + local expressiontext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), expressionlayout.RectTransform), "Expression", nil, nil, GUI.Alignment.CenterLeft) + + local expression = GUI.TextBox(GUI.RectTransform(Vector2(1.2, 1), expressionlayout.RectTransform), "") + expression.text = component.Expression + expression.OnTextChangedDelegate = function() + component.Expression = expression.text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Expression", component.Expression) + end + end + + local pickingtimelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + pickingtimelayout.isHorizontal = true + pickingtimelayout.Stretch = true + pickingtimelayout.RelativeSpacing = 0.001 + + local pickingtimetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), pickingtimelayout.RectTransform), "Picking Time", nil, nil, GUI.Alignment.CenterLeft) + + local pickingtime = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), pickingtimelayout.RectTransform), NumberType.Float) + pickingtime.FloatValue = component.PickingTime + pickingtime.OnValueChanged = function() + component.PickingTime = pickingtime.FloatValue + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".PickingTime", component.PickingTime) + end + end + + local usecapturegroup = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Use Capture Group") + usecapturegroup.Selected = component.UseCaptureGroup + usecapturegroup.OnSelected = function() + component.UseCaptureGroup = usecapturegroup.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".UseCaptureGroup", component.UseCaptureGroup) + end + end + + local continuousoutput = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Continuous Output") + continuousoutput.Selected = component.ContinuousOutput + continuousoutput.OnSelected = function() + component.ContinuousOutput = continuousoutput.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".ContinuousOutput", component.ContinuousOutput) + end + end + + local canbepicked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Can Be Picked") + canbepicked.Selected = component.CanBePicked + canbepicked.OnSelected = function() + component.CanBePicked = canbepicked.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".CanBePicked", component.CanBePicked) + end + end + + local allowingameediting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), List.Content.RectTransform), "Allow In-Game Editing") + allowingameediting.Selected = component.AllowInGameEditing + allowingameediting.OnSelected = function() + component.AllowInGameEditing = allowingameediting.Selected == true + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".AllowInGameEditing", component.AllowInGameEditing) + end + end + + local msglayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.1), List.Content.RectTransform), nil) + msglayout.isHorizontal = true + msglayout.Stretch = true + msglayout.RelativeSpacing = 0.001 + + local msgtext = GUI.TextBlock(GUI.RectTransform(Vector2(0.5, 1), msglayout.RectTransform), "Msg", nil, nil, GUI.Alignment.CenterLeft) + + local msg = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), msglayout.RectTransform), "") + msg.Text = component.Msg + msg.OnTextChangedDelegate = function() + component.Msg = msg.Text + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, key .. ".Msg", component.Msg) + end + end + + end + -- Regex Find Component End -- + + + -- Settings Start -- + local Settingsfunction = function() + + if settings == false then + menu.RemoveChild(settingsmenu) + return + end + + settingsmenu = GUI.ListBox(GUI.RectTransform(Vector2(0.93, 0.7), menuContent.RectTransform, GUI.Anchor.Center)) + settingsmenu.RectTransform.AbsoluteOffset = Point(0, -17) + + local settingsList = GUI.ListBox(GUI.RectTransform(Vector2(1, 1), settingsmenu.Content.RectTransform, GUI.Anchor.TopCenter)) + + local maintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), settingsList.Content.RectTransform), "Main Settings", nil, nil, GUI.Alignment.Center) + maintext.TextScale = 1.4 + maintext.TextColor = Color(255,255,255) + + local clientsidetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), settingsList.Content.RectTransform), "Clientside Settings", nil, nil, GUI.Alignment.Center) + clientsidetext.TextColor = Color(255,255,255) + + local targetnoninteractablelayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + targetnoninteractablelayout.isHorizontal = true + targetnoninteractablelayout.Stretch = true + targetnoninteractablelayout.RelativeSpacing = 0.001 + + local targetnoninteractabletext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), targetnoninteractablelayout.RectTransform), "Target Non Interactable", nil, nil, GUI.Alignment.CenterLeft) + + local targetnoninteractabledropdown = GUI.DropDown(GUI.RectTransform(Vector2(1.2, 1), targetnoninteractablelayout.RectTransform), "", 3, nil, false) + + if EditGUI.ClientsideSettings.targetnoninteractable == nil then + targetnoninteractabledropdown.text = "False" + else + targetnoninteractable = EditGUI.ClientsideSettings.targetnoninteractable + targetnoninteractabledropdown.text = EditGUI.ClientsideSettings.targetnoninteractable + end + + targetnoninteractabledropdown.AddItem("False", "False") + targetnoninteractabledropdown.AddItem("Target Both", "Target Both") + targetnoninteractabledropdown.AddItem("Target Only Non Interactable", "Target Only Non Interactable") + targetnoninteractabledropdown.OnSelected = function (guiComponent, object) + targetnoninteractable = object + EditGUI.ClientsideSettings.targetnoninteractable = object + end + + local targetlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + targetlayout.isHorizontal = true + targetlayout.Stretch = true + targetlayout.RelativeSpacing = 0.001 + + local targettext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), targetlayout.RectTransform), "Targeting", nil, nil, GUI.Alignment.CenterLeft) + + local targetdropdown = GUI.DropDown(GUI.RectTransform(Vector2(1.2, 1), targetlayout.RectTransform), "", 3, nil, false) + + if EditGUI.ClientsideSettings.targetingsetting == nil then + targetdropdown.text = "Items" + else + targetdropdown.text = EditGUI.ClientsideSettings.targetingsetting + end + + targetdropdown.AddItem("Items", "Items") + targetdropdown.AddItem("Walls", "Walls") + targetdropdown.AddItem("Hulls", "Hulls") + targetdropdown.AddItem("Gaps", "Gaps") + targetdropdown.OnSelected = function (guiComponent, object) + EditGUI.ClientsideSettings.targetingsetting = object + end + + local tagstotargetlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + tagstotargetlayout.isHorizontal = true + tagstotargetlayout.Stretch = true + tagstotargetlayout.RelativeSpacing = 0.001 + local tagstotargettext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), tagstotargetlayout.RectTransform), "Tags To Target", nil, nil, GUI.Alignment.CenterLeft) + local tagstotarget = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), tagstotargetlayout.RectTransform), "") + if EditGUI.ClientsideSettings.tagstotarget then + tagstotarget.Text = EditGUI.ClientsideSettings.tagstotarget + else + tagstotarget.Text = "" + end + tagstotarget.OnTextChangedDelegate = function() + EditGUI.ClientsideSettings.tagstotarget = tagstotarget.Text + end + + local movementamountlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + movementamountlayout.isHorizontal = true + movementamountlayout.Stretch = true + movementamountlayout.RelativeSpacing = 0.001 + + local movementamounttext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), movementamountlayout.RectTransform), "Movement Amount", nil, nil, GUI.Alignment.CenterLeft) + + movementamount = GUI.NumberInput(GUI.RectTransform(Vector2(1.2, 1), movementamountlayout.RectTransform), NumberType.Float) + movementamount.MinValueFloat = 1 + movementamount.MaxValueFloat = 100 + movementamount.valueStep = 1 + + if EditGUI.ClientsideSettings.movementamount == nil then + movementamount.FloatValue = 1 + else + movementamount.FloatValue = EditGUI.ClientsideSettings.movementamount + end + + movementamount.OnValueChanged = function () + EditGUI.ClientsideSettings.movementamount = movementamount.FloatValue + end + + local targetitems = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Target Items") + + if EditGUI.ClientsideSettings.targetitems then + targetitems.Selected = EditGUI.ClientsideSettings.targetitems + else + targetitems.Selected = false + end + + targetitems.OnSelected = function () + EditGUI.ClientsideSettings.targetitems = targetitems.Selected == true + end + + local targetparentinventory = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Target Parent Inventory") + + if EditGUI.ClientsideSettings.targetparentinventory then + targetparentinventory.Selected = EditGUI.ClientsideSettings.targetparentinventory + else + targetparentinventory.Selected = false + end + + targetparentinventory.OnSelected = function () + EditGUI.ClientsideSettings.targetparentinventory = targetparentinventory.Selected == true + end + + local serversidetext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), settingsList.Content.RectTransform), "Serverside Settings", nil, nil, GUI.Alignment.Center) + serversidetext.TextColor = Color(255,255,255) + + local permissiondropdownlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + permissiondropdownlayout.isHorizontal = true + permissiondropdownlayout.Stretch = true + permissiondropdownlayout.RelativeSpacing = 0.001 + + local permissiondropdowntext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), permissiondropdownlayout.RectTransform), "Required Permissions", nil, nil, GUI.Alignment.CenterLeft) + + local permissiondropdown = GUI.DropDown(GUI.RectTransform(Vector2(1.2, 1), permissiondropdownlayout.RectTransform), "", 3, nil, false) + + if EditGUI.Settings.permissionsetting == nil then + permissiondropdown.text = "Above None" + EditGUI.Settings.permissionsetting = 0 + else + if EditGUI.Settings.permissionsetting == 0 then + permissiondropdown.text = "Above None" + else + permissiondropdown.text = EditGUI.Settings.permissionsetting + end + end + + permissiondropdown.AddItem("All", "All") + permissiondropdown.AddItem("ConsoleCommands", "ConsoleCommands") + permissiondropdown.AddItem("ManagePermissions", "ManagePermissions") + permissiondropdown.AddItem("ManageSettings", "ManageSettings") + permissiondropdown.AddItem("Above None", "0") + permissiondropdown.AddItem("None", "None") + permissiondropdown.OnSelected = function (guiComponent, object) + EditGUI.Settings.permissionsetting = object + end + + local tagstonottargetlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.07), settingsList.Content.RectTransform), nil) + tagstonottargetlayout.isHorizontal = true + tagstonottargetlayout.Stretch = true + tagstonottargetlayout.RelativeSpacing = 0.001 + + local tagstonottargettext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), tagstonottargetlayout.RectTransform), "Tags To Not Target", nil, nil, GUI.Alignment.CenterLeft) + + local tagstonottarget = GUI.TextBox(GUI.RectTransform(Vector2(1.5, 1), tagstonottargetlayout.RectTransform), "") + + if EditGUI.Settings.tagstonottarget then + tagstonottarget.Text = EditGUI.Settings.tagstonottarget + else + tagstonottarget.Text = "" + end + + tagstonottarget.OnTextChangedDelegate = function() + EditGUI.Settings.tagstonottarget = tagstonottarget.Text + end + + local allowtargetingnoninteractable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Allow Targeting Non Interactable") + if EditGUI.Settings.allowtargetingnoninteractable then + allowtargetingnoninteractable.Selected = EditGUI.Settings.allowtargetingnoninteractable + else + allowtargetingnoninteractable.Selected = false + end + allowtargetingnoninteractable.OnSelected = function () + EditGUI.Settings.allowtargetingnoninteractable = allowtargetingnoninteractable.Selected == true + end + + local allowtargetingstructures = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Allow Targeting Structures") + if EditGUI.Settings.allowtargetingstructures then + allowtargetingstructures.Selected = EditGUI.Settings.allowtargetingstructures + else + allowtargetingstructures.Selected = false + end + allowtargetingstructures.OnSelected = function () + EditGUI.Settings.allowtargetingstructures = allowtargetingstructures.Selected == true + end + + local allowtargetingitems = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Allow Targeting Items") + if EditGUI.Settings.allowtargetingitems then + allowtargetingitems.Selected = EditGUI.Settings.allowtargetingitems + else + allowtargetingitems.Selected = false + end + allowtargetingitems.OnSelected = function () + EditGUI.Settings.allowtargetingitems = allowtargetingitems.Selected == true + end + + -- Value Settings -- + + ValueSettings = function() + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), settingsList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local subtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), settingsList.Content.RectTransform), "Value Settings", nil, nil, GUI.Alignment.Center) + subtext.TextScale = 1.3 + subtext.TextColor = Color(255,255,255) + + local spritedepth = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Sprite Depth Enabled") + spritedepth.Selected = EditGUI.Settings.spritedepth + spritedepth.OnSelected = function () + EditGUI.Settings.spritedepth = spritedepth.Selected == true + end + + local rotation = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Rotation Enabled") + rotation.Selected = EditGUI.Settings.rotation + rotation.OnSelected = function () + EditGUI.Settings.rotation = rotation.Selected == true + end + + local scale = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Scale Enabled") + scale.Selected = EditGUI.Settings.scale + scale.OnSelected = function () + EditGUI.Settings.scale = scale.Selected == true + end + + local scaleeditlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.105), settingsList.Content.RectTransform), nil) + scaleeditlayout.isHorizontal = true + scaleeditlayout.Stretch = true + scaleeditlayout.RelativeSpacing = 0.001 + + local scalemintext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), scaleeditlayout.RectTransform), "Scale Min", nil, nil, GUI.Alignment.CenterLeft) + + local scalemininput = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), scaleeditlayout.RectTransform), NumberType.Float) + scalemininput.DecimalsToDisplay = 3 + scalemininput.FloatValue = EditGUI.Settings.scalemin + scalemininput.MinValueFloat = 0.001 + scalemininput.MaxValueFloat = 0.999 + scalemininput.valueStep = 0.1 + scalemininput.OnValueChanged = function () + EditGUI.Settings.scalemin = scalemininput.FloatValue + end + + local scalemaxtext = GUI.TextBlock(GUI.RectTransform(Vector2(1, 1), scaleeditlayout.RectTransform), "Scale Max", nil, nil, GUI.Alignment.CenterLeft) + + local scalemaxinput = GUI.NumberInput(GUI.RectTransform(Vector2(1, 1), scaleeditlayout.RectTransform), NumberType.Float) + scalemaxinput.DecimalsToDisplay = 3 + scalemaxinput.FloatValue = EditGUI.Settings.scalemax + scalemaxinput.MinValueFloat = 0.001 + scalemaxinput.MaxValueFloat = 0.999 + scalemaxinput.valueStep = 0.1 + scalemaxinput.OnValueChanged = function () + EditGUI.Settings.scalemax = scalemaxinput.FloatValue + end + + local condition = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Condition Enabled") + condition.Selected = EditGUI.Settings.condition + condition.OnSelected = function () + EditGUI.Settings.condition = condition.Selected == true + end + + local spritecolor = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Sprite Color Enabled") + spritecolor.Selected = EditGUI.Settings.spritecolor + spritecolor.OnSelected = function () + EditGUI.Settings.spritecolor = spritecolor.Selected == true + end + + local alpha = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Alpha Enabled") + alpha.Selected = EditGUI.Settings.alpha + alpha.OnSelected = function () + EditGUI.Settings.alpha = alpha.Selected == true + end + + local tags = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Tags Enabled") + tags.Selected = EditGUI.Settings.tags + tags.OnSelected = function () + EditGUI.Settings.tags = tags.Selected == true + end + + local description = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Description Enabled") + description.Selected = EditGUI.Settings.description + description.OnSelected = function () + EditGUI.Settings.description = description.Selected == true + end + + local noninteractable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Non Interactable Enabled") + noninteractable.Selected = EditGUI.Settings.noninteractable + noninteractable.OnSelected = function () + EditGUI.Settings.noninteractable = noninteractable.Selected == true + end + + local nonplayerteaminteractable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Non-Player Team Interactable Enabled") + nonplayerteaminteractable.Selected = EditGUI.Settings.nonplayerteaminteractable + nonplayerteaminteractable.OnSelected = function () + EditGUI.Settings.nonplayerteaminteractable = nonplayerteaminteractable.Selected == true + end + + local invulnerabletodamage = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Invulnerable to Damage Enabled") + invulnerabletodamage.Selected = EditGUI.Settings.invulnerabletodamage + invulnerabletodamage.OnSelected = function () + EditGUI.Settings.invulnerabletodamage = invulnerabletodamage.Selected == true + end + + local displaysidebysidewhenlinked = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Display Side By Side When Linked Enabled") + displaysidebysidewhenlinked.Selected = EditGUI.Settings.displaysidebysidewhenlinked + displaysidebysidewhenlinked.OnSelected = function () + EditGUI.Settings.displaysidebysidewhenlinked = displaysidebysidewhenlinked.Selected == true + end + + local hiddeningame = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Hidden In Game Enabled") + hiddeningame.Selected = EditGUI.Settings.hiddeningame + hiddeningame.OnSelected = function () + EditGUI.Settings.hiddeningame = hiddeningame.Selected == true + end + + local mirror = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Mirror Enabled") + mirror.Selected = EditGUI.Settings.mirror + mirror.OnSelected = function () + EditGUI.Settings.mirror = mirror.Selected == true + end + + -- Components -- + + local LineFrame = GUI.Frame(GUI.RectTransform(Vector2(1, 0.1), settingsList.Content.RectTransform), nil) + local Line = GUI.Frame(GUI.RectTransform(Vector2(1, 1), LineFrame.RectTransform, GUI.Anchor.Center), "HorizontalLine") + + local subtext2 = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.08), settingsList.Content.RectTransform), "Enabled Components", nil, nil, GUI.Alignment.Center) + subtext2.TextScale = 1.3 + subtext2.TextColor = Color(255,255,255) + + local lightcomponent = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Light Component Enabled") + lightcomponent.Selected = EditGUI.Settings.lightcomponent + lightcomponent.OnSelected = function () + EditGUI.Settings.lightcomponent = lightcomponent.Selected == true + end + + local holdable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Holdable Component Enabled") + holdable.Selected = EditGUI.Settings.holdable + holdable.OnSelected = function () + EditGUI.Settings.holdable = holdable.Selected == true + end + + local connectionpanel = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "ConnectionPanel Component Enabled") + connectionpanel.Selected = EditGUI.Settings.connectionpanel + connectionpanel.OnSelected = function () + EditGUI.Settings.connectionpanel = connectionpanel.Selected == true + end + + local fabricator = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Fabricator Component Enabled") + fabricator.Selected = EditGUI.Settings.fabricator + fabricator.OnSelected = function () + EditGUI.Settings.fabricator = fabricator.Selected == true + end + + local deconstructor = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Deconstructor Component Enabled") + deconstructor.Selected = EditGUI.Settings.deconstructor + deconstructor.OnSelected = function () + EditGUI.Settings.deconstructor = deconstructor.Selected == true + end + + local reactor = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Reactor Component Enabled") + reactor.Selected = EditGUI.Settings.reactor + reactor.OnSelected = function () + EditGUI.Settings.reactor = reactor.Selected == true + end + + local oxygengenerator = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "OxygenGenerator Component Enabled") + oxygengenerator.Selected = EditGUI.Settings.oxygengenerator + oxygengenerator.OnSelected = function () + EditGUI.Settings.oxygengenerator = oxygengenerator.Selected == true + end + + local sonar = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Sonar Component Enabled") + sonar.Selected = EditGUI.Settings.sonar + sonar.OnSelected = function () + EditGUI.Settings.sonar = sonar.Selected == true + end + + local repairable = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Repairable Component Enabled") + repairable.Selected = EditGUI.Settings.repairable + repairable.OnSelected = function () + EditGUI.Settings.repairable = repairable.Selected == true + end + + local powertransfer = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "PowerTransfer Component Enabled") + powertransfer.Selected = EditGUI.Settings.powertransfer + powertransfer.OnSelected = function () + EditGUI.Settings.powertransfer = powertransfer.Selected == true + end + + local itemcontainer = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "ItemContainer Component Enabled") + itemcontainer.Selected = EditGUI.Settings.itemcontainer + itemcontainer.OnSelected = function () + EditGUI.Settings.itemcontainer = itemcontainer.Selected == true + end + + local door = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Door Component Enabled") + door.Selected = EditGUI.Settings.door + door.OnSelected = function () + EditGUI.Settings.door = door.Selected == true + end + + local itemlabel = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "ItemLabel Component Enabled") + itemlabel.Selected = EditGUI.Settings.itemlabel + itemlabel.OnSelected = function () + EditGUI.Settings.itemlabel = itemlabel.Selected == true + end + + local quality = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Quality Component Enabled") + quality.Selected = EditGUI.Settings.quality + quality.OnSelected = function () + EditGUI.Settings.quality = quality.Selected == true + end + + local components = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), settingsList.Content.RectTransform), "Components Enabled") + components.Selected = EditGUI.Settings.components + components.OnSelected = function () + EditGUI.Settings.components = components.Selected == true + end + + end + + if EditGUI.Settings.allowtargetingnoninteractable == true then + targetnoninteractablelayout.visible = true + else + targetnoninteractablelayout.visible = false + end + if EditGUI.Settings.allowtargetingstructures == true then + targetlayout.visible = true + else + targetlayout.visible = false + end + if EditGUI.Settings.allowtargetingitems == true then + targetitems.visible = true + else + targetitems.visible = false + end + + if Game.IsMultiplayer then + if EditGUI.owner.HasPermission(ClientPermissions.All) then + permissiondropdownlayout.visible = true + allowtargetingitems.visible = true + allowtargetingnoninteractable.visible = true + tagstonottargetlayout.visible = true + ValueSettings() + else + permissiondropdownlayout.visible = false + allowtargetingitems.visible = false + allowtargetingnoninteractable.visible = false + tagstonottargetlayout.visible = false + end + else + ValueSettings() + end + + end + -- Settings End -- + + Links = function() + if itemedit1 and itemedit2 ~= nil then + local isLinked = false + + for key, value in pairs(itemedit1.linkedTo) do + if value == itemedit2 then + isLinked = true + break + end + end + + if isLinked then + Unlink = true + linktargets.Text = "Unlink" + else + Unlink = false + linktargets.Text = "Link" + end + end + end + + local functionTable = { + LightComponent = LightComponentfunction, + Holdable = Holdablefunction, + ConnectionPanel = ConnectionPanelfunction, + Fabricator = Fabricatorfunction, + Deconstructor = Deconstructorfunction, + Reactor = Reactorfunction, + OxygenGenerator = OxygenGeneratorfunction, + Sonar = Sonarfunction, + Repairable = Repairablefunction, + ItemContainer = ItemContainerfunction, + Door = Doorfunction, + ItemLabel = ItemLabelfunction, + Quality = Qualityfunction, + AndComponent = AndComponentfunction, + GreaterComponent = GreaterComponentfunction, + EqualsComponent = EqualsComponentfunction, + XorComponent = XorComponentfunction, + OrComponent = OrComponentfunction, + SignalCheckComponent = SignalCheckComponentfunction, + ConcatComponent = ConcatComponentfunction, + MemoryComponent = MemoryComponentfunction, + SubtractComponent = SubtractComponentfunction, + DivideComponent = DivideComponentfunction, + OscillatorComponent = OscillatorComponentfunction, + ColorComponent = ColorComponentfunction, + NotComponent = NotComponentfunction, + TrigonometricFunctionComponent = TrigonometricComponentfunction, + FunctionComponent = FunctionComponentfunction, + ExponentiationComponent = ExponentiationComponentfunction, + ModuloComponent = ModuloComponentfunction, + DelayComponent = DelayComponentfunction, + RelayComponent = RelayComponentfunction, + WifiComponent = WifiComponentfunction, + RegExFindComponent = RegExFindComponentfunction, + } + + local reloadvalues = function() + menuContent.RemoveChild(menuList) + MainComponentfunction() + componentGUIElements = {} + if targeting == "items" then + for key, value in ipairs(itemedit.Components) do + if value.Name ~= "CustomInterface" then + local functionToCall = functionTable[value.Name] + if functionToCall and type(functionToCall) == "function" then + + componentGUIElements[value.Name] = value + + local component = itemedit.Components[key] + functionToCall(component, key) + end + end + end + end + Links() + end + + local miscbuttons = function() + + local misc = GUI.ListBox(GUI.RectTransform(Vector2(0.93, 0.124), menuContent.RectTransform, GUI.Anchor.BottomCenter)) + misc.RectTransform.AbsoluteOffset = Point(0, 23) + + + local misclayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.5), misc.Content.RectTransform), nil) + misclayout.isHorizontal = true + misclayout.Stretch = true + misclayout.RelativeSpacing = 0.004 + + local apply = GUI.Button(GUI.RectTransform(Vector2(0.482, 0.2), misclayout.RectTransform), "Apply") + apply.OnClicked = function() + EditGUI.networkstart() + if Game.IsMultiplayer and itemedit then + local itemeditnetwork = Networking.Start("servermsgstart") + itemeditnetwork.WriteUInt16(UShort(itemedit.ID)) + + itemeditnetwork.WriteSingle(itemedit.SpriteDepth) + itemeditnetwork.WriteSingle(itemedit.Rotation) + itemeditnetwork.WriteSingle(itemedit.Scale) + itemeditnetwork.WriteSingle(itemedit.Condition) + itemeditnetwork.WriteString(itemedit.Tags) + itemeditnetwork.WriteBoolean(itemedit.NonInteractable) + itemeditnetwork.WriteBoolean(itemedit.NonPlayerTeamInteractable) + itemeditnetwork.WriteBoolean(itemedit.InvulnerableToDamage) + itemeditnetwork.WriteBoolean(itemedit.DisplaySideBySideWhenLinked) + itemeditnetwork.WriteBoolean(itemedit.HiddenInGame) + Networking.Send(itemeditnetwork) + end + end + + linktargets = GUI.Button(GUI.RectTransform(Vector2(0.482, 0.2), misclayout.RectTransform), "None") + linktargets.OnClicked = function() + if itemedit1 == nil or itemedit2 == nil then + return + end + + if not itemedit1.Linkable then + EditGUI.AddMessage(itemedit1.Name .. " is not Linkable", EditGUI.owner) + return + end + if not itemedit2.Linkable then + EditGUI.AddMessage(itemedit2.Name .. " is not Linkable", EditGUI.owner) + return + end + + if Unlink == true then + if CLIENT and Game.IsMultiplayer then + local msg = Networking.Start("linkremove") + msg.WriteUInt16(UShort(itemedit1.ID)) + msg.WriteUInt16(UShort(itemedit2.ID)) + Networking.Send(msg) + links = true + else + itemedit1.RemoveLinked(itemedit2) + itemedit2.RemoveLinked(itemedit1) + Links() + end + else + if CLIENT and Game.IsMultiplayer then + local msg = Networking.Start("linkadd") + msg.WriteUInt16(UShort(itemedit1.ID)) + msg.WriteUInt16(UShort(itemedit2.ID)) + Networking.Send(msg) + links = true + else + itemedit1.AddLinked(itemedit2) + itemedit2.AddLinked(itemedit1) + Links() + end + end + end + + local settingsbutton = GUI.Button(GUI.RectTransform(Vector2(0.482, 0.2), misclayout.RectTransform), "Settings") + settingsbutton.OnClicked = function() + if settings == true then + settings = false + Settingsfunction() + else + settings = true + Settingsfunction() + end + end + + closeButton = GUI.Button(GUI.RectTransform(Vector2(1, 1), misc.Content.RectTransform), "Close", GUI.Alignment.Center) + closeButton.OnClicked = function () + frame.ClearChildren() + menu = nil + itemedit = nil + itemedit1 = nil + itemedit2 = nil + settings = false + itemmovekey = false + Hook.Remove("keyUpdate", "itemmovekey") + end + + end + + local itemeditbuttons = function() + + local targets = GUI.ListBox(GUI.RectTransform(Vector2(0.93, 0.1), menuContent.RectTransform, GUI.Anchor.TopCenter)) + targets.RectTransform.AbsoluteOffset = Point(0, 17) + + local chooseitem = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.3), targets.Content.RectTransform), "Choose What Item To Edit", nil, nil, GUI.Alignment.Center) + + local itemeditlayout = GUI.LayoutGroup(GUI.RectTransform(Vector2(1, 0.5), targets.Content.RectTransform), nil) + itemeditlayout.isHorizontal = true + itemeditlayout.Stretch = true + itemeditlayout.RelativeSpacing = 0.008 + + + itemeditbutton1 = GUI.Button(GUI.RectTransform(Vector2(0.482, 0.2), itemeditlayout.RectTransform), "None") + itemeditbutton1.OnClicked = function() + check = true + itemeditbutton1.TextColor = Color((10), (10), (100)) + itemeditbutton2.TextColor = Color((16), (34), (33)) + if itemedit1 ~= nil then + itemname.Text = itemedit1.Name + itemedit = itemedit1 + reloadvalues() + itemname.Text = itemedit1.Name + settings = false + Settingsfunction() + end + end + + itemeditbutton2 = GUI.Button(GUI.RectTransform(Vector2(0.482, 0.2), itemeditlayout.RectTransform), "None") + itemeditbutton2.OnClicked = function() + check = false + itemeditbutton1.TextColor = Color((16), (34), (33)) + itemeditbutton2.TextColor = Color((10), (10), (100)) + if itemedit2 ~= nil then + itemname.Text = itemedit2.Name + itemedit = itemedit2 + reloadvalues() + itemname.Text = itemedit2.Name + settings = false + Settingsfunction() + end + end + + end + + Hook.Add("Lua_Editor", "luaeditor", function(statusEffect, deltaTime, item) + EditGUI.owner = FindClientCharacter(item.ParentInventory.Owner) + local target = findtarget.findtarget(item) + -- Start Of Checks + + if item.ParentInventory.Owner ~= Character.Controlled then + return + end + + if Game.IsMultiplayer then + if EditGUI.Settings.permissionsetting ~= 0 then + if not EditGUI.owner.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + EditGUI.AddMessage("Insuffient Permissions", EditGUI.owner) + return + end + else + if EditGUI.owner.Permissions == 0 then + EditGUI.AddMessage("Insuffient Permissions", EditGUI.owner) + return + end + end + end + + if target == nil then + if menu == nil then + MainComponentfunction() + itemeditbuttons() + miscbuttons() + end + EditGUI.AddMessage("No item found", EditGUI.owner) + return + end + + if target == itemedit1 or target == itemedit2 then + EditGUI.AddMessage("Targeted items cannot be the same", EditGUI.owner) + return + end + + if EditGUI.ClientsideSettings.targetingsetting == "Walls" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "walls" + elseif EditGUI.ClientsideSettings.targetingsetting == "Hulls" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "hulls" + elseif EditGUI.ClientsideSettings.targetingsetting == "Gaps" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "gaps" + else + targeting = "items" + end + + if check == true then + itemedit1 = target + itemedit = itemedit1 + else + itemedit2 = target + itemedit = itemedit2 + end + + if menu == nil then + MainComponentfunction() + itemeditbuttons() + miscbuttons() + end + + reloadvalues() + + if itemedit == nil then + return + end + + if itemedit2 ~= nil then + Links() + end + + if check == true then + itemedit1 = target + itemedit = itemedit1 + itemeditbutton1.Text = itemedit1.Name + itemname.Text = itemedit1.Name + itemeditbutton1.TextColor = Color((10), (10), (100)) + itemeditbutton2.TextColor = Color((16), (34), (33)) + else + itemedit2 = target + itemedit = itemedit2 + itemeditbutton2.Text = itemedit2.Name + itemname.Text = itemedit2.Name + itemeditbutton1.TextColor = Color((16), (34), (33)) + itemeditbutton2.TextColor = Color((10), (10), (100)) + end + + + + if itemmovekey ~= true then + itemmovekey = true + local timer = 0 + local interval = 0.15 + Hook.Add("keyUpdate", "itemmovekey", function (keyargs) + timer = timer + keyargs + + if timer >= interval then + if PlayerInput.KeyDown(Keys.Up) then + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Move", 0, EditGUI.ClientsideSettings.movementamount) + else + itemedit.Move(Vector2(0, EditGUI.ClientsideSettings.movementamount), false) + end + end + + if PlayerInput.KeyDown(Keys.Down) then + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Move", 0, -EditGUI.ClientsideSettings.movementamount) + else + itemedit.Move(Vector2(0, -EditGUI.ClientsideSettings.movementamount), false) + end + end + + if PlayerInput.KeyDown(Keys.Left) then + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Move", -EditGUI.ClientsideSettings.movementamount, 0) + else + itemedit.Move(Vector2(-EditGUI.ClientsideSettings.movementamount, 0), false) + end + end + + if PlayerInput.KeyDown(Keys.Right) then + if Game.IsMultiplayer then + Update.itemupdatevalue.fn(itemedit.ID, "Move", EditGUI.ClientsideSettings.movementamount, 0) + else + itemedit.Move(Vector2(EditGUI.ClientsideSettings.movementamount, 0), false) + end + end + + timer = 0 + end + end) + end + + end) + + Hook.Patch("Barotrauma.GameScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() + end) + + Hook.Patch("Barotrauma.SubEditorScreen", "AddToGUIUpdateList", function() + frame.AddToGUIUpdateList() + end) + + diff --git a/Lua Editor/Lua/defaultclientsidesettings.lua b/Lua Editor/Lua/defaultclientsidesettings.lua new file mode 100644 index 0000000..4012508 --- /dev/null +++ b/Lua Editor/Lua/defaultclientsidesettings.lua @@ -0,0 +1,17 @@ +-- DO NOT EDIT THESE SETTINGS, THIS IS JUST A TEMPLATE -- + +local clientsidesettings = {} + +clientsidesettings.targetnoninteractable = "False" + +clientsidesettings.targetingsetting = "Objects" + +clientsidesettings.tagstotarget = "" + +clientsidesettings.movementamount = 1 + +clientsidesettings.targetitems = false + +clientsidesettings.targetparentinventory = false + +return clientsidesettings diff --git a/Lua Editor/Lua/defaultsettings.lua b/Lua Editor/Lua/defaultsettings.lua new file mode 100644 index 0000000..1e534eb --- /dev/null +++ b/Lua Editor/Lua/defaultsettings.lua @@ -0,0 +1,81 @@ +-- DO NOT EDIT THESE SETTINGS, THIS IS JUST A TEMPLATE -- + +local settings = {} + +settings.permissionsetting = 0 + +settings.tagstonottarget = "" + +settings.allowtargetingnoninteractable = true + +settings.allowtargetingitems = false + +settings.allowtargetingstructures = false + +-- main value settings + +settings.spritedepth = true + +settings.rotation = true + +settings.scale = true + +settings.scalemin = 0.1 +settings.scalemax = 0.9 + +settings.condition = false + +settings.spritecolor = true + +settings.alpha = false + +settings.tags = true + +settings.description = true + +settings.noninteractable = true + +settings.nonplayerteaminteractable = false + +settings.invulnerabletodamage = false + +settings.displaysidebysidewhenlinked = true + +settings.hiddeningame = false + +settings.mirror = true + + +-- Components + +settings.lightcomponent = false + +settings.holdable = false + +settings.connectionpanel = false + +settings.fabricator = false + +settings.deconstructor = false + +settings.reactor = false + +settings.oxygengenerator = false + +settings.sonar = false + +settings.repairable = false + +settings.powertransfer = false + +settings.itemcontainer = false + +settings.door = false + +settings.itemlabel = false + +settings.quality = false + +settings.components = false + +return settings diff --git a/Lua Editor/Lua/findtarget.lua b/Lua Editor/Lua/findtarget.lua new file mode 100644 index 0000000..a11503d --- /dev/null +++ b/Lua Editor/Lua/findtarget.lua @@ -0,0 +1,154 @@ +local findtarget = {} +-- findowner +findtarget.FindClientCharacter = function(character) + if CLIENT then return nil end + + for key, value in pairs(Client.ClientList) do + if value.Character == character then + return value + end + end +end + + + + + + +findtarget.cursor_pos = Vector2(0, 0) +findtarget.cursor_updated = false + +local function StringToTable(inputString) + local result = {} + + if inputString == nil then + return result + end + + for value in inputString:gmatch("[^,]+") do + table.insert(result, value) + end + + return result +end + +local function itemsorwalls(submarine) + + if EditGUI.ClientsideSettings.targetingsetting == "Walls" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "walls" + return submarine.GetWalls(false) + elseif EditGUI.ClientsideSettings.targetingsetting == "Hulls" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "hulls" + return submarine.GetHulls(false) + elseif EditGUI.ClientsideSettings.targetingsetting == "Gaps" and EditGUI.Settings.allowtargetingstructures == true then + targeting = "gaps" + return submarine.GetGaps(false) + else + targeting = "items" + return submarine.GetItems(false) + end +end + +local function FindClosestItem(submarine, position) + local closest = nil + for key, value in pairs(submarine and itemsorwalls(submarine) or Item.ItemList) do + if targeting == "items" then + if EditGUI.Settings.allowtargetingnoninteractable == true then + if EditGUI.ClientsideSettings.targetnoninteractable == "False" then + targetnoninter = value.NonInteractable == false + elseif EditGUI.ClientsideSettings.targetnoninteractable == "Target Both" then + targetnoninter = value.NonInteractable == false or true + elseif EditGUI.ClientsideSettings.targetnoninteractable == "Target Only Non Interactable" then + targetnoninter = value.NonInteractable == true + end + else + targetnoninter = value.NonInteractable == false + end + else + targetnoninter = true + end + + if EditGUI.Settings.allowtargetingitems == true then + targetitems = EditGUI.ClientsideSettings.targetitems + else + targetitems = false + end + + -- Check if the item has a parent inventory + if targeting == "items" then + hasParentInventory = value.ParentInventory ~= nil + end + + -- Skip items with parent inventories + if hasParentInventory == EditGUI.ClientsideSettings.targetparentinventory or targeting ~= "items" then + local hasValidTag = true + + if EditGUI.ClientsideSettings.tagstotarget ~= nil and targeting == "items" then + for _, tag in ipairs(StringToTable(EditGUI.ClientsideSettings.tagstotarget)) do + if value.HasTag(tag) then + hasValidTag = true + break + else + hasValidTag = false + end + end + end + + for _, tag in ipairs(StringToTable(EditGUI.Settings.tagstonottarget)) do + if value.HasTag(tag) then + hasValidTag = false + break + end + end + + if hasValidTag and targetnoninter then + -- check if placable or if it does not have holdable component + local check_if_p_or_nh = false + if targeting == "items" then + local holdable = value.GetComponentString("Holdable") + end + if targetitems == false then + if holdable == nil then + check_if_p_or_nh = true + else + if holdable.attachable == true then + check_if_p_or_nh = true + end + end + else + check_if_p_or_nh = true + end + if check_if_p_or_nh == true then + if Vector2.Distance(position, value.WorldPosition) < 100 then + if closest == nil then closest = value end + if Vector2.Distance(position, value.WorldPosition) < + Vector2.Distance(position, closest.WorldPosition) then + closest = value + end + end + end + end + end + end + return closest +end + +findtarget.findtarget = function(item) + cursor_updated = false + if Client then + findtarget.cursor_pos = item.ParentInventory.Owner.CursorWorldPosition + cursor_updated = true + end + + -- fallback + if not cursor_updated and Game.IsMultiplayer then + findtarget.cursor_pos = item.WorldPosition + end + + if item.ParentInventory == nil or item.ParentInventory.Owner == nil then return end + + local target = FindClosestItem(item.Submarine, findtarget.cursor_pos) + return target +end + +return findtarget diff --git a/Lua Editor/Lua/networking.lua b/Lua Editor/Lua/networking.lua new file mode 100644 index 0000000..62cb130 --- /dev/null +++ b/Lua Editor/Lua/networking.lua @@ -0,0 +1,483 @@ +network = {} + + +-- Shared Side Start -- + +local function ConvertStringToRequiredItems(value) + local relatedItemClass = LuaUserData.CreateStatic("Barotrauma.RelatedItem") + local requiredItems = {} + + for requiredItemXml in value:gmatch("<[^>]+/>") do + local xml = XDocument.Parse(requiredItemXml).Root + local contentXml = ContentXElement(nil, xml) + local relatedItem = relatedItemClass.__new(contentXml, "LuaEditorRequiredItem") + local requiredType = relatedItem.Type + + if requiredItems[requiredType] == nil then + requiredItems[requiredType] = {relatedItem} + else + table.insert(requiredItems[requiredType], relatedItem) + end + end + + return requiredItems +end + +-- Shared Side End -- +-- Client Side Start -- + +if CLIENT then + +local function ConvertToString(value) + return tostring(value) +end + +local function ConvertColorToString(value) + if type(value) == "userdata" then + return string.format("%f,%f,%f,%f", value.r, value.g, value.b, value.a) + else + print("failed to convert color") + end +end + +local function ConvertRequiredItemsToString(value) + if type(value) == "table" then + local requiredItemsXMLs = " " + for requiredType, requiredTypeItems in pairs(value) do + for i, requiredItem in ipairs(requiredTypeItems) do + local requiredItemsXML = XElement("requireditem") + requiredItem.Save(requiredItemsXML) + + requiredItemsXMLs = requiredItemsXMLs .. tostring(requiredItemsXML) + end + end + return requiredItemsXMLs + else + print("failed to convert RequiredItems to string") + end +end + +Update = { + itemupdatevalue = { + {"String", "String", "Number", "Number2"}, -- Three parameters: ItemString, ActionString, Value + fn = function(ItemString, ActionString, Value, Value2) + if Value2 == "Color" then + itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertColorToString(Value) .. "|" .. Value2 + elseif Value2 == "RequiredItems" then + itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertRequiredItemsToString(Value) .. "|" .. Value2 + else + if Value2 then + itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertToString(Value) .. "|" .. ConvertToString(Value2) + else + itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertToString(Value) + end + end + local itemupdatenetwork = Networking.Start("itemupdatenetworking") + itemupdatenetwork.WriteString(itemupdatestring) + Networking.Send(itemupdatenetwork) + end + } +} + +Networking.Receive("settingsnetworking", function (settingsnetwork) + local receivedData = settingsnetwork.ReadString() -- Get the received string + -- Deserialize the received string into a Lua table + local Settings = {} + for key, value in string.gmatch(receivedData, '([^;]+)=([^;]+)') do + if value == "true" then + Settings[key] = true + elseif value == "false" then + Settings[key] = false + else + Settings[key] = tonumber(value) or value + end + end + + -- Update your local settings with the received data + EditGUI.Settings = Settings +end) + + + EditGUI.networkstart = function() + if Game.IsMultiplayer and settings == false or settings == nil then + EditGUI.AddMessage("Applied settings to " .. itemedit.Name, owner) + else + if settings == true then + File.Write(EditGUI.Path .. "/clientsidesettings.json", json.serialize(EditGUI.ClientsideSettings)) + if Game.IsMultiplayer then + + local serializedData = "" + for key, value in pairs(EditGUI.Settings) do + if type(value) == "boolean" then + value = tostring(value) + end + serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" + end + local settingsnetwork = Networking.Start("settingsnetworkupdate") + settingsnetwork.WriteString(serializedData) + Networking.Send(settingsnetwork) + else + File.Write(EditGUI.Path .. "/settings.json", json.serialize(EditGUI.Settings)) + end + EditGUI.AddMessage("Saved Changes", owner) + else + if itemedit == nil then + return + end + EditGUI.AddMessage("Apply unnecessary in singleplayer", owner) + end + end + end + + +end + +-- Client Side End -- +-- Server Side Start + +if SERVER then + +EditGUI.Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) + +local function split(str, separator) + if str == nil then + return {} -- Return an empty table for an empty string + end + local result = {} + local pattern = string.format("([^%s]+)", separator) + str:gsub(pattern, function(c) result[#result + 1] = c end) + return result +end + +function removePeriodsAndNumbers(inputString) + local stringWithoutPeriodsAndNumbers = string.gsub(inputString, "[%.%d]", "") + return stringWithoutPeriodsAndNumbers +end + +Networking.Receive("itemupdatenetworking", function (itemupdatenetwork,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + itemupdatestring = itemupdatenetwork.ReadString() + local values = split(itemupdatestring, "|") + local ItemString = values[1] + local ActionString = values[2] + local ValueString = values[3] + if values[4] then + ValueString2 = values[4] + else + ValueString2 = nil + end + -- Perform the logic on the server + local itemedit = Entity.FindEntityByID(tonumber(ItemString)) + local Value = nil + if ValueString == "true" then + Value = true + elseif ValueString == "false" then + Value = false + elseif ValueString2 == "Color" then + local colorValues = split(ValueString , ",") + if #colorValues == 4 then + Value = Color(tonumber(colorValues[1]), tonumber(colorValues[2]), tonumber(colorValues[3]), tonumber(colorValues[4])) + end + elseif ValueString2 == "RequiredItems" then + Value = ConvertStringToRequiredItems(ValueString) + else + Value = tonumber(ValueString) or ValueString + end + local mainAction, subAction = ActionString:match("(.-)%.([^%.]+)$") + local valueStringOutput = ValueString or "nil" + if mainAction and subAction then + local key = tonumber(mainAction) + itemedit.Components[key][subAction] = Value + print(sender.Name .. " edited '" .. itemedit.Name .. "' " .. removePeriodsAndNumbers(ActionString) .. " to " .. valueStringOutput) + elseif ActionString == "Move" then + Value2 = tonumber(ValueString2) or ValueString2 + itemedit.Move(Vector2(Value, Value2), false) + print(sender.Name .. " moved '" .. itemedit.Name .. "' by x" .. valueStringOutput .. " And y" .. ValueString2) + else + itemedit[ActionString] = Value + print(sender.Name .. " edited '" .. itemedit.Name .. "' " .. removePeriodsAndNumbers(ActionString) .. " to " .. valueStringOutput) + end + local itemupdatetoclient = Networking.Start("itemupdatetoclients") + itemupdatetoclient.WriteString(itemupdatestring) + Networking.Send(itemupdatetoclient) +end) + + + +Networking.Receive("serversettingsstart", function () + + if not File.Exists(EditGUI.Path .. "/settings.json") then + File.Write(EditGUI.Path .. "/settings.json", json.serialize(dofile(EditGUI.Path .. "/Lua/defaultsettings.lua"))) + end + -- Load the settings from file + local Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) + -- Serialize the settings table into a string + local serializedData = "" + for key, value in pairs(Settings) do + serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" + end + + -- Send the serialized settings data over the network + local settingsnetwork = Networking.Start("settingsnetworking") + settingsnetwork.WriteString(serializedData) + Networking.Send(settingsnetwork) +end) + + + +Networking.Receive("settingsnetworkupdate", function (settingsnetwork,sender) + if not sender.HasPermission(ClientPermissions.All) then + return + end + local receivedData = settingsnetwork.ReadString() + local Settingsupdate = {} + for key, value in string.gmatch(receivedData, '([^;]+)=([^;]+)') do + if value == "true" then + Settingsupdate[key] = true + elseif value == "false" then + Settingsupdate[key] = false + else + Settingsupdate[key] = tonumber(value) or value + end + end + File.Write(EditGUI.Path .. "/settings.json", json.serialize(Settingsupdate)) + -- Load the settings from file + local Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) + -- Serialize the settings table into a string + local serializedData = "" + for key, value in pairs(Settings) do + serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" + end + + -- Send the serialized settings data over the network + local settingsnetwork = Networking.Start("settingsnetworking") + settingsnetwork.WriteString(serializedData) + Networking.Send(settingsnetwork) +end) + +Networking.Receive("servermsgstart", function (itemeditnetwork,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + local itemedit = Entity.FindEntityByID(itemeditnetwork.ReadUInt16()) + itemedit.SpriteDepth = itemeditnetwork.ReadSingle() + itemedit.Rotation = itemeditnetwork.ReadSingle() + itemedit.Scale = itemeditnetwork.ReadSingle() + itemedit.Condition = itemeditnetwork.ReadSingle() + itemedit.Tags = itemeditnetwork.ReadString() + itemedit.NonInteractable = itemeditnetwork.ReadBoolean() + itemedit.NonPlayerTeamInteractable = itemeditnetwork.ReadBoolean() + itemedit.InvulnerableToDamage = itemeditnetwork.ReadBoolean() + itemedit.DisplaySideBySideWhenLinked = itemeditnetwork.ReadBoolean() + itemedit.HiddenInGame = itemeditnetwork.ReadBoolean() + + + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("SpriteDepth")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Rotation")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Scale")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Condition")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Tags")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("NonInteractable")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("NonPlayerTeamInteractable")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("InvulnerableToDamage")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("DisplaySideBySideWhenLinked")], itemedit)) + Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("HiddenInGame")], itemedit)) +end) + +Networking.Receive("flipxnetwork", function (mirrorx,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + local itemedit = Entity.FindEntityByID(mirrorx.ReadUInt16()) + if itemedit then + itemedit.FlipX(false) + print(sender.Name .. " MirroredX '" .. itemedit.Name .. "'") + + local flipx = Networking.Start("flipxclientnetwork") + flipx.WriteUInt16(UShort(itemedit.ID)) + Networking.Send(flipx) + end +end) + + Networking.Receive("flipynetwork", function (mirrory,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + local itemedit = Entity.FindEntityByID(mirrory.ReadUInt16()) + + if itemedit then + itemedit.FlipY(false) + print(sender.Name .. " MirroredY '" .. itemedit.Name .. "'") + + local flipy = Networking.Start("flipyclientnetwork") + flipy.WriteUInt16(UShort(itemedit.ID)) + Networking.Send(flipy) + end + + end) + + + Networking.Receive("linkremove", function (msg,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + + local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) + local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) + LinkRemove(itemedit1, itemedit2) + print(sender.Name .. " unlinked '" .. itemedit1.Name .. "' and '" .. itemedit2.Name .. "'") + + local msg = Networking.Start("lualinker.remove") + msg.WriteUInt16(UShort(itemedit1.ID)) + msg.WriteUInt16(UShort(itemedit2.ID)) + Networking.Send(msg) + end) + + Networking.Receive("linkadd", function (msg,sender) + if EditGUI.Settings.permissionsetting == 0 then + if sender.Permissions == 0 then + return + end + else + if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then + return + end + end + + local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) + local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) + LinkAdd(itemedit1, itemedit2) + print(sender.Name .. " linked '" .. itemedit1.Name .. "' and '" .. itemedit2.Name .. "'") + + local msg = Networking.Start("lualinker.add") + msg.WriteUInt16(UShort(itemedit1.ID)) + msg.WriteUInt16(UShort(itemedit2.ID)) + Networking.Send(msg) + + end) + + +end + +-- Server Side End -- +-- Client Side Start -- + +if CLIENT and Game.IsMultiplayer then + + local function split(str, separator) + if str == nil then + return {} -- Return an empty table for an empty string + end + local result = {} + local pattern = string.format("([^%s]+)", separator) + str:gsub(pattern, function(c) result[#result + 1] = c end) + return result + end + + Networking.Receive("itemupdatetoclients", function (itemupdatetoclient) + itemupdatestring = itemupdatetoclient.ReadString() + local values = split(itemupdatestring, "|") + local ItemString = values[1] + local ActionString = values[2] + local ValueString = values[3] + if values[4] then + ValueString2 = values[4] + else + ValueString2 = nil + end + -- Perform the logic on the server + local itemedit = Entity.FindEntityByID(tonumber(ItemString)) + local Value = nil + if ValueString == "true" then + Value = true + elseif ValueString == "false" then + Value = false + elseif ValueString2 == "Color" then + local colorValues = split(ValueString , ",") + if #colorValues == 4 then + Value = Color(tonumber(colorValues[1]), tonumber(colorValues[2]), tonumber(colorValues[3]), tonumber(colorValues[4])) + end + elseif ValueString2 == "RequiredItems" then + Value = ConvertStringToRequiredItems(ValueString) + else + Value = tonumber(ValueString) or ValueString + end + local mainAction, subAction = ActionString:match("(.-)%.([^%.]+)$") + if mainAction and subAction then + local key = tonumber(mainAction) + itemedit.Components[key][subAction] = Value + elseif ActionString == "Move" then + Value2 = tonumber(ValueString2) or ValueString2 + itemedit.Move(Vector2(Value, Value2), false) + else + itemedit[ActionString] = Value + end + end) + + Networking.Send(Networking.Start("serversettingsstart")) + + Networking.Receive("flipxclientnetwork", function (flipx) + local itemedit = Entity.FindEntityByID(flipx.ReadUInt16()) + if itemedit then + itemedit.FlipX(false) + end + end) + + Networking.Receive("flipyclientnetwork", function (flipy) + local itemedit = Entity.FindEntityByID(flipy.ReadUInt16()) + if itemedit then + itemedit.FlipY(false) + end + end) + + Networking.Receive("lualinker.add", function (msg) + local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) + local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) + LinkAdd(itemedit1, itemedit2) + if links == true then + Links() + end + end) + + Networking.Receive("lualinker.remove", function (msg) + local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) + local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) + LinkRemove(itemedit1, itemedit2) + if links == true then + Links() + end + end) +end +-- Client Side End -- diff --git a/Lua Editor/LuaEditor.ogg b/Lua Editor/LuaEditor.ogg new file mode 100644 index 0000000..7b7c40d --- /dev/null +++ b/Lua Editor/LuaEditor.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f08151094ca2b30f405af074425d627b007b1d9a0e4005ad493e4c484f53781 +size 6377 diff --git a/Lua Editor/clientsidesettings.json b/Lua Editor/clientsidesettings.json new file mode 100644 index 0000000..ad45a4d --- /dev/null +++ b/Lua Editor/clientsidesettings.json @@ -0,0 +1 @@ +{"targetnoninteractable":"False","targetingsetting":"Objects","tagstotarget":"","movementamount":1,"targetitems":false,"targetparentinventory":false} \ No newline at end of file diff --git a/Lua Editor/filelist.xml b/Lua Editor/filelist.xml new file mode 100644 index 0000000..848cea6 --- /dev/null +++ b/Lua Editor/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lua Editor/settings.json b/Lua Editor/settings.json new file mode 100644 index 0000000..5ef06ef --- /dev/null +++ b/Lua Editor/settings.json @@ -0,0 +1 @@ +{"permissionsetting":0,"tagstonottarget":"","allowtargetingnoninteractable":true,"allowtargetingitems":false,"allowtargetingstructures":false,"spritedepth":true,"rotation":true,"scale":true,"scalemin":0.1,"scalemax":0.9,"condition":false,"spritecolor":true,"alpha":false,"tags":true,"description":true,"noninteractable":true,"nonplayerteaminteractable":false,"invulnerabletodamage":false,"displaysidebysidewhenlinked":true,"hiddeningame":false,"mirror":true,"lightcomponent":false,"holdable":false,"connectionpanel":false,"fabricator":false,"deconstructor":false,"reactor":false,"oxygengenerator":false,"sonar":false,"repairable":false,"powertransfer":false,"itemcontainer":false,"door":false,"itemlabel":false,"quality":false,"components":false} \ No newline at end of file diff --git a/Lua Editor/toolgun.png b/Lua Editor/toolgun.png new file mode 100644 index 0000000..836c94d --- /dev/null +++ b/Lua Editor/toolgun.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1013e4ec74ba877b222256ae5b55923e40712dba4cb869cd23fbcfdd306400d4 +size 13132 diff --git a/Lua For Barotrauma/Binary/0Harmony.dll b/Lua For Barotrauma/Binary/0Harmony.dll new file mode 100644 index 0000000..f35f3e1 Binary files /dev/null and b/Lua For Barotrauma/Binary/0Harmony.dll differ diff --git a/Lua For Barotrauma/Binary/Barotrauma.deps.json b/Lua For Barotrauma/Binary/Barotrauma.deps.json new file mode 100644 index 0000000..cf02efd --- /dev/null +++ b/Lua For Barotrauma/Binary/Barotrauma.deps.json @@ -0,0 +1,3245 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": {}, + ".NETCoreApp,Version=v6.0/win-x64": { + "Barotrauma/1.7.7.0": { + "dependencies": { + "BarotraumaCore": "1.0.0", + "Concentus": "1.1.6", + "EosInterface": "1.0.0", + "Facepunch.Steamworks": "2.3.4", + "Farseer.NetStandard": "3.5.0", + "Hyper.ComponentModel.NetStandard": "1.0.0", + "Lib.Harmony": "2.2.2", + "Lidgren.NetStandard": "2012.1.7", + "Luatrauma.Internal.AssemblyPublicizer.MSBuild": "0.1.4", + "Microsoft.CodeAnalysis.CSharp.Scripting": "4.1.0", + "MonoGame.Framework.Windows.NetStandard": "3.7.0", + "MoonSharp.Interpreter": "2.0.0", + "MoonSharp.VsCodeDebugger": "2.0.0", + "NVorbis": "0.8.6", + "RestSharp": "106.13.0", + "SharpFont": "1.0.0", + "Sigil": "5.0.0", + "Concentus.NetStandard": "1.1.6.0", + "Facepunch.Steamworks.Win64": "1.0.0.0", + "SharpFont.NetStandard": "1.0.0.0", + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64": "6.0.8" + }, + "runtime": { + "Barotrauma.dll": {} + } + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/6.0.8": { + "runtime": { + "Microsoft.CSharp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.VisualBasic.Core.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.100.822.36306" + }, + "Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.Win32.Registry.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.AppContext.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Buffers.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Concurrent.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Immutable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.NonGeneric.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Specialized.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.Annotations.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Console.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.Common.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.DataSetExtensions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Contracts.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Debug.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Process.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Tools.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Tracing.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Drawing.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Drawing.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Dynamic.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Formats.Asn1.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.Calendars.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.Brotli.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.IsolatedStorage.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Pipes.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Expressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Queryable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Memory.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Http.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Http.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.HttpListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Mail.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.NameResolution.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.NetworkInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Ping.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Quic.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Requests.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Security.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.ServicePoint.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Sockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebClient.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebSockets.Client.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebSockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Numerics.Vectors.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ObjectModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.CoreLib.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.DataContractSerialization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Uri.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Xml.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Metadata.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.Reader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.ResourceManager.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.Writer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Handles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.InteropServices.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Intrinsics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Loader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Numerics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Claims.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Principal.Windows.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Principal.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.SecureString.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encodings.Web.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.RegularExpressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Channels.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Overlapped.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Thread.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.ThreadPool.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Timer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Transactions.Local.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ValueTuple.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Web.HttpUtility.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.ReaderWriter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XPath.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XmlDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XmlSerializer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "WindowsBase.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "netstandard.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "6.0.822.36306" + } + }, + "native": { + "Microsoft.DiaSymReader.Native.amd64.dll": { + "fileVersion": "14.28.29715.1" + }, + "System.IO.Compression.Native.dll": { + "fileVersion": "42.42.42.42424" + }, + "api-ms-win-core-console-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-console-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-datetime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-debug-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-errorhandling-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-fibers-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l2-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-handle-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-interlocked-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-libraryloader-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-localization-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-memory-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-namedpipe-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processenvironment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-1.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-profile-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-rtlsupport-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-sysinfo-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-timezone-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-util-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-conio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-convert-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-environment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-filesystem-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-locale-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-math-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-multibyte-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-private-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-process-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-runtime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-stdio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-time-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-utility-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "clretwrc.dll": { + "fileVersion": "6.0.822.36306" + }, + "clrjit.dll": { + "fileVersion": "6.0.822.36306" + }, + "coreclr.dll": { + "fileVersion": "6.0.822.36306" + }, + "createdump.exe": { + "fileVersion": "6.0.822.36306" + }, + "dbgshim.dll": { + "fileVersion": "6.0.822.36306" + }, + "hostfxr.dll": { + "fileVersion": "6.0.822.36306" + }, + "hostpolicy.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordaccore.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordaccore_amd64_amd64_6.0.822.36306.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordbi.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscorrc.dll": { + "fileVersion": "6.0.822.36306" + }, + "msquic.dll": { + "fileVersion": "1.7.0.0" + }, + "ucrtbase.dll": { + "fileVersion": "10.0.22000.194" + } + } + }, + "Lib.Harmony/2.2.2": { + "dependencies": { + "MonoMod.Common": "22.6.3.1", + "System.Text.Json": "5.0.2" + }, + "runtime": { + "lib/net6.0/0Harmony.dll": { + "assemblyVersion": "2.2.2.0", + "fileVersion": "2.2.2.0" + } + } + }, + "Luatrauma.Internal.AssemblyPublicizer.MSBuild/0.1.4": {}, + "Microsoft.CodeAnalysis.Analyzers/3.3.3": {}, + "Microsoft.CodeAnalysis.Common/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "5.0.0", + "System.Memory": "4.5.4", + "System.Reflection.Metadata": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "5.0.0", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting/4.1.0": { + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "Microsoft.CodeAnalysis.CSharp": "4.1.0", + "Microsoft.CodeAnalysis.Common": "4.1.0", + "Microsoft.CodeAnalysis.Scripting.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.Scripting.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.Scripting.Common/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.Scripting.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CSharp/4.7.0": {}, + "Microsoft.NETCore.Platforms/2.1.2": {}, + "Microsoft.NETCore.Targets/1.1.0": {}, + "Microsoft.Win32.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Mono.Cecil/0.11.4": { + "runtime": { + "lib/netstandard2.0/Mono.Cecil.Mdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Pdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Rocks.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + } + } + }, + "MonoMod.Common/22.6.3.1": { + "dependencies": { + "Mono.Cecil": "0.11.4", + "System.Collections.NonGeneric": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Reflection.TypeExtensions": "4.7.0" + }, + "runtime": { + "lib/net5.0/MonoMod.Common.dll": { + "assemblyVersion": "22.6.3.1", + "fileVersion": "22.6.3.1" + } + } + }, + "NETStandard.Library/1.6.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "NVorbis/0.8.6": { + "runtime": { + "lib/netstandard2.0/NVorbis.dll": { + "assemblyVersion": "0.8.6.0", + "fileVersion": "0.8.6.0" + } + } + }, + "RestSharp/106.13.0": { + "runtime": { + "lib/netstandard2.0/RestSharp.dll": { + "assemblyVersion": "106.13.0.0", + "fileVersion": "106.13.0.0" + } + } + }, + "runtime.any.System.Collections/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools/4.3.0": {}, + "runtime.any.System.Diagnostics.Tracing/4.3.0": {}, + "runtime.any.System.Globalization/4.3.0": {}, + "runtime.any.System.Globalization.Calendars/4.3.0": {}, + "runtime.any.System.IO/4.3.0": {}, + "runtime.any.System.Reflection/4.3.0": {}, + "runtime.any.System.Reflection.Extensions/4.3.0": {}, + "runtime.any.System.Reflection.Primitives/4.3.0": {}, + "runtime.any.System.Resources.ResourceManager/4.3.0": {}, + "runtime.any.System.Runtime/4.3.0": { + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles/4.3.0": {}, + "runtime.any.System.Runtime.InteropServices/4.3.0": {}, + "runtime.any.System.Text.Encoding/4.3.0": {}, + "runtime.any.System.Text.Encoding.Extensions/4.3.0": {}, + "runtime.any.System.Threading.Tasks/4.3.0": {}, + "runtime.any.System.Threading.Timer/4.3.0": {}, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.native.System/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.win.Microsoft.Win32.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug/4.3.0": {}, + "runtime.win.System.IO.FileSystem/4.3.0": { + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives/4.3.0": { + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions/4.3.0": { + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SharpDX/4.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1" + }, + "runtime": { + "lib/netstandard1.1/SharpDX.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.2.0.0" + } + } + }, + "SharpDX.Direct2D1/4.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0", + "SharpDX.DXGI": "4.2.0" + }, + "runtime": { + "lib/netstandard1.1/SharpDX.Direct2D1.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.2.0.0" + } + } + }, + "SharpDX.Direct3D11/4.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0", + "SharpDX.DXGI": "4.2.0" + }, + "runtime": { + "lib/netstandard1.1/SharpDX.Direct3D11.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.2.0.0" + } + } + }, + "SharpDX.DXGI/4.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0" + }, + "runtime": { + "lib/netstandard1.1/SharpDX.DXGI.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.2.0.0" + } + } + }, + "SharpDX.XInput/4.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0" + }, + "runtime": { + "lib/netstandard1.1/SharpDX.XInput.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.2.0.0" + } + } + }, + "Sigil/5.0.0": { + "runtime": { + "lib/netstandard2.1/Sigil.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.0.0" + } + } + }, + "System.AppContext/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Collections.Concurrent/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable/5.0.0": {}, + "System.Collections.NonGeneric/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized/4.3.0": { + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Primitives/4.3.0": { + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.Tracing/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile/4.3.0": { + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory/4.5.4": {}, + "System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.ObjectModel/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.Uri/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Emit/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration/4.7.0": {}, + "System.Reflection.Emit.Lightweight/4.7.0": {}, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Metadata/5.0.0": {}, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.7.0": {}, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": {}, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics/4.3.0": { + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Claims/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Security.Principal": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Claims": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.CodePages/4.5.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "5.0.0" + } + }, + "System.Text.Encoding.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Text.Json/5.0.2": {}, + "System.Text.RegularExpressions/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions/4.5.4": {}, + "System.Threading.Timer/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + }, + "System.Xml.ReaderWriter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "System.Xml.XDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "BarotraumaCore/1.0.0": { + "dependencies": { + "XNATypes": "1.0.0" + }, + "runtime": { + "BarotraumaCore.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Concentus/1.1.6": { + "runtime": { + "Concentus.NetStandard.dll": { + "assemblyVersion": "1.1.6", + "fileVersion": "1.1.6.0" + } + } + }, + "EosInterface/1.0.0": { + "dependencies": { + "BarotraumaCore": "1.0.0" + }, + "runtime": { + "EosInterface.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Facepunch.Steamworks/2.3.4": { + "runtime": { + "Facepunch.Steamworks.Win64.dll": { + "assemblyVersion": "2.3.4", + "fileVersion": "2.3.4" + } + } + }, + "Farseer.NetStandard/3.5.0": { + "dependencies": { + "XNATypes": "1.0.0" + }, + "runtime": { + "Farseer.NetStandard.dll": { + "assemblyVersion": "3.5.0", + "fileVersion": "3.5.0.0" + } + } + }, + "Hyper.ComponentModel.NetStandard/1.0.0": { + "runtime": { + "Hyper.ComponentModel.NetStandard.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Lidgren.NetStandard/2012.1.7": { + "runtime": { + "Lidgren.NetStandard.dll": { + "assemblyVersion": "2012.1.7", + "fileVersion": "2012.1.7.0" + } + } + }, + "MonoGame.Framework.Windows.NetStandard/3.7.0": { + "dependencies": { + "SharpDX": "4.2.0", + "SharpDX.DXGI": "4.2.0", + "SharpDX.Direct2D1": "4.2.0", + "SharpDX.Direct3D11": "4.2.0", + "SharpDX.XInput": "4.2.0", + "XNATypes": "1.0.0" + }, + "runtime": { + "MonoGame.Framework.Windows.NetStandard.dll": { + "assemblyVersion": "3.7.0", + "fileVersion": "3.7.0.0" + } + } + }, + "MoonSharp.Interpreter/2.0.0": { + "runtime": { + "MoonSharp.Interpreter.dll": { + "assemblyVersion": "2.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "MoonSharp.VsCodeDebugger/2.0.0": { + "dependencies": { + "MoonSharp.Interpreter": "2.0.0" + }, + "runtime": { + "MoonSharp.VsCodeDebugger.dll": { + "assemblyVersion": "2.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "SharpFont/1.0.0": { + "runtime": { + "SharpFont.NetStandard.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "XNATypes/1.0.0": { + "runtime": { + "XNATypes.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Concentus.NetStandard/1.1.6.0": { + "runtime": { + "Concentus.NetStandard.dll": { + "assemblyVersion": "1.1.6.0", + "fileVersion": "1.1.6.0" + } + } + }, + "Facepunch.Steamworks.Win64/1.0.0.0": { + "runtime": { + "Facepunch.Steamworks.Win64.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "2.3.4.0" + } + } + }, + "SharpFont.NetStandard/1.0.0.0": { + "runtime": { + "SharpFont.NetStandard.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + } + } + }, + "libraries": { + "Barotrauma/1.7.7.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/6.0.8": { + "type": "runtimepack", + "serviceable": false, + "sha512": "" + }, + "Lib.Harmony/2.2.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-70KvWz+DiUELxafsYL/LHxA/jH3PDWeApLo/VwtnrpTvRWQ/eUdPfS/l5funmhZWOy41QXw6UjVv+6C57Nx77A==", + "path": "lib.harmony/2.2.2", + "hashPath": "lib.harmony.2.2.2.nupkg.sha512" + }, + "Luatrauma.Internal.AssemblyPublicizer.MSBuild/0.1.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IYE30WBR3dAgHRRaEMNsILJWug1KxsM3CP181A/0/PWD4aUmEC1UBVMq22UHa0PnIRJxK0EzRVRicQjoy6aoZA==", + "path": "luatrauma.internal.assemblypublicizer.msbuild/0.1.4", + "hashPath": "luatrauma.internal.assemblypublicizer.msbuild.0.1.4.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==", + "path": "microsoft.codeanalysis.analyzers/3.3.3", + "hashPath": "microsoft.codeanalysis.analyzers.3.3.3.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==", + "path": "microsoft.codeanalysis.common/4.1.0", + "hashPath": "microsoft.codeanalysis.common.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sbu6kDGzo9bfQxuqWpeEE7I9P30bSuZEnpDz9/qz20OU6pm79Z63+/BsAzO2e/R/Q97kBrpj647wokZnEVr97w==", + "path": "microsoft.codeanalysis.csharp/4.1.0", + "hashPath": "microsoft.codeanalysis.csharp.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp.Scripting/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G3HBl6t7p8azLZS67jxUdYQhd/M00IQMag3wNkOK5qAWgEX+QSOmzWiG7GjTp84HbviFCqZplZbCNzDc5gGsBw==", + "path": "microsoft.codeanalysis.csharp.scripting/4.1.0", + "hashPath": "microsoft.codeanalysis.csharp.scripting.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Scripting.Common/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lRjDlFhq4HllCNFaWvfSRGr9JYyFlkR0fW7a8+7bBjybBTi2WqTZr4/pJCd4iPrSS+zSI6EdgnrEF+xNEsZHrQ==", + "path": "microsoft.codeanalysis.scripting.common/4.1.0", + "hashPath": "microsoft.codeanalysis.scripting.common.4.1.0.nupkg.sha512" + }, + "Microsoft.CSharp/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==", + "path": "microsoft.csharp/4.7.0", + "hashPath": "microsoft.csharp.4.7.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/2.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", + "path": "microsoft.netcore.platforms/2.1.2", + "hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "path": "microsoft.win32.primitives/4.3.0", + "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" + }, + "Mono.Cecil/0.11.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IC1h5g0NeJGHIUgzM1P82ld57knhP0IcQfrYITDPXlNpMYGUrsG5TxuaWTjaeqDNQMBDNZkB8L0rBnwsY6JHuQ==", + "path": "mono.cecil/0.11.4", + "hashPath": "mono.cecil.0.11.4.nupkg.sha512" + }, + "MonoMod.Common/22.6.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7CUFpelStpHwdWhIJrwyn56f1IXe3OLrNc9oytWIvBu6mAFT4ELqH1o9gVjmMIN6xf1KPl+OTYd0YRUP8wRZ9g==", + "path": "monomod.common/22.6.3.1", + "hashPath": "monomod.common.22.6.3.1.nupkg.sha512" + }, + "NETStandard.Library/1.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "path": "netstandard.library/1.6.1", + "hashPath": "netstandard.library.1.6.1.nupkg.sha512" + }, + "NVorbis/0.8.6": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5+6SN8UA3a3UXGTQtM+cDfvWm+BNqu2CgTjhcOzvLUibSLC5H25OMMS1Z1oRh9KqBkvGb6G9bK/O/UDRCkEXlg==", + "path": "nvorbis/0.8.6", + "hashPath": "nvorbis.0.8.6.nupkg.sha512" + }, + "RestSharp/106.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vwUdmmtC5vtePeNfBWnFcixBF2KjUeVv3ss4ZFzCIkOf7NB7W/9qX8JNZD9DOrz2yGk4AJW8k9znwgPZhnoiNg==", + "path": "restsharp/106.13.0", + "hashPath": "restsharp.106.13.0.nupkg.sha512" + }, + "runtime.any.System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "path": "runtime.any.system.collections/4.3.0", + "hashPath": "runtime.any.system.collections.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Diagnostics.Tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==", + "path": "runtime.any.system.diagnostics.tools/4.3.0", + "hashPath": "runtime.any.system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Diagnostics.Tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==", + "path": "runtime.any.system.diagnostics.tracing/4.3.0", + "hashPath": "runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", + "path": "runtime.any.system.globalization/4.3.0", + "hashPath": "runtime.any.system.globalization.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Globalization.Calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==", + "path": "runtime.any.system.globalization.calendars/4.3.0", + "hashPath": "runtime.any.system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "runtime.any.System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", + "path": "runtime.any.system.io/4.3.0", + "hashPath": "runtime.any.system.io.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", + "path": "runtime.any.system.reflection/4.3.0", + "hashPath": "runtime.any.system.reflection.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==", + "path": "runtime.any.system.reflection.extensions/4.3.0", + "hashPath": "runtime.any.system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", + "path": "runtime.any.system.reflection.primitives/4.3.0", + "hashPath": "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", + "path": "runtime.any.system.resources.resourcemanager/4.3.0", + "hashPath": "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "path": "runtime.any.system.runtime/4.3.0", + "hashPath": "runtime.any.system.runtime.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", + "path": "runtime.any.system.runtime.handles/4.3.0", + "hashPath": "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", + "path": "runtime.any.system.runtime.interopservices/4.3.0", + "hashPath": "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", + "path": "runtime.any.system.text.encoding/4.3.0", + "hashPath": "runtime.any.system.text.encoding.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==", + "path": "runtime.any.system.text.encoding.extensions/4.3.0", + "hashPath": "runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", + "path": "runtime.any.system.threading.tasks/4.3.0", + "hashPath": "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Threading.Timer/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==", + "path": "runtime.any.system.threading.timer/4.3.0", + "hashPath": "runtime.any.system.threading.timer.4.3.0.nupkg.sha512" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", + "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", + "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", + "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.native.System/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "path": "runtime.native.system/4.3.0", + "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" + }, + "runtime.native.System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "path": "runtime.native.system.io.compression/4.3.0", + "hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "path": "runtime.native.system.net.http/4.3.0", + "hashPath": "runtime.native.system.net.http.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "path": "runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "path": "runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", + "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", + "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", + "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", + "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", + "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", + "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.win.Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "path": "runtime.win.microsoft.win32.primitives/4.3.0", + "hashPath": "runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "path": "runtime.win.system.console/4.3.0", + "hashPath": "runtime.win.system.console.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==", + "path": "runtime.win.system.diagnostics.debug/4.3.0", + "hashPath": "runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "runtime.win.System.IO.FileSystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "path": "runtime.win.system.io.filesystem/4.3.0", + "hashPath": "runtime.win.system.io.filesystem.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Net.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "path": "runtime.win.system.net.primitives/4.3.0", + "hashPath": "runtime.win.system.net.primitives.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Net.Sockets/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "path": "runtime.win.system.net.sockets/4.3.0", + "hashPath": "runtime.win.system.net.sockets.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "path": "runtime.win.system.runtime.extensions/4.3.0", + "hashPath": "runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "SharpDX/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3pv0LFMvfK/dv1qISJnn8xBeeT6R/FRvr0EV4KI2DGsL84Qlv6P7isWqxGyU0LCwlSVCJN3jgHJ4Bl0KI2PJww==", + "path": "sharpdx/4.2.0", + "hashPath": "sharpdx.4.2.0.nupkg.sha512" + }, + "SharpDX.Direct2D1/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Qs8LzDMaQf1u3KB8ArHu9pDv6itZ++QXs99a/bVAG+nKr0Hx5NG4mcN5vsfE0mVR2TkeHfeUm4PksRah6VUPtA==", + "path": "sharpdx.direct2d1/4.2.0", + "hashPath": "sharpdx.direct2d1.4.2.0.nupkg.sha512" + }, + "SharpDX.Direct3D11/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oTm/iT5X/IIuJ8kNYP+DTC/MhBhqtRF5dbgPPFgLBdQv0BKzNTzXQQXd7SveBFjQg6hXEAJ2jGCAzNYvGFc9LA==", + "path": "sharpdx.direct3d11/4.2.0", + "hashPath": "sharpdx.direct3d11.4.2.0.nupkg.sha512" + }, + "SharpDX.DXGI/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UjKqkgWc8U+SP+j3LBzFP6OB6Ntapjih7Xo+g1rLcsGbIb5KwewBrBChaUu7sil8rWoeVU/k0EJd3SMN4VqNZw==", + "path": "sharpdx.dxgi/4.2.0", + "hashPath": "sharpdx.dxgi.4.2.0.nupkg.sha512" + }, + "SharpDX.XInput/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-mH3soea+aVUaTuFrkwx+zohklDvCczcgtuTiZJbOCyS5GZ/F9se4BsRJ86xTA9baf0drXYbZQj152PN7lnjiwg==", + "path": "sharpdx.xinput/4.2.0", + "hashPath": "sharpdx.xinput.4.2.0.nupkg.sha512" + }, + "Sigil/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9376TkXVKwEJNDOpnAunqjqlto9v0RZX/YNBGfWUVl9eyBNS1rmP49HgjPH5xr4rdVI+qT0p/+ngCNc/sM3PPA==", + "path": "sigil/5.0.0", + "hashPath": "sigil.5.0.0.nupkg.sha512" + }, + "System.AppContext/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "path": "system.appcontext/4.3.0", + "hashPath": "system.appcontext.4.3.0.nupkg.sha512" + }, + "System.Buffers/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "path": "system.buffers/4.3.0", + "hashPath": "system.buffers.4.3.0.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.Concurrent/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "path": "system.collections.concurrent/4.3.0", + "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" + }, + "System.Collections.Immutable/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", + "path": "system.collections.immutable/5.0.0", + "hashPath": "system.collections.immutable.5.0.0.nupkg.sha512" + }, + "System.Collections.NonGeneric/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "path": "system.collections.nongeneric/4.3.0", + "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" + }, + "System.Collections.Specialized/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "path": "system.collections.specialized/4.3.0", + "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" + }, + "System.ComponentModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "path": "system.componentmodel/4.3.0", + "hashPath": "system.componentmodel.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "path": "system.componentmodel.primitives/4.3.0", + "hashPath": "system.componentmodel.primitives.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "path": "system.componentmodel.typeconverter/4.3.0", + "hashPath": "system.componentmodel.typeconverter.4.3.0.nupkg.sha512" + }, + "System.Console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "path": "system.console/4.3.0", + "hashPath": "system.console.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.DiagnosticSource/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "path": "system.diagnostics.diagnosticsource/4.3.0", + "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "path": "system.diagnostics.tools/4.3.0", + "hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "path": "system.diagnostics.tracing/4.3.0", + "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "path": "system.globalization.calendars/4.3.0", + "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "System.Globalization.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "path": "system.io.compression/4.3.0", + "hashPath": "system.io.compression.4.3.0.nupkg.sha512" + }, + "System.IO.Compression.ZipFile/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "path": "system.io.compression.zipfile/4.3.0", + "hashPath": "system.io.compression.zipfile.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "path": "system.io.filesystem/4.3.0", + "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Linq.Expressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "path": "system.linq.expressions/4.3.0", + "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" + }, + "System.Memory/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "path": "system.memory/4.5.4", + "hashPath": "system.memory.4.5.4.nupkg.sha512" + }, + "System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "path": "system.net.http/4.3.0", + "hashPath": "system.net.http.4.3.0.nupkg.sha512" + }, + "System.Net.NameResolution/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "path": "system.net.nameresolution/4.3.0", + "hashPath": "system.net.nameresolution.4.3.0.nupkg.sha512" + }, + "System.Net.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "path": "system.net.primitives/4.3.0", + "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" + }, + "System.Net.Sockets/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "path": "system.net.sockets/4.3.0", + "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" + }, + "System.ObjectModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "path": "system.objectmodel/4.3.0", + "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" + }, + "System.Private.Uri/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "path": "system.private.uri/4.3.0", + "hashPath": "system.private.uri.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "path": "system.reflection.emit/4.3.0", + "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA==", + "path": "system.reflection.emit.ilgeneration/4.7.0", + "hashPath": "system.reflection.emit.ilgeneration.4.7.0.nupkg.sha512" + }, + "System.Reflection.Emit.Lightweight/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA==", + "path": "system.reflection.emit.lightweight/4.7.0", + "hashPath": "system.reflection.emit.lightweight.4.7.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Metadata/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==", + "path": "system.reflection.metadata/5.0.0", + "hashPath": "system.reflection.metadata.5.0.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==", + "path": "system.reflection.typeextensions/4.7.0", + "hashPath": "system.reflection.typeextensions.4.7.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==", + "path": "system.runtime.compilerservices.unsafe/5.0.0", + "hashPath": "system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "path": "system.runtime.interopservices.runtimeinformation/4.3.0", + "hashPath": "system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512" + }, + "System.Runtime.Numerics/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "path": "system.runtime.numerics/4.3.0", + "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" + }, + "System.Security.Claims/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", + "path": "system.security.claims/4.3.0", + "hashPath": "system.security.claims.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "path": "system.security.cryptography.algorithms/4.3.0", + "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Cng/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "path": "system.security.cryptography.cng/4.3.0", + "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Csp/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "path": "system.security.cryptography.csp/4.3.0", + "hashPath": "system.security.cryptography.csp.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "path": "system.security.cryptography.encoding/4.3.0", + "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "path": "system.security.cryptography.openssl/4.3.0", + "hashPath": "system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "path": "system.security.cryptography.primitives/4.3.0", + "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "path": "system.security.cryptography.x509certificates/4.3.0", + "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" + }, + "System.Security.Principal/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "path": "system.security.principal/4.3.0", + "hashPath": "system.security.principal.4.3.0.nupkg.sha512" + }, + "System.Security.Principal.Windows/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", + "path": "system.security.principal.windows/4.3.0", + "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.CodePages/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "path": "system.text.encoding.codepages/4.5.1", + "hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512" + }, + "System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "path": "system.text.encoding.extensions/4.3.0", + "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "System.Text.Json/5.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==", + "path": "system.text.json/5.0.2", + "hashPath": "system.text.json.5.0.2.nupkg.sha512" + }, + "System.Text.RegularExpressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "path": "system.text.regularexpressions/4.3.0", + "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Overlapped/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "path": "system.threading.overlapped/4.3.0", + "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "path": "system.threading.tasks.extensions/4.5.4", + "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" + }, + "System.Threading.Timer/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "path": "system.threading.timer/4.3.0", + "hashPath": "system.threading.timer.4.3.0.nupkg.sha512" + }, + "System.Xml.ReaderWriter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "path": "system.xml.readerwriter/4.3.0", + "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" + }, + "System.Xml.XDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "path": "system.xml.xdocument/4.3.0", + "hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512" + }, + "BarotraumaCore/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Concentus/1.1.6": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "EosInterface/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Facepunch.Steamworks/2.3.4": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Farseer.NetStandard/3.5.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Hyper.ComponentModel.NetStandard/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Lidgren.NetStandard/2012.1.7": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "MonoGame.Framework.Windows.NetStandard/3.7.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "MoonSharp.Interpreter/2.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "MoonSharp.VsCodeDebugger/2.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "SharpFont/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "XNATypes/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Concentus.NetStandard/1.1.6.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Facepunch.Steamworks.Win64/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "SharpFont.NetStandard/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + }, + "runtimes": { + "win-x64": [ + "win", + "any", + "base" + ], + "win-x64-aot": [ + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win10-x64": [ + "win10", + "win81-x64", + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win10-x64-aot": [ + "win10-aot", + "win10-x64", + "win10", + "win81-x64-aot", + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win7-x64": [ + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win7-x64-aot": [ + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win8-x64": [ + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win8-x64-aot": [ + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win81-x64": [ + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win81-x64-aot": [ + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ] + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Barotrauma.dll b/Lua For Barotrauma/Binary/Barotrauma.dll new file mode 100644 index 0000000..cd719cb Binary files /dev/null and b/Lua For Barotrauma/Binary/Barotrauma.dll differ diff --git a/Lua For Barotrauma/Binary/Barotrauma.exe b/Lua For Barotrauma/Binary/Barotrauma.exe new file mode 100644 index 0000000..450e900 Binary files /dev/null and b/Lua For Barotrauma/Binary/Barotrauma.exe differ diff --git a/Lua For Barotrauma/Binary/Barotrauma.pdb b/Lua For Barotrauma/Binary/Barotrauma.pdb new file mode 100644 index 0000000..3d4bb89 Binary files /dev/null and b/Lua For Barotrauma/Binary/Barotrauma.pdb differ diff --git a/Lua For Barotrauma/Binary/Barotrauma.runtimeconfig.json b/Lua For Barotrauma/Binary/Barotrauma.runtimeconfig.json new file mode 100644 index 0000000..736800c --- /dev/null +++ b/Lua For Barotrauma/Binary/Barotrauma.runtimeconfig.json @@ -0,0 +1,16 @@ +{ + "runtimeOptions": { + "tfm": "net6.0", + "includedFrameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "6.0.8" + } + ], + "configProperties": { + "System.Globalization.Invariant": true, + "System.Globalization.PredefinedCulturesOnly": true, + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false + } + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/BarotraumaCore.dll b/Lua For Barotrauma/Binary/BarotraumaCore.dll new file mode 100644 index 0000000..3360d34 Binary files /dev/null and b/Lua For Barotrauma/Binary/BarotraumaCore.dll differ diff --git a/Lua For Barotrauma/Binary/BarotraumaCore.pdb b/Lua For Barotrauma/Binary/BarotraumaCore.pdb new file mode 100644 index 0000000..69ecde7 Binary files /dev/null and b/Lua For Barotrauma/Binary/BarotraumaCore.pdb differ diff --git a/Lua For Barotrauma/Binary/BuildDocClient.xml b/Lua For Barotrauma/Binary/BuildDocClient.xml new file mode 100644 index 0000000..7deaca3 --- /dev/null +++ b/Lua For Barotrauma/Binary/BuildDocClient.xml @@ -0,0 +1,6629 @@ + + + + Barotrauma + + + + + Resets to false each time the MoveCamera method is called. + + + + + How long does it take for the ai target to fade out if not kept alive. + + + + + Should be reset to false each frame and kept indetectable by e.g. a status effect. + + + + + Does the AI target do something that requires Update() to be called (e.g. static targets don't need to be updated) + + + + + Enable the character to attack the outposts and the characters inside them. Disabled by default in normal levels, enabled in outpost levels. + + + + + The monster won't try to damage these submarines + + + + + How long do we hold on to the current state after losing a target before we reset back to the original state. + In other words, how long do we have to idle before the original state is restored. + + + + + Resets the target's state to the original value defined in the xml. + + + + + Temporarily changes the predefined state for a target. Eg. Idle -> Attack. + Note: does not change the current AIState! + + + + + Resets each frame + + + + + How far other characters can hear reports done by this character (e.g. reports for fires, intruders). Defaults to infinity. + + + + + List of previous attacks done to this character + + + + + Returns true when the safety is stale + + + + + Check whether the character has a diving suit in usable condition plus some oxygen. + + + + + Check whether the character has a diving mask in usable condition plus some oxygen. + + + + + Note: uses a single list for matching items. The item is reused each time when the method is called. So if you use the method twice, and then refer to the first items, you'll actually get the second. + To solve this, create a copy of the collection or change the code so that you first handle the first items and only after that query for the next items. + + + + + Updates the hull safety for all ai characters in the team. The idea is that the crew communicates (magically) via radio about the threads. + The safety levels need to be calculated for each bot individually, because the formula takes into account things like current orders. + There's now a cached value per each hull, which should prevent too frequent calculations. + + + + + Can there be multiple objective instaces of the same type? + + + + + Run the main objective with all subobjectives concurrently? + If false, the main objective will continue only when all the subobjectives have been removed (done). + + + + + There's a separate property for diving suit and mask: KeepDivingGearOn. + + + + + Final priority value after all calculations. + + + + + When true, the objective is never completed, unless CanBeCompleted returns false. + + + + + Aborts the objective when this condition is true. + + + + + A single shot event. Automatically cleared after launching. Use OnCompleted method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnAbandoned method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnSelected method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnDeselected method for implementing (internal) persistent behavior. + + + + + Makes the character act according to the objective, or according to any subobjectives that need to be completed before this one + + + + + This method allows multiple subobjectives of same type. Use with caution. + + + + + Call this only when the priority needs to be recalculated. Use the cached Priority property when you don't need to recalculate. + + + + + Checks if the subobjectives in the given collection are removed from the subobjectives. And if so, removes it also from the dictionary. + + + + + Checks if the objective already is created and added in subobjectives. If not, creates it. + Handles objectives that cannot be completed. If the objective has been removed form the subobjectives, a null value is assigned to the reference. + Returns true if the objective was created and successfully added. + + + + + Inversed draw order, which is used for drawing the limbs in 3d (deformable sprites). + + + + + Offset added to the default draw depth of the character's limbs. For example, climbing on ladders affects the depth of the character to get it to render behind the ladders. + + + + + Maximum damage per impact (0.1 = 10% of the character's maximum health) + + + + + In sim units. Joint scale applied. + + + + + Call this to create the ragdoll from the RagdollParams. + + + + + Saves all serializable data in the currently selected ragdoll params. This method should properly handle character flipping. + + + + + Resets the serializable data to the currently selected ragdoll params. + Force reloading always loads the xml stored on the disk. + + + + + Resets the current joint values to the serialized joint params. + + + + + Resets the current limb values to the serialized limb params. + + + + if false, force is applied to the position of pullJoint + + + + How long has the ragdoll stayed motionless + + + + + Get the position of the surface of water at the position of the character, in display units (taking into account connected hulls above the hull the character is in) + + + + + Get the position of the surface of water and the ceiling (= upper edge of the hull) at the position of the character, in display units (taking into account connected hulls above the hull the character is in). + + + + + Note that if there are multiple limbs of the same type, only the first (valid) limb is returned. + + + + + Used for multiplying all the damage. + + + + + Used for multiplying all the ranges. + + + + + Used for multiplying the physics forces. + + + + + Legacy support. Use Afflictions. + + + + + Only affects ai decision making. All the conditionals has to be met in order to select the attack. TODO: allow to define conditionals using any (implemented in StatusEffect -> move from there to PropertyConditional?) + + + + + Is the character currently visible on the camera. Refresh the value by calling DoVisibilityCheck. + + + + + Can be used by status effects + + + + + Can be used to set camera shake from status effects + + + + + Control the Character according to player input + + + + + Finds the front (lowest depth) interactable item at a position. "Interactable" in this case means that the character can "reach" the item. + + The Character who is looking for the interactable item, only items that are close enough to this character are returned + The item at the simPosition, with the lowest depth, is returned + If this is true and an item cannot be found at simPosition then a nearest item will be returned if possible + If a hull is specified, only items within that hull are returned + + + + Creates a progress bar that's "linked" to the specified object (or updates an existing one if there's one already linked to the object) + The progress bar will automatically fade out after 1 sec if the method hasn't been called during that time + + + + + Note that when a predicate is provided, the random option uses Linq.Where() extension method, which creates a new collection. + + + + + MonsterEvents disable monsters (which includes removing them from the character list, so they essentially "don't exist") until they're ready to spawn + + + + + Is the character controlled remotely (either by another player, or a server-side AIController) + + + + + Is the character controlled by another human player (should always be false in single player) + + + + + Is the character player or does it have an active ship command manager (an AI controlled sub)? Bots in the player team are not treated as commanders. + + + + + Prevents the character from interacting with items or characters + + + + + Prevents the character from highlighting items or characters with the cursor, + meaning it can't interact with anything but the things it has currently selected/equipped + + + + + Items the character has in their hand slots. Doesn't return nulls and only returns items held in both hands once. + + + + + Can be used by status effects to check whether the characters is in a high-pressure environment + + + + + Can be used by status effects + + + + + Was the character in full health at the beginning of the frame? + + + + + Current speed of the character's collider. Can be used by status effects to check if the character is moving. + + + + + The primary selected item. It can be any device that character interacts with. This excludes items like ladders and chairs which are assigned to . + + + + + The secondary selected item. It's an item other than a device (see ), e.g. a ladder or a chair. + + + + + Has the characters selected a primary or a secondary item? + + + + + Is the item either the primary or the secondary selected item? + + + + + + + Create a new character + + The name, gender, config file, etc of the character. + Position in display units. + RNG seed to use if the character config has randomizable parameters. + Is the character controlled by a remote player. + Is the character controlled by AI. + Ragdoll configuration file. If null, will select the default. + + + + Create a new character + + Name of the species (or the path to the config file) + Position in display units. + RNG seed to use if the character config has randomizable parameters. + The name, gender, etc of the character. Only used for humans, and if the parameter is not given, a random CharacterInfo is generated. + ID to assign to the character. If set to 0, automatically find an available ID. + Is the character controlled by a remote player. + Is the character controlled by AI. + Should clients receive a network event about the creation of this character? + Ragdoll configuration file. If null, will select the default. + + + + Can be used to modify the character's speed via StatusEffects + + + + + Can be used to modify the speed at which Propulsion ItemComponents move the character via StatusEffects (e.g. heavy suit can slow down underwater scooters) + + + + + Can be used to modify the character's health via StatusEffects + + + + + Health multiplier of the human prefab this character is an instance of (if any) + + + + + Speed reduction from the current limb specific damage. Min 0, max 1. + + + + + Values lower than this seem to cause constantious flipping when the mouse is near the player and the player is running, because the root collider moves after flipping. + + + + + A simple check if the character Dir is towards the target or not. Uses the world coordinates. + + + + + Finds the closest item seeking by identifiers or tags from the world. + Ignores items that are outside or in another team's submarine or in a submarine that is not connected to this submarine. + Also ignores non-interactable items and items that are taken by someone else. + The method is run in steps for performance reasons. So you'll have to provide the reference to the itemIndex. + Returns false while running and true when done. + + + + + Set an action that's invoked when another character interacts with this one. + + Action invoked when another character interacts with this one. T1 = this character, T2 = the interacting character + Displayed on the character when highlighted. + + + + How far the character is from the closest human player (including spectators) + + + + + How far the character is from the closest human player (including spectators) + + + + Force an order to be set for the character, bypassing hearing checks + + + + Apply the specified attack to this character. If the targetLimb is not specified, the limb closest to worldPosition will receive the damage. + + + + + Is the character knocked down regardless whether the technical state is dead, unconcious, paralyzed, or stunned. + With stunning, the parameter uses an one second delay before the character is treated as knocked down. The purpose of this is to ignore minor stunning. If you don't want to to ignore any stun, use the Stun property. + + + + + Calls using 'Inventory' and 'Info.InventoryData' + + + + + Returns hulls that are visible to the player, including the current hull. + Can be heavy if used every frame. + + + + + Is the character currently protected from the pressure by immunity/ability or a status effect (e.g. from a diving suit). + + + + + Check if the character is in the same room + Room and hull differ in that a room can consist of multiple linked hulls + + + + + Shows visual notification of money gained by the specific player. Useful for mid-mission monetary gains. + + + + + This dictionary is used for stats that are required very frequently. Not very performant, but easier to develop with for now. + If necessary, the approach of using a dictionary could be replaced by an encapsulated class that contains the stats as attributes. + + + + + A dictionary with temporary values, updated when the character equips/unequips wearables. Used to reduce unnecessary inventory checking. + + + + + ID of the last inputs the server has processed + + + + Override the distance-based alpha value with the iconAlpha parameter value + + + + Note: Can be null. + + + + + Endocrine boosters can unlock talents outside the user's talent tree. This method is used to cull them from the selection + + + + + Returns unlocked talents that aren't part of the character's talent tree (which can be unlocked e.g. with an endocrine booster) + + + + + Can be used to disable displaying the job in any info panels + + + + + Unique ID given to character infos in MP. Non-persistent. + Used by clients to identify which infos are the same to prevent duplicate characters in round summary. + + + + + Returns a presumably (not guaranteed) unique hash using the (current) Name, appearence, and job. + So unless there's another character with the exactly same name, job, and appearance, the hash should be unique. + + + + + Returns a presumably (not guaranteed) unique hash using the OriginalName, appearence, and job. + So unless there's another character with the exactly same name, job, and appearance, the hash should be unique. + + + + + Reloads the head sprite and the attachment sprites. + + + + + Save current orders to the parameter element + + + + + Save current orders to + + + + Reloads the attachment xml elements according to the indices. Doesn't reload the sprites. + + + + + Container for the icons above the health bar + + + + + Container for passive afflictions that have been hidden from afflictionIconContainer + + + + + Maximum vitality without talent- or job-based modifiers + + + + + Was the character in full health at the beginning of the frame? + + + + + Get the total strength of the afflictions of a specific type attached to a specific limb + + Type of the affliction + The limb the affliction is attached to + Does the affliction have to be attached to only the specific limb. + Most monsters for example don't have separate healths for different limbs, essentially meaning that every affliction is applied to every limb. + + + + 0-1. + + + + + How much vitality the affliction reduces, taking into account the effects of vitality modifiers on the limb the affliction is on (if limb-based) + + + + + Get the identifiers of the items that can be used to treat the character. Takes into account all the afflictions the character has, + and negative treatment suitabilities (e.g. a medicine that causes oxygen loss may not be suitable if the character is already suffocating) + + A dictionary where the key is the identifier of the item and the value the suitability + If true, the suitability values are normalized between 0 and 1. If not, they're arbitrary values defined in the medical item XML, where negative values are unsuitable, and positive ones suitable. + If above 0, the method will take into account how much currently active status effects while affect the afflictions in the next x seconds. + + + + Automatically filters out buffs. + + + + + Returns true if the type or the identifier matches the defined types/identifiers. + + + + + Tag -> priority. + + + + + Note that different limbs can share the same deformations. + Use ragdoll.SpriteDeformations for a collection that cannot have duplicates. + + + + + Get the full path of a limb sprite, taking into account tags, gender and head id + + + + + Note that during the limb initialization, character.AnimController returns null, whereas this field is already assigned. + + + + + Returns true if the attack successfully hit something. If the distance is not given, it will be calculated. + + + + + Attach the limb to a target with WeldJoints. + Uses sim units. + + + + + A class used for handling special key actions in chat boxes. + For example tab completion or up/down arrow key history. + + + + Keep track of the registered fields so we don't register them twice + I couldn't figure out where to register this in where it wouldn't register twice + It's probably not the most optimal way of doing this so feel free to change this + where I'm utilizing this + + + + Registers special input actions to the selected input field + + GUI Element we want to register + Instance + + + + Call this function whenever we should stop doing special stuff and return normal behavior. + For example when you deselect the chat box. + + + + + Scroll up or down on the message history and return a message + + Direction we want to scroll the stack + Leftover text that is in the chat box when we override it + A message or null + + + + Prefer FromPath<T> when possible, this just exists + for cases where the type can only be decided at runtime + + + + + Class dedicated to transitioning away from the old, shitty + Mods + Submarines folders to the new LocalMods folder + + + + + Executed when a client uses the command. If not set, the command is relayed to the server as-is. + + + + + Using a command that's considered a cheat disables achievements + + + + + Use this constructor to create a command that executes the same action regardless of whether it's executed by a client or the server. + + + + + Other events can't trigger conversations if some other event has triggered one within this time. + Intended to prevent multiple events from triggering conversations at the same time. + + + + + Registers the exhaustible events in the level as exhausted, and adds the current events to the event history + + + + + Finds all actions in a ScriptedEvent + + + + + Get the entity that should be used in determining how far the player has progressed in the level. + = The submarine or player character that has progressed the furthest. + + + + + The list order is important. + It defines the order in which we "override" in case no valid position types are found + in the level when generating them in . + + + + + Percentage. Value between 0 and 1. + + + + + Is the mission at a state at which the only thing left to do is to reach the end of the level? + + + + + Is the mission at a state at which the mission cannot be completed anymore? + + + + + Returns the amount of marks you get from the reward (e.g. "3,000 mk") + + + + + Returns the full reward text of the mission (e.g. "Reward: 2,000 mk" or "Reward: 500 mk x 2 (out of max 5) = 1,000 mk") + + + + + The reward that was actually given from completing the mission, taking any talent bonuses into account + (some of which may not be possible to determine in advance) + + + + + Where was this mission received from? Affects which faction we give reputation for if the mission is configured to give reputation for the faction that gave the mission. + Defaults to Locations[0] + + + + + Triggers the event or adds it to the delayedTriggerEvents it if it has a delay + + + + + Triggers the event immediately, ignoring any delays + + + + + End the mission and give a reward if it was completed successfully + + + + + Get the final reward, taking talent bonuses into account if the mission has concluded and the talents modified the reward accordingly. + + + + + Calculates the final reward after talent bonuses have been applied. Note that this triggers talent effects of the type OnGainMissionMoney, + and should only be called once when the mission is completed! + + + + + If enabled, locations this mission takes place in cannot change their type + + + + + The mission can only be received when travelling from a location of the first type to a location of the second type + + + + + The mission can only be received in these location types + + + + + Show entities belonging to these sub categories when the mission starts + + + + + Note that the integer values matter here: the state of the target can't go back to a smaller value, + and a larger or equal value than the RequiredRetrievalState means the item counts as retrieved + (if the item needs to be picked up to be considered retrieved, it's also considered retrieved if it's in the sub) + + + + + Does the target need to be picked up or brought to the sub for mission to be considered successful. + If None, the target has no effect on the completion of the mission. + + + + + Status effects executed on the target item when the mission starts. A random effect is chosen from each child list. + + + + + Renders the font into at least one texture atlas, which is simply a collection of all glyphs in the ranges defined by charRanges. + Don't call this too often or with very large sizes. + + Graphics device, required to create textures. + Character ranges between each even element with their corresponding odd element. Default is 0x20 to 0xFFFF. + Texture dimensions. Default is 512x512. + Base character used to shift all other characters downwards when rendering. Defaults to T. + + + + Wraps a string of text to fit within a given width. + Optionally returns the caret position of a certain character, + or all of them. + + + + + No attempt to contact the consent server has been made + + + + + An error occurred while attempting to retrieve consent status + + + + + The consent status was not saved on the remote database + + + + + The user explicitly denied consent + + + + + The user explicitly granted consent + + + + + Sets the consent status. This method cannot be called to + set the status to Consent.Yes; only a positive response from + the database or the user accepting via the privacy policy + prompt should enable it. + + + + + Implementation of the bulk of SetConsent. + DO NOT CALL THIS UNLESS NEEDED. + + + + + Adds an error event to GameAnalytics if an event with the same identifier has not been added yet. + + + + + Doesn't automatically enable los or bot AI or do anything like that. Probably not fully implemented. + + + + + Allows the game to perform any initialization it needs to before starting to run. + This is where it can query for any required services and load any non-graphic + related content. Calling base.Initialize will enumerate through any components + and initialize them as well. + + + + + LoadContent will be called once per game and is the place to load + all of your content. + + + + + UnloadContent will be called once per game and is the place to unload + all content. + + + + + Allows the game to run logic such as updating the world, + checking for collisions, gathering input, and playing audio. + + Provides a snapshot of timing values. + + + + This is called when the game should draw itself. + + + + + Entity sold in SP. Or, entity sold by client and confirmed by server in MP. + + + + + Entity sold by client in MP. Client has received at least one update from server after selling, but this entity wasn't yet confirmed. + + + + + Entity sold by client in MP. Client hasn't yet received an update from server after selling. + + + + + Present only in single player games. In multiplayer. The chatbox is found from GameSession.Client. + + + + + This property stores the preference in settings. Don't use for automatic logic. + Use AutoShowCrewList(), AutoHideCrewList(), and ResetCrewList(). + + + + + Add character to the list without actually adding it to the crew + + + + + Sets which character is selected in the crew UI (highlight effect etc) + + + + + Adds the message to the single player chatbox. + + + + + Sets the character's current order (if it's close enough to receive messages from orderGiver) and + displays the order in the crew UI + + + + + Displays the specified order in the crew UI next to the character. + + + + + node.Color = node.HighlightColor * nodeColorMultiplier + + + + + The order giver doesn't need to be set for the Order instances as it will be set when the node button is clicked. + + + + + Create order nodes based on the item context + + + The order giver doesn't need to be set for the Order instances as it will be set when the node button is clicked. + + + + Use a negative value (e.g. -1) if there should be no hotkey associated with the node + + + + Create node icon with a fixed absolute size + + + + + Enables/disables report buttons when needed + + + + + Remove info of a selected character. The character will not be visible in any menus or the round summary. + + + + + + Remove the character from the crew (and crew menus). + + The character to remove + If the character info is also removed, the character will not be visible in the round summary. + + + + Gets the current personal wallet + In singleplayer this is the campaign bank and in multiplayer this is the personal wallet + + + + + There is a server-side implementation of the method in + + + + The location that's displayed as the "current one" in the map screen. Normally the current outpost or the location at the start of the level, + but when selecting the next destination at the end of the level at an uninhabited location we use the location at the end + + + + + Automatically cleared after triggering -> no need to unregister + + + + + Load the first level and start the round after loading a save file + + + + + Which type of transition between levels is currently possible (if any) + + + + + Which submarine is at a position where it can leave the level and enter another one (if any). + + + + + Updates store stock before saving the game + + + + + Returns a random faction based on their ControlledOutpostPercentage + + If true, the method can return null if the sum of the factions ControlledOutpostPercentage is less than 100% + + + + Returns a random faction based on their SecondaryControlledOutpostPercentage + + If true, the method can return null if the sum of the factions SecondaryControlledOutpostPercentage is less than 100% + + + + Also serializes the current sub. + + + + + Loads the campaign from an XML element. Creates the map if it hasn't been created yet, otherwise updates the state of the map. + + + + + Instantiates a new single player campaign + + + + + Loads a previously saved single player campaign from XML + + + + + Start a completely new single player campaign + + + + + Load a previously saved single player campaign from xml + + + + + + + Start a new GameSession. Will be saved to the specified save path (if playing a game mode that can be saved). + + + + + Start a new GameSession with a specific pre-selected mission. + + + + + Load a game session from the specified XML document. The session will be saved to the specified path. + + + + + Switch to another submarine. The sub is loaded when the next round starts. + + + + + Returns a list of crew characters currently in the game with a given filter. + + Character type filter + + + In singleplayer mode the CharacterType.Player returns the currently controlled player. + + + + + Hints that have already been shown this round and shouldn't be shown shown again until the next round + + + + + Seconds before any reminders can be shown + + + + + Seconds before another reminder can be shown + + + + + Create the objective list that holds the objectives (called on start and on resolution change) + + + + + Stops content running and adds the active segment to the objective list + + + + + Adds the segment to the objective list + + + + + + This class handles all upgrade logic. + Storing, applying, checking and validation of upgrades. + + + Upgrades are applied per item basis meaning each item has their own set of slots for upgrades. + The store applies upgrades globally to categories of items so the purpose of this class is to keep those individual "upgrade slots" in sync. + The target level of an upgrade is stored in the metadata and is what the store displays and modifies while this class will make sure that + the upgrades on the items match the values stored in the metadata. + + + + + This one toggles whether or not connected submarines get upgraded too. + Could probably be removed, I just didn't like magic numbers. + + + + + This is used by the client in multiplayer, acts like a secondary PendingUpgrades list + but is not affected by server messages. + + + Not used in singleplayer. + + + + + This is used by the client to notify the server which upgrades are yet to be paid for. + + + In singleplayer this does nothing. + + + + + Purchases an upgrade and handles logic for deducting the credit. + + + Purchased upgrades are temporarily stored in and they are applied + after the next round starts similarly how items are spawned in the stowage room after the round starts. + + + + + Purchases an item swap and handles logic for deducting the credit. + + + + + Cancels the currently pending item swap, or uninstalls the item if there's no swap pending + + + + + Applies all our pending upgrades to the submarine. + + + Upgrades are applied similarly to how items on the submarine are spawned at the start of the round. + Upgrades should be applied at the start of the round and after the round ends they are written into + the submarine save and saved there. + Because of the difficulty of accessing the actual Submarine object from and outpost or when the campaign UI is created + we modify levels that are shown on the store interface using campaign metadata. + + This method should be called by both the client and the server during level generation. + + + + + Makes the NPC talk or if no NPC has been specified find the upgrade NPC and make it talk. + + + + Optional NPC to make talk, if null tries to find one at the outpost. + + This might seem a bit spaghetti but it's the only way I could figure out how to do this and make it work + in both multiplayer and singleplayer because in multiplayer the client doesn't have access to SubmarineInfo.OutpostNPCs list + so we cannot find the upgrade NPC using that and the client cannot use Character.Speak anyways in multiplayer so the alternative + is to send network packages when interacting with the NPC. + + + + + Validates that upgrade values stored in CampaignMetadata matches the values on the submarine and fixes any inconsistencies. + Should be called after every round start right after + + + + + Applies an upgrade on the submarine, should be called by when the round starts. + + + + + + New level that was applied, -1 if no upgrades were applied. + + + + Gets the progress that is shown on the store interface. + Includes values stored in the metadata and , and takes submarine tier and class restrictions into account + + Submarine used to determine the upgrade limit. If not defined, will default to the current sub. + + + + Gets the level of the upgrade that is stored in the metadata. May be higher than the apparent level on the current sub if the player has switched to a lower-tier sub + + + + + Gets the level of the upgrade that is stored in the metadata. Takes into account the limits of the provided submarine. + + + + + Stores the target upgrade level in the campaign metadata. + + + + + Used to sync the pending upgrades list in multiplayer. + + + + + + Notify the server of crew changes + + When set to true will tell the server to update the pending hires + When not null tell the server to rename this character. Item1 is the character to rename, Item2 is the new name, Item3 indicates whether the renamed character is already a part of the crew. + When not null tell the server to fire this character + When set to true will tell the server to validate pending hires + + + + A horizontal scaling factor for low aspect ratios (small width relative to height) + + + + + Has the selected Screen changed since the last time the GUI was drawn. + + + + + By default, all the gui elements are drawn automatically in the same order they appear on the update list. + + + + + Adds the component on the addition queue. + Note: does not automatically add children, because we might want to enforce a custom order for them. + + + + + Adds the component on the removal queue. + Removal list is evaluated last, and thus any item on both lists are not added to update list. + + + + + Updated automatically before updating the elements on the update list. + + + + + Set the cursor to an hourglass. + Will automatically revert after 10 seconds or when is called. + + + + Should the indicator move based on the camera position? + Override the distance-based alpha value with the specified alpha value + + + + Draws a bezier curve with dots. + + + + + Creates multiple buttons with relative size and positions them automatically. + + + + + Creates multiple buttons with absolute size and positions them automatically. + + + + + Creates multiple elements with relative size and positions them automatically. + + + + + Creates multiple elements with absolute size and positions them automatically. + + + + + Attempts to move a set of UI elements further from each other to prevent them from overlapping + + UI elements to move + Areas the UI elements are not allowed to overlap with (ignored if null) + The elements will not be moved outside this area. If the parameter is not given, the elements are kept inside the window. + + + + Displays a message at the center of the screen, automatically preventing overlapping with other centered messages. TODO: Allow to show messages at the middle of the screen (instead of the top center). + + + + + Returns all child elements in the hierarchy. + + + + + Currently only used for the fade effect in GUIListBox, should be set to the same value as Color but only assigned once + + + + + This is the new constructor. + + + + + Only GUI should call this method. Auto updating follows the order of GUI update list. This order can be tweaked by changing the UpdateOrder property. + + + + + By default, all the gui elements are updated automatically in the same order they appear on the update list. + + + + + Updates all the children manually. + + + + + Only GUI should call this method. Auto drawing follows the order of GUI update list. This order can be tweaked by changing the UpdateOrder property. + + + + + By default, all the gui elements are drawn automatically in the same order they appear on the update list. + + + + + Draws all the children manually. + + + + + Creates and draws a tooltip. + + + + + Creates a context menu. This constructor does not make the context menu active. + Use to make right click context menus. + + Position at which to create the context menu + Header text + Background style + list of context menu options + + + + Inflates a point by the size of the text + + Pint to resize + String whose size to inflate by + What font to use + The size of the text + + + + Checks if the mouse cursor is over this context menu or any of its sub menus + + + + + + GUIComponent that can be used to render custom content on the UI + + + + + Finds the component after which the listbox should be drawn + //(= the component highest in the hierarchy, to get the listbox + //to be rendered on top of all of it's children) + + + + + Note that stretching cannot be undone, because the previous child sizes are not stored. + + + + + A frame drawn behind the content of the listbox + + + + + A frame that contains the contents of the listbox. The frame itself is not rendered. + + + + + Scrolls the list smoothly + + + + + Whether to only allow scrolling from one element to the next when smooth scrolling is enabled + + + + + When set to true elements at the bottom of the list are gradually faded + + + + + Adds enough extra padding to the bottom so the end of the scroll will only contain the last element + + + + + When set to true always selects the topmost item on the list + + + + + true if mouse down should select elements instead of mouse up + + + + + Disables the scroll bar without hiding it. + + + + + Automatically hides the scroll bar when the content fits in. + + + + + Setting this to true and CanBeFocused to false allows the list background to be unfocusable while the elements can still be interacted with. + + + + For horizontal listbox, default side is on the bottom. For vertical, it's on the right. + + + + Scrolls the list to the specific element. + + + + + + Close the message box automatically after enough time has passed () + + + + + Close the message box automatically if the condition is met + + + + + Use to create a message box of Hint type + + + + + Parent does not matter. It's overridden. + + + + + If enabled, the value wraps around to Max when you go below Min, and vice versa + + + + + Calculates one percent between the range as the increment/decrement. + This value is rounded so that the bigger it is, the less decimals are used (min 0, max 3). + Return value is clamped between 0.1f and 1000. + + + + + Get the area the slider should be drawn inside + + 0 = empty, 1 = full + + + + ListBoxes with lots of content in them clamp the size of the scrollbar above a certain minimum size; this is the relative bar size without the clamping applied. + + + + + General green color used for elements whose colors are set from code + + + + + General red color used for elements whose colors are set from code + + + + + General red color used for elements whose colors are set from code + + + + + General blue color used for elements whose colors are set from code + + + + + General yellow color used for elements whose colors are set from code + + + + + Color to display the name of modded servers in the server list. + + + + + When enabled, the text is automatically scaled down to fit the textblock horizontally. + + + + + When enabled, the text is automatically scaled down to fit the textblock vertically. + + + + + This is the new constructor. + If the rectT height is set 0, the height is calculated from the text. + + + + + Overrides the color for all the states. + + + + + Set the text scale of the GUITextBlocks so that they all use the same scale and can fit the text within the block. + + + + + Set the text scale of the GUITextBlocks so that they all use the same scale and can fit the text within the block. + + + + + Set the text scale of the GUITextBlocks so that they all use the same scale and can fit the text within the block. + + + + + Don't set the Text property on delegates that register to this event, because modifying the Text will launch this event -> stack overflow. + If the event launches, the text should already be up to date! + + + + + Triplet.first = filepath, Triplet.second = resolution, Triplet.third = audio gain + + + + + Uses Linq queries. Don't use too frequently or reimplement. + + + + + Should be assigned only by GUIComponent. + Note that RectTransform is created first and the GUIComponent after that. + This means the GUIComponent is not set before the GUIComponent is initialized. + + + + + Relative to the parent rect. + + + + + Min size in pixels. + Does not affect scaling. + + + + + Max size in pixels. + Does not affect scaling. + + + + + Size before scale multiplications. + + + + + Size after scale multiplications. + + + + + Applied to all RectTransforms. + The elements are not automatically resized, if the global scale changes. + You have to manually call RecalculateScale() for all elements after changing the global scale. + This is because there is currently no easy way to inform all the elements without having a reference to them. + Having a reference (static list, or event) is problematic, because deconstructing the elements is not handled manually. + This means that the uncleared references would bloat the memory. + We could recalculate the scale each time it's needed, + but in that case the calculation would need to be very lightweight and garbage free, which it currently is not. + + + + + Defined as portions of the parent size. + Also the direction of the offset is relative, calculated away from the anchor point. + + + + + Absolute in pixels but relative to the anchor point. + Calculated away from the anchor point, like a padding. + Use RelativeOffset to set an amount relative to the parent size. + + + + + Screen space offset. From top left corner. In pixels. + + + + + Calculated from the selected pivot. In pixels. + + + + + Screen space point in pixels. + + + + + Does not automatically calculate children. + Note also that if you change the pivot point with this property, the pivot does not automatically match the anchor. + You can use SetPosition to change everything automatcally or MatchPivotToAnchor to match the pivot to anchor. + + + + + Does not automatically calculate children. + Note also that if you change the anchor point with this property, the pivot does not automatically match the anchor. + You can use SetPosition to change everything automatically or MatchPivotToAnchor to match the pivot to anchor. + + + + + The element provided as the argument is the changed child. It may be new in the hierarchy or just repositioned. + + + + + By default, elements defined with an absolute size (in pixels) will scale with the parent. + This can be changed by setting IsFixedSize to true. + + + + + If false, the element will resize if the parent is resized (with the children). + If true, the element will resize only when explicitly resized. + Note that scaling always affects the elements. + + + + + Currently this needs to be manually called only when the global scale changes. + If the local scale changes, the scale is automatically recalculated. + + + + + Manipulates ScreenSpaceOffset. + If you want to manipulate some other offset, access the property setters directly. + + + + + Returns all parent elements in the hierarchy. + + + + + Returns all child elements in the hierarchy. + + + + + Converts the offset so that the direction is always away from the anchor point. + + + + + The elements are not automatically resized, if the global scale changes. + You have to manually call RecalculateScale() for all elements after changing the global scale. + This is because there is currently no easy way to inform all the elements without having a reference to them. + Having a reference (static list, or event) is problematic, because deconstructing the elements is not handled manually. + This means that the uncleared references would bloat the memory. + We could recalculate the scale each time it's needed, + but in that case the calculation would need to be very lightweight and garbage free, which it currently is not. + + + + + Sprite batch extensions for drawing primitive shapes + Modified from: https://github.com/craftworkgames/MonoGame.Extended/blob/develop/Source/MonoGame.Extended/ShapeExtensions.cs + + + + + Draws a closed polygon from a shape + + + + + Draws a closed polygon from an array of points + + + + + Draws a closed polygon from an array of points + + + + + Draws a line from point1 to point2 with an offset + + + + + Draws a line from point1 to point2 with an offset + + + + + Draws a line from point1 to point2 with an offset + + + + + Draws a point at the specified x, y position. The center of the point will be at the position. + + + + + Draws a point at the specified position. The center of the point will be at the position. + + + + + Original source: https://github.com/craftworkgames/MonoGame.Extended/blob/develop/Source/MonoGame.Extended/Shapes/Polygon.cs + + + + + Can be null when there are no deals at the current location + + + + + Can be null when there are no deals at the current location + + + + + Can be null when there are no deals at the current location + + + + + Buy items from the store + + + + + Sell items from the character inventory + + + + + Sell items from the sub + + + + + Select an element from CrewListFrame + + + + + The size of fixed area around the slice area + + + + + How much the borders of a sliced sprite are allowed to scale + You may for example want to prevent a 1-pixel border from scaling down (and disappearing) on small resolutions + + + + + How much the borders of a sliced sprite are allowed to scale + You may for example want to prevent a 1-pixel border from scaling down (and disappearing) on small resolutions + + + + + Get the scale of the sliced sprite's borders when it's draw inside an area of a specific size + + + + + While set to true any call to will cause the buy button to be disabled and to not update the prices. + This is to prevent us from buying another upgrade before the server has given us the new prices and causing potential syncing issues. + + + + + Creates vertices for the submarine border that we use to draw it and check mouse collision + + + + + Most of this code is copied from the status terminal but instead of drawing a line from X to Y + we create a rotated rectangle instead and store the 4 corners into the array. + + + + + Gets all "points of interest" GUIFrames on the upgrade preview interface that match the corresponding upgrade category. + + + + + + + Used only for circles. + + + + + Currently used only for rectangles. + + + + + Flash the slots the item is allowed to go in (not taking into account whether there's already something in those slots) + + + + + Can the inventory be accessed when the character is still alive + + + + + Can the inventory be accessed by the character itself when the character is still alive (only has an effect if AccessibleWhenAlive false) + + + + + If there is no room in the generic inventory (InvSlotType.Any), check if the item can be auto-equipped into its respective limbslot + + + + + If there is room, puts the item in the inventory and returns true, otherwise returns false + + + + + Discharge coil only draws power when charging + + + + + Updates plant's state to fully grown or dead depending on its conditions. + + True if the plant has finished growing. + + + + The base class for components holding the different functionalities of the item + + + + + Overload this method and implement. The method is automatically called when the resolution changes. + + + + + Launches when the parent of the GuiFrame is changed. + + + + + Which sound should be played when manual sound selection type is selected? Not [Editable] because we don't want this visible in the editor for every component. + + + + + Can be used by status effects or conditionals to the speed of the item + + + + a Character has picked the item + + + a Character has dropped the item + + + true if the operation was completed + + + + Remove the component so that it doesn't appear to exist in the game world (stop sounds, remove bodies etc) + but don't reset anything that's required for cloning the item + + + + + Returns 0.0f-1.0f based on how well the Character can use the itemcomponent + + 0.5f if all the skills meet the skill requirements exactly, 1.0f if they're way above and 0.0f if way less + + + + Returns 0.0f-1.0f based on how well the Character can use the itemcomponent + + 0.5f if all the skills meet the skill requirements exactly, 1.0f if they're way above and 0.0f if way less + + + + Only checks if any of the Picked requirements are matched (used for checking id card(s)). Much simpler and a bit different than HasRequiredItems. + + + + + Called when all items have been loaded. Use to initialize connections between items. + + + + + Called when all the components of the item have been loaded. Use to initialize connections between components and such. + + + + + Can be used to set the sprite depth individually for each contained item + + + + + Depth at which the contained sprites are drawn. If not set, the original depth of the item sprites is used. + + + + + The capacity of the main container without taking the sub containers into account. Only differs when there's a sub container defined for the component. + + + + + Can be used by status effects to lock the inventory + + + + + Returns the index of the first slot whose restrictions match the specified tag or identifier + + + + + The current multiplier for the light color (usually equal to , but in the case of e.g. blinking lights the multiplier + doesn't go to 0 when the light turns off, because otherwise it'd take a while for it turn back on based on the lightBrightness which is interpolated + towards the current voltage). + + + + + Reset client-side prediction of the light's state to the last known state sent by the server after resetPredictionTimer runs out + + + + + The current brightness of the light source, affected by powerconsumption/voltage + + + + + Move items towards the last slot in the inventory if there's free slots + + + + + Power consumption of the engine. Only consume power when active and adjust consumption based on condition and target force. + + + + + When grid is resolved update the previous voltage + + + + + Power consumption of the fabricator. Only consume power when active and adjust consumption based on condition. + + + + + Move the items required for fabrication into the input container. + The method assumes that all the required ingredients are available either in the input container or linked containers. + + + + + Power consumption of the MiniMap. Only consume power when active and adjust consumption based on condition. + + + + + Power consumption of the Pump. Only consume power when active and adjust consumption based on condition. + + + + + Returns a negative value (indicating the reactor generates power) when querying the power output connection. + + + + + Min and Max power output of the reactor based on tolerance + + + + + Determine how much power to output based on the load. The load is divided between reactors according to their maximum output in multi-reactor setups. + + + + + Do we need more fuel to generate enough power to match the current load. + + How low we allow the output/load ratio to go before loading more fuel. + 1.0 = always load more fuel when maximum output is too low, 0.5 = load more if max output is 50% of the load + + + + Can be null if the property HasMineralScanner is false + + + + + Based largely on existing CheckBlipVisibility() code + + + + Accessed through event actions. Do not remove even if there are no references in code. + + + + Power consumption of the sonar. Only consume power when active and adjust the consumption based on the sonar mode. + + + + + Can be used by status effects to disable all the UI controls + + + + + Makes the sonar view CustomComponent render the steering HUD, preventing it from being drawn behing the sonar + + + + + How fast the steering vector adjusts when the nav terminal is operated by something else than a character (= signals) + + + + + Get optimal velocity for moving towards a position + + Position to steer towards to + How heavily the sub slows down when approaching the target + + + + + Attempts to harvest a fully grown plant or removes a decayed plant if any + + The character who gets the produce or null if they should drop on the floor. + + + + + Returns the power consumption if checking the powerIn connection, or a negative value if the output can provide power when checking powerOut. + Power consumption is proportional to set recharge speed and if there is less than max charge. + + + + + Minimum and maximum output for the queried connection. + Powerin min max equals CurrPowerConsumption as its abnormal for there to be power out. + PowerOut min power out is zero and max is the maxout unless below 10% charge where + the output is scaled relative to the 10% charge. + + Connection being queried + Current grid load + Minimum and maximum power output for the connection + + + + Finalized power out from the container for the connection, provided the given grid information + Output power based on the maxpower all batteries can output. So all batteries can + equally share powerout based on their output capabilities. + + + + + + + + + + When the corresponding grid connection is resolved, adjust the container's charge. + + + + + List of all powered ItemComponents + + + + + The amount of power currently consumed by the item. Negative values mean that the item is providing power to connected items + + + + + Current voltage of the item (load / power) + + + + + The minimum voltage required for the item to work + + + + + The maximum amount of power the item can draw from connected items + + + + + Maximum voltage factor when the device is being overvolted. I.e. how many times more effectively the device can function when it's being overvolted + + + + + Essentially Voltage / MinVoltage (= how much of the minimum required voltage has been satisfied), clamped between 0 and 1. + Can be used by status effects or sounds to check if the item has enough power to run + + + + + Allocate electrical devices into their grids based on connections + + Use previous grids and change in connections + + + + Update the power calculations of all devices and grids + Updates grids in the order of + ConnCurrConsumption - Get load of device/ flag it as an outputting connection + -- If outputting power -- + MinMaxPower - Minimum and Maximum power output of the connection for devices to coordinate + ConnPowerOut - Final power output based on the sum of the MinMaxPower + -- Finally -- + GridResolved - Indicate that a connection's grid has been finished being calculated + + Power outputting devices are calculated in stages based on their priority + Reactors will output first, followed by relays then batteries. + + + + + + + Current power consumption of the device (or amount of generated power if negative) + + Connection to calculate power consumption for. + + + + Minimum and maximum power the connection can provide + + Connection being queried about its power capabilities + Load of the connected grid + + + + Finalize how much power the device will be outputting to the connection + + Connection being queried + Current grid power + Current load on the grid + Power pushed to the grid + + + + Can be overridden to perform updates for the device after the connected grid has resolved its power calculations, i.e. storing voltage for later updates + + + + + Returns the amount of power that can be supplied by batteries directly connected to the item + + + + + Returns a list of batteries directly connected to the item + + + + + Additional load coming from somewhere else than the devices connected to the junction box (e.g. ballast flora or piezo crystals). + Goes back to zero automatically if you stop setting the value. + + + + + The item that launched this projectile (if any) + + + + + Should the collision with the target submarine be ignored (e.g. did the projectile collide with the wall behind the turret when being launched) + + Fixture the projectile hit + Contact between the projectile and the target + True if the target isn't a submarine or if the collision happened behind the launch position of the projectile + + + + Get a random quality for an item spawning in some sub, taking into account the type of the submarine and the difficulty of the current level + (high-quality items become more common as difficulty increases) + + + + + Check if the character manages to succesfully repair the item + + + + + Should the progress bar be displayed. Use when AlwaysDisplayProgressBar is set to false. + + + + + Wires that have been disconnected from the panel, but not removed completely (visible at the bottom of the connection panel). + + + + + Allows rewiring the connection panel despite rewiring being disabled on a server + + + + + Check if the character manages to succesfully rewire the panel, and if not, apply OnFailure effects + + + + + Pass the parent component to the constructor to access the serializable properties + for elements which change property values. + + + + + Can be used to display messages on the terminal via status effects + + + + + Returns the wifi components that can receive signals from this one + + + + + Returns the wifi components that can transmit signals to this one + + + + + Effects applied to entities inside the trigger + + + + + Attacks applied to entities inside the trigger + + + + + Returns correct angle between -2PI and +2PI + + + + + + + Turret doesn't consume grid power, directly takes from the batteries on its grid instead. + + + + + Can be used by status effects + + + + + Automatically cleared after docking -> no need to unregister + + + + + Automatically cleared after undocking -> no need to unregister + + + + + Returns a random side that is not occupied. + + + There is probably a much better way of doing this than allocating memory with an array + but this felt like the most reliable approach I could come up with. + + + + + + Defines items that boost the weapon functionality, like battery cell for stun batons. + + + + + Activate sleeping ragdolls that are close enough to hit with the weapon (otherwise the collision will not be registered) + + + + + The extents of the sprites or other graphics this component needs to draw. Used to determine which items are visible on the screen. + + + + + Power consumption of the Oxygen Generator. Only consume power when active and adjust consumption based on condition. + + + + + Order in which power sources will provide to a grid, lower number is higher priority + + + + + Used by reactors to communicate their maximum output to each other so they can divide the grid load between each other in a sensible way + + + + + Relay power consumption. Load consumption is based on the internal buffer. + This allows for the relay to react to demand and find equilibrium in loop configurations. + + + + + Minimum and maximum power out for the relay. + Max out is adjusted to allow for other relays to compensate if this relay is undervolted. + + + + + Power out for the relay connection. + Relay will output the necessary power to the grid based on maximum power output of other + relays and will undervolt and overvolt the grid following its supply grid. + + Power outputted to the grid + + + + Connection's grid resolved, determine the difference to be added to the buffer. + Ensure the prevVoltage voltage is updated once both grids are resolved. + + + + + Moves the current border highlight animation (if one is running) to the new slot + + + + + If set, the inventory is automatically positioned inside the rect + + + + + Check if the mouse is hovering on top of the slot + + The desired slot we want to check + True if our mouse is hover on the slot, false otherwise + + + + Refresh the value of IsMouseOnInventory + + + + + Is the mouse on any inventory element (slot, equip button, subinventory...) + + + + Defaults to if null + + + + Removes one item from the slot + + + + + Removes all items from the slot + + + + + All items contained in the inventory. Stacked items are returned as individual instances. DO NOT modify the contents of the inventory while enumerating this list. + + + + + All items contained in the inventory. Allows modifying the contents of the inventory while being enumerated. + + + + + Is the item contained in this inventory. Does not recursively check items inside items. + + + + + Return the first item in the inventory, or null if the inventory is empty. + + + + + Return the last item in the inventory, or null if the inventory is empty. + + + + + Get the item stored in the specified inventory slot. If the slot contains a stack of items, returns the first item in the stack. + + + + + Get all the item stored in the specified inventory slot. Can return more than one item if the slot contains a stack of items. + + + + + Find the index of the first slot the item is contained in. + + + + + Find the indices of all the slots the item is contained in (two-hand items for example can be in multiple slots). Note that this method instantiates a new list. + + + + + Returns true if the item owns any of the parent inventories. + + + + + Can the item be put in the inventory (i.e. is there a suitable free slot or a stack the item can be put in). + + + + + Can the item be put in the specified slot. + + + + + If there is room, puts the item in the inventory and returns true, otherwise returns false + + + + + Is there room to put more items in the inventory. Doesn't take stacking into account by default. + + If true, the inventory is not considered full if all the stacks are not full. + + + + Forces an item to a specific slot. Doesn't remove the item from existing slots/inventories or do any other sanity checks, use with caution! + + + + + Removes an item from a specific slot. Doesn't do any sanity checks, use with caution! + + + + + Deletes all items inside the inventory (and also recursively all items inside the items) + + + + + Reposition currently active item interfaces to make sure they don't overlap with each other + + + + + Items that have one more more Repairable component + + + + + Items that may potentially need to be cleaned up (pickable, not attached to a wall, and not inside a valid container) + + + + + Components that are Active or need to be updated for some other reason (status effects, sounds) + + + + + Removes the override value -> falls back to using the original value defined in the xml. + + + + + Unscaled rect + + + + + Use to also check + + + + Checks both and + + + + Returns interactibility based on whether the character is on a player team + + + + + Can be used by status effects or conditionals to check what item this item is contained inside + + + + + Can be used by status effects or conditionals to check whether the item is contained inside something + + + + + Can be used by status effects or conditionals to the speed of the item + + + + + Can be used by status effects or conditionals to check if the physics body of the item is active + + + + + Should the item's Use method be called with the "Use" or with the "Shoot" key? + + + + + If true, the user has to hold the "aim" key before use is registered. False by default. + + + + + If true, the user has to hold the "aim" key before secondary use is registered. True by default. + + + + + Return true if the condition of this item increased within the last second. + + + + + Per-instance value - if not set, the value of the prefab is used. + + + + + A list of connections the last signal sent by this item went through + + + + + Can be used to move the item from XML (e.g. to correct the positions of items whose sprite origin has been changed) + + + + + Can be used to move the item from XML (e.g. to correct the positions of items whose sprite origin has been changed) + + + + + Creates a new item + + Should the OnItemLoaded methods of the ItemComponents be called. Use false if the item needs additional initialization before it can be considered fully loaded (e.g. when loading an item from a sub file or cloning an item). + + + + Is dropping the item allowed when trying to swap it with the other item + + + + + Recheck if the item needs to be included in the list of cleanable items + + + + + goes through every item and re-checks which hull they are in + + + + + Recalculates the item's maximum condition, condition percentage and whether it's in full condition. + You generally never need to call this manually - done automatically when any of the factors that affect the values change. + + + + + Applies buoyancy, drag and angular drag caused by water + + + + + Note: This function generates garbage and might be a bit too heavy to be used once per frame. + + + + + Note: This function generates garbage and might be a bit too heavy to be used once per frame. + + + + + Character who dropped the item + Should clients be notified of the item being dropped + Should the transform of the physics body be updated. Only disable this if you're moving the item somewhere else / calling SetTransform manually immediately after dropping! + + + + Instantiate a new item and load its data from the XML element. + + The element containing the data of the item + The submarine to spawn the item in (can be null) + Should an EntitySpawner event be created to notify clients about the item being created. + + + + + Remove the item so that it doesn't appear to exist in the game world (stop sounds, remove bodies etc) + but don't reset anything that's required for cloning the item + + + + + Any item with a Price element in the definition can be sold everywhere. + + + + + Defines areas where the item can be interacted with. If RequireBodyInsideTrigger is set to true, the character + has to be within the trigger to interact. If it's set to false, having the cursor within the trigger is enough. + + + + + Is this prefab overriding a prefab in another content package + + + + + How likely it is for the item to spawn in a level of a given type. + + + + + Can the item be chosen as extra cargo in multiplayer. If not set, the item is available if it can be bought from outposts in the campaign. + + + + + Update which branches are currently in range of fires + + + + + Create a body for a branch which works as the hitbox for flamer + + + + + + Decorative branches that grow around the root + + + + + How far from the root this branch is + + + + + Returns a dictionary where the keys are the structures that took damage and the values are the amount of damage taken + + + + + "Diagonal" gaps are used on sloped walls to allow characters to pass through them either horizontally or vertically. + Water still flows through them only horizontally or vertically + + + + + Inherited flags from outpost generation. + + + + + Approximate distance from this hull to the target hull, moving through open gaps without passing through walls. + Uses a greedy algo and may not use the most optimal path. Returns float.MaxValue if no path is found. + + + + + Returns the hull which contains the point (or null if it isn't inside any) + + The position to check + This hull is checked first: if the current hull is known, this can be used as an optimization + Should world coordinates or the sub's local coordinates be used? + Does being exactly at the edge of the hull count as being inside? + + + + Returns the hull which contains the point (or null if it isn't inside any). The difference to FindHull is that this method goes through all hulls without trying + to first find the sub the point is inside and checking the hulls in that sub. + = This is slower, use with caution in situations where the sub's extents or hulls may have changed after it was loaded. + + + + + Is this hull or any of the items inside it tagged as "airlock"? + + + + + Does this hull have any doors leading outside? + + Used to check if this character has access to the door leading outside + + + + Overrides the commonness of the object in a specific level type. + Key = name of the level type, value = commonness in that level type. + + + + + Makes the cell rounder by subdividing the edges and offsetting them at the middle + + How small the individual subdivided edges can be (smaller values produce rounder shapes, but require more geometry) + + + + How far outside the boundaries of the level the water current that pushes subs towards the level starts + + + + + How far outside the boundaries of the level the strength of the current starts to increase exponentially + + + + + How far outside the boundaries of the level the current stops submarines entirely + + + + + The level generator won't try to adjust the width of the main path above this limit. + + + + + The crush depth of a non-upgraded submarine in in-game coordinates. Note that this can be above the top of the level! + + + + + The crush depth of a non-upgraded submarine in "real world units" (meters from the surface of Europa). Note that this can be above the top of the level! + + + + + Random integers generated during the level generation. If these values differ between clients/server, + it means the levels aren't identical for some reason and there will most likely be major ID mismatches. + + + + + Is there a loaded level set and is it an outpost? + + + + + Is there a loaded level set, and is it a friendly outpost (FriendlyNPC or Team1) + + + + + Can be null unless initialized in constructor + + + + List is initialized only when specified, otherwise will be null + + + Used by clients to set the rotation for the resources + + + + Calculate the "real" depth in meters from the surface of Europa + + + + + Checks which level objects are in camera view and adds them to the visibleObjects lists + + + + + Draw the objects behind the level walls + + + + + Draw the objects in front of the level walls, but behind characters + + + + + Draw the objects in front of the level walls and characters + + + + + Only used for editing sprite deformation parameters. The actual LevelObjects use separate SpriteDeformation instances. + + + + + Which sides of a wall the object can appear on. + + + + + Overrides the commonness of the object in a specific level type. + Key = name of the level type, value = commonness in that level type. + + + + + A list of prefabs whose properties override this one's properties when a trigger is active. + E.g. if a trigger in the index 1 of the trigger list is active, the properties in index 1 in this list are used (unless it's null) + + + + + Effects applied to entities that are inside the trigger + + + + + Attacks applied to entities that are inside the trigger + + + + + How long the trigger stays in the triggered state after triggerers have left + + + + + does the force diminish by distance + + + + + Stop applying forces to objects if they're moving faster than this + + + + + Are there any active contacts between the physics body and the target entity + + + + + Another trigger was triggered, check if this one should react to it + + + + + Applies attacks to a damageable. + + + + + Applies attacks to structures. + + + + + The elapsed gametime when the vertices of this hull last changed + + + + + Returns the segments that are facing towards viewPosition + + + + + How many light sources are allowed to recalculate their light volumes per frame. + Pending calculations will be done on subsequent frames, starting from the light sources that have been waiting for a recalculation the longest. + + + + + If zoomed further out than this, characters no longer obstruct lights behind them. + Improves performance, and isn't very noticeable if we do it after zoomed far out enough. + + + + + Background lights are drawn behind submarines and they don't cast shadows. + + + + + Update the contents of ConvexHullList and check if we need to recalculate vertices + + + + + Recheck which convex hulls are in range (if needed), + and check if we need to recalculate vertices due to changes in the convex hulls + + + + + Draws the optional "light sprite", just a simple sprite with no shadows + + + + + + Used for undo/redo to determine what this item has been replaced with + + + + + A method that modifies the draw depth to prevent z-fighting between entities with the same sprite depth + + + + + Update the selection logic in submarine editor + + + + + Updates the logic that runs the highlight box when the mouse is sitting still. + + + + true to give items tooltip showing their connection + + + + Draw the "selection rectangle" and outlines of entities that are being dragged (if any) + + + + + Copy the selected entities to the "clipboard" (copiedList) + + + + + Copy the entities to the "clipboard" (copiedList) and delete them + + + + + copies a list of entities to the "clipboard" (copiedList) + + + + + Find entities whose rect intersects with the "selection rect" + + + + + List of upgrades this item has + + + + + The index of the outpost module this entity originally spawned in (-1 if not an outpost item) + + + + + Adds a new upgrade to the item + + + + + Remove the entity from the entity list without removing links to other entities + + + + + Call Update() on every object in Entity.list + + + + + Flip the entity horizontally + + Should the entity be flipped across the y-axis of the sub it's inside + + + + Flip the entity vertically + + Should the entity be flipped across the x-axis of the sub it's inside + + + + Update the linkedTo-lists of the entities based on the linkedToID-lists + Has to be done after all the entities have been loaded (an entity can't + be linked to some other entity that hasn't been loaded yet) + + + + + Gets all linked entities of specific type. + + + + + Gets all linked entities of specific type. + + + + + Find a matching map entity prefab + + The name of the item (can be omitted when searching based on identifier) + The identifier of the item (if null, the identifier is ignored and the search is done only based on the name) + + + + Find a matching map entity prefab + + A predicate that returns true on the desired prefab. + + + + Links defined to identifiers. + + + + + Check if the name or any of the aliases of this prefab match the given name. + + + + + Initial zoom (0 - 1, from min zoom to max) + + + + + Initial zoom (0 - 1, from min zoom to max) + + + + + Resets and forces crush depth to be calculated again for icon displaying purposes + + + + + From -> To + + + + + Load a previously saved campaign map from XML + + + + + Generate a new campaign map from the seed + + + + + Get the shortest distance from the start location to another location that satisfies the specified criteria. + + The distance to a matching location, or int.MaxValue if none are found. + + + + Load a previously saved map from an xml element + + + + + Load the state of an existing map from xml (current state of locations, where the crew is now, etc). + + + + + Advances the progress of the radiation. + + + + + + Unscaled rect + + + + + In radians, takes flipping into account + + + + + Offset of the physics body from the center of the structure. Takes flipping into account. + + + + + Checks if there's a structure items can be attached to at the given position and returns it. + + + + + Sections that are leaking have a gap placed on them + + + + + If null, the orientation is determined automatically based on the dimensions of the structure instances + + + + + Interval at which we force culled entites to be updated, regardless if the camera has moved + + + + + Margin applied around the view area when culling entities (i.e. entities that are this far outside the view are still considered visible) + + + + + Update entity culling when any corner of the view has moved more than this + + + + + Extents of the solid items/structures (ones with a physics body) and hulls + + + + + Extents of all the visible items/structures/hulls (including ones without a physics body) + + + + + How deep down the sub is from the surface of Europa in meters (affected by level type, does not correspond to "actual" coordinate systems) + + + + + Creates an AI that operates all the turrets on a sub, same as Thalamus but only operates the turrets. + + + + + Returns a rect that contains the borders of this sub and all subs docked to it, excluding outposts + + + + + Don't use this directly, because the list is updated only when GetConnectedSubs() is called. The method is called so frequently that we don't want to create new list here. + + + + + Returns a list of all submarines that are connected to this one via docking ports, including this sub. + + + + + Attempt to find a spawn position close to the specified position where the sub doesn't collide with walls/ruins + + + + + Returns a list of physics bodies the ray intersects with, sorted according to distance (the closest body is at the beginning of the list). + + Can be used to filter the bodies based on some condition. If the predicate returns false, the body isignored. + Should fixtures that the start of the ray is inside be returned + + + + check visibility between two points (in sim units) + + a physics body that was between the points (or null) + + + If has value, the sub must match the team type. + + + + Returns true if the sub is same as the other. + + + + + Finds the sub whose borders contain the position + + + + + Permanently disables obstructed waypoints obstructed by the level. + + + + + Temporarily disables waypoints obstructed by the other sub. + + + + + Only affects temporarily disabled waypoints. + + + + + Extents of the solid items/structures (ones with a physics body) and hulls + + + + + Extents of all the visible items/structures/hulls (including ones without a physics body) + + + + + Moves away any character that is inside the bounding box of the sub (but not inside the sub) + + The translation that was applied to the sub before doing the displacement + (used for determining where to push the characters) + + + + A random int that gets assigned when saving the sub. Used in mp campaign to verify that sub files match + + + + + Note: Refreshed for loaded submarines when they are saved, when they are loaded, and on round end. If you need to refresh it, please use Submarine.CheckFuel() method! + + + + + Calculated from . Can be used when the sub hasn't been loaded and we can't access . + + + + + Only called by a Gap when the state changes. + So in practice used like an event callback, although technically just a method + (It would be cleaner to use an actual event in Gap.cs, but event registering and unregistering might cause an extra hassle) + + + + + How much messages sent by should get garbled. Takes the distance between the entities and optionally the obstructions between them into account (see ). + + Values greater than or equal to 1 cause the message to get garbled more heavily when there's some obstruction between the characters. Values smaller than 1 mean the garbling only depends on distance. + + + + An ID for this client for the current session. + THIS IS NOT A PERSISTENT VALUE. DO NOT STORE THIS LONG-TERM. + IT CANNOT BE USED TO IDENTIFY PLAYERS ACROSS SESSIONS. + + + + + The ID of the account used to authenticate this session. + This value can be used as a persistent value to identify + players in the banlist and campaign saves. + + + + + Data that we've ignored because we're waiting for some earlier data. Key = byte offset, value = the actual data + + + + + Fires when the ClientPeer gets disconnected from the server. Does not necessarily mean the client is shutting down, we may still be able to reconnect. + + + + + Tell the server to start the round (permission required) + + + + + Tell the server to select a submarine (permission required) + + + + + Tell the server to select a mode (permission required) + + + + + Tell the server to end the round (permission required) + + + + + Read the events from the message, ignoring ones we've already received. Returns false if reading the events fails. + + + + + Clears events generated by the current client, used + when resynchronizing with the server after a timeout. + + + + + Used when the order targets a wall + + + + + Same as calling , + but the text parameter is set using + + + + How much skills drop towards the job's default skill levels when dying + + + + + When will the shuttle be dispatched with respawned characters + + + + + When will the sub start heading back out of the level + + + + + Have some of the properties listed in the server list changed + + + + + A list of int pairs that represent the ranges of UTF-16 codes allowed in client names + + + + + The "near" range of the voice chat (a percentage of either SpeakRange or radio range), further than this the volume starts to diminish + + + + + Interface for entities that the clients can send events to the server + + + + + Interface for entities that the server can send events to the clients + + + + + Interface for entities that handle ServerNetObject.ENTITY_POSITION + + + + + How long the server waits for the clients to get in sync after the round has started before kicking them + + + + + How long the server keeps events that everyone currently synced has received + + + + + If a client hasn't received an event that has been succesfully sent to someone within this time, they get kicked + + + + + If a client hasn't received an event after this time, they get kicked + + + + + Interpolates the positional error of a physics body towards zero. + + + + + Interpolates the rotational error of a physics body towards zero. + + + + + Interpolates the cursor position error towards zero. + + + + + Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager + + + + + Helper class for dealing with 16-bit IDs that wrap around ushort.MaxValue + + + + + Is newID more recent than oldID, i.e. newId > oldId accounting for ushort rollover + + + + + newId >= oldId accounting for ushort rollover (newer or equals) + + + + + Returns some ID that is older than the input ID. There are no guarantees + regarding its relation to values other than the input. + + + + + Is the current ID valid given the previous ID and latest possible ID (not smaller than the previous ID or larger than the latest ID) + + + + + Check if the two version are compatible (= if they can play together in multiplayer). + + + + Based on information found here: https://developer.valvesoftware.com/wiki/SteamID + ------------------------------------------------------------------------------------ + A SteamID is a 64-bit value (16 hexadecimal digits) that's broken up as follows: + + | a | b | c | d | + Most significant - | 01 | 1 | 00001 | 0546779D | - Least significant + + a) 8 bits representing the universe the account belongs to. + b) 4 bits representing the type of account. Typically 1. + c) 20 bits representing the instance of the account. Typically 1. + d) 32 bits representing the account number. + + The account number is additionally broken up as follows: + + | e | f | + Most significant - | 0000010101000110011101111001110 | 1 | - Least significant + + e) These are the 31 most significant bits of the account number. + f) This is the least significant bit of the account number, discriminated under the name Y for some reason. + + Barotrauma supports two textual representations of SteamIDs: + 1. STEAM40: Given this name as it represents 40 of the 64 bits in the ID. The account type and instance both + have an implied value of 1. The format is "STEAM_{universe}:{Y}:{restOfAccountNumber}". + 2. STEAM64: If STEAM40 does not suffice to represent an ID (i.e. the account type or instance were different + from 1), we use "STEAM64_{fullId}" where fullId is the 64-bit decimal representation of the full + ID. + + + + The primary ID for a given user + + + + + Other user IDs that this user might be closely tied to, + such as the owner of the current copy of Barotrauma + + + + + Utility struct for writing Singles + + + + + Value as a 32 bit float + + + + + Value as an unsigned 32 bit integer + + + + + This exists because Lidgren is a piece of shit and + doesn't readily support sending anything other than + a string through a disconnect packet, so this thing + needs a sufficiently nasty string representation that + can be decoded with some certainty that it won't get + mangled by user input. + + + + + Are there any entities in the spawn queue that match the given predicate + + + + + How many entities in the spawn queue match the given predicate + + + + Method is invoked via reflection, + see + + + Returns true if the given data is valid for the given vote type, + returns false otherwise. If it returns false, the message must + be discarded or reset by the caller, as it is now malformed :) + + + + + Takes flipping (Dir) into account. + + + + + Ignore rotation calls for the rest of this and the next update. Automatically disabled after that. Used for temporarily suppressing the SmoothRotate calls to prevent conflicting or unitentionally amplified rotations. + + + + + Returns the farthest point towards the forward of the body. + For capsules and circles, the front is at the top. + For horizontal capsules, the front is at the right-most point. + For rectangles, the front is either at the top or at the right, depending on which one of the two is greater: width or height. + The rotation is in radians. + + + + + Apply an impulse to the body without increasing it's velocity above a specific limit. + + + + + Apply an impulse to the body without increasing it's velocity above a specific limit. + + + + + Applies buoyancy, drag and angular drag caused by water + + + + + Rotate the body towards the target rotation in the "shortest direction", taking into account the current angular velocity to prevent overshooting. + + Desired rotation in radians + How fast the body should be rotated. Does not represent any real unit, you may want to experiment with different values to get the desired effect. + Should the angles be wrapped. Set to false if it makes a difference whether the angle of the body is 0.0f or 360.0f. + + + + The main class. + + + + + The main entry point for the application. + + + + + Computes sample weightings and texture coordinate offsets + for one pass of a separable gaussian blur filter. + + + + + Evaluates a single point on the gaussian falloff curve. + Used for setting up the blur filter weightings. + + + + + Fps independent mouse input. The draw method is called multiple times per frame. + + + + + Creates a new joint using the limb IDs. + + + + + Removes all selected joints and limbs in the params level (-> serializable). The method also recreates the ids and names, when required. + + + + + Allows the game to run logic such as updating the world, + checking for collisions, gathering input, and playing audio. + + + + + By default, creates a new frame for the screen and adds all elements to the gui update list. + + + + + Prefab used for dragging from the item catalog into inventories + + + + + Currently opened hand-held item container like crates + + + + + When opening an item we save the location of it so we can teleport the dummy character there + + + + + Global undo/redo state for the sub editor and a selector index for it + + + + + Coroutine that waits 5 minutes and then runs itself recursively again to save the submarine into a temporary file + + + + + + + Saves the current main sub into a temporary file outside of the Submarines/ folder + + + The saving is ran in another thread to avoid lag spikes + + + + Loads an item assembly and only returns items which are not inside other inventories. + This is to prevent us from trying to place for example Oxygen Tanks inside an inventory + when it's already inside a diving suit. + + + + + + + Recovers the auto saved submarine + + + + + Tries to open an item container in the submarine editor using the dummy character + + The item we want to open + + + + Close the currently opened item + + + + + Teleports the dummy character to the specified position + + The desired position + + + + GUI.MouseOn doesn't get updated while holding primary mouse and we need it to + + + + + Allows the game to run logic such as updating the world, + checking for collisions, gathering input, and playing audio. + + + + + This is called when the game should draw itself. + + + + + Holds the references to the input fields. + + + + + Sets common shared properties to all selected map entities in sub editor. + Only works client side while in the sub editor and when parentObject is ItemComponent, Item or Structure. + + + + + The function has the same parameters as + + + + Implement this interface to insert extra entires to the text pickers created for the SerializableEntityEditors of the entity + + + + + How many instances of the same sound clip can be playing at the same time + + + + + Represents a biquad-filter. + + + + + The a0 value. + + + + + The a1 value. + + + + + The a2 value. + + + + + The b1 value. + + + + + The b2 value. + + + + + The q value. + + + + + The gain value in dB. + + + + + The z1 value. + + + + + The z2 value. + + + + + Gets or sets the frequency. + + value;The samplerate has to be bigger than 2 * frequency. + + + + Gets the sample rate. + + + + + The q value. + + + + + Gets or sets the gain value in dB. + + + + + Initializes a new instance of the class. + + The sample rate. + The frequency. + + sampleRate + or + frequency + or + q + + + + + Initializes a new instance of the class. + + The sample rate. + The frequency. + The q. + + sampleRate + or + frequency + or + q + + + + + Processes a single sample and returns the result. + + The input sample to process. + The result of the processed sample. + + + + Processes multiple samples. + + The input samples to process. + The result of the calculation gets stored within the array. + + + + Calculates all coefficients. + + + + + Used to apply a lowpass-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + + + + Calculates all coefficients. + + + + + Used to apply a highpass-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + + + + Calculates all coefficients. + + + + + Used to apply a bandpass-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + + + + Calculates all coefficients. + + + + + Used to apply a notch-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + + + + Calculates all coefficients. + + + + + Used to apply a lowshelf-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + Gain value in dB. + + + + Calculates all coefficients. + + + + + Used to apply a highshelf-filter to a signal. + + + + + Initializes a new instance of the class. + + The sample rate. + The filter's corner frequency. + Gain value in dB. + + + + Calculates all coefficients. + + + + + Used to apply an peak-filter to a signal. + + + + + Gets or sets the bandwidth. + + + + + Initializes a new instance of the class. + + The sampleRate of the audio data to process. + The center frequency to adjust. + The bandWidth. + The gain value in dB. + + + + Calculates all coefficients. + + + + + Play a sound defined in a sound xml file without any positional effects. + + + + + Play a sound defined in a sound xml file. If the volume or range parameters are omitted, the volume and range defined in the sound xml are used. + + + + + If > 0, only one sprite of the same group is used (chosen randomly) + + + + + The sprite is only drawn if these conditions are fulfilled + + + + + The sprite is only animated if these conditions are fulfilled + + + + + Deform the vertices of the sprite using an arbitrary function. The in-parameter of the function is the + normalized position of the vertex (i.e. 0,0 = top-left corner of the sprite, 1,1 = bottom-right) and the output + is the amount of deformation. + + + + + Does a rotational deformations around pivot points at the edges of the sprite. + + + + + 0 = no falloff, the entire sprite is stretched + 1 = stretching the center of the sprite has no effect at the edges + + + + + Maximum stretch per vertex (1 = the size of the sprite) + + + + + How fast the sprite reacts to being stretched + + + + + How fast the sprite returns back to normal after stretching ends + + + + + Stretch a position in the deformable sprite to some direction + + + + + A negative value means that the deformation is used only by one sprite only (default). + A positive value means that this deformation is or could be used for multiple sprites. + This behaviour is not automatic, and has to be implemented for any particular case separately (currently only used in Limbs). + + + + + Only used if UseMovementSine is enabled. Multiplier for Pi. + + + + + Defined in the shader. + + + + + Creates a silhouette for the sprite (or outline if the sprite is rendered on top of it) + + + + + Reference to the xml element from where the sprite was created. Can be null if the sprite was not defined in xml! + + + + + In pixels + + + + + 0 - 1 + + + + + Identifier of the Map Entity so that we can link the sprite to its owner. + + + + + Creates a supposedly unique identifier from the parent element. If the parent element is not found, uses the sprite element. + TODO: If there are multiple elements with exactly the same data, the ids will fail. -> Is there a better way to identify the sprites? + ALSO TODO: delete :) + + + + + Works only if there is a name attribute defined for the sprite. For items and structures, the entity id or name is used if the sprite's name attribute is not defined. + + + + + Each new sound overrides the existing sounds that were launched with this status effect, meaning the old sound will be faded out and disposed and the new sound will be played instead of the old. + Normally the call to play the sound is ignored if there's an existing sound playing when the effect triggers. + Used for example for ensuring that rapid playing sounds restart playing even when the previous clip(s) have not yet stopped. + Use with caution. + + + + + Should the item spawn even if the container can't contain items of this type + + + + + The maximum amount of creatures of the same species in the same team that are allowed to be spawned via this status effect. + Also the creatures spawned by other means are counted in the check. + + + + + Index of the slot the target must be in when targeting a Contained item + + + + + Always do the conditional checks for the duration/delay. If false, only check conditional on apply. + + + + + Only valid if the effect has a duration or delay. Can the effect be applied on the same target(s)s if the effect is already being applied? + + + + + The interval at which the effect is executed. The difference between delay and interval is that effects with a delay find the targets, check the conditions, etc + immediately when Apply is called, but don't apply the effects until the delay has passed. Effects with an interval check if the interval has passed when Apply is + called and apply the effects if it has, otherwise they do nothing. + + + + + Can the StatusEffect be applied when the item applying it is broken + + + + + Which type of afflictions the target must receive for the StatusEffect to be applied. Only valid when the type of the effect is OnDamaged. + + + + + Fetches a Workshop item's metadata. This is batched to minimize Steamworks API calls. + The description of the returned item is truncated to save bandwidth. + + Workshop Item ID + + + + Fetches a Workshop item's metadata in its own API call instead of batching. + This minimizes delay but needs to be used with caution to prevent rate limiting. + + Workshop Item ID + + If true, ask for the item's entire description, otherwise it'll be truncated. + + + + + This class creates a file called ".copying" that + serves to keep mod copy operations in the same + directory from overlapping. + + + + + This class serves the purpose of preventing + more than 10 mod install tasks from proceeding + at the same time. + + + + + Implementation of the Command pattern. + + + Created by Markus Isberg on 11th of March 2020 for the submarine editor. + "Implementing a global undo and redo with Memento pattern proved too difficult of a task for me so I implemented it with this pattern instead." + + + + + A method that should apply a new state on an object or perform an action + + + + + A method that should revert Execute() method's actions + + + + + State no longer exists, clean up the lingering garbage + + + + + A command for setting and reverting a MapEntity rectangle + + + + + A command for setting and reverting a MapEntity rectangle + + Entities whose rectangle has been altered + The new rectangle that is or will be applied to the map entity + Old rectangle the map entity had before + If the transform was resized or not + + All lists should be equal in length, for every receiver there should be a corresponding entry at the same position in newData and oldData. + + + + + A command that removes and unremoves map entities + + + + + Creates a command where all entities share the same state. + + Entities that were deleted or added + Whether or not all entities are or are going to be deleted + Ignore item inventories when set to false, workaround for pasting + + + + A command that places or drops items out of inventories + + + + + + + A command that sets item properties + + + + + A command that sets item properties + + Affected entities + Real property name, not all lowercase + + + + + + A command that moves items around in inventories + + + + + + + Maximum upgrade level without taking submarine tier or class restrictions into account + + + + + Returns the maximum upgrade level for the current sub, taking tier and class restrictions into account + + + + + Returns the maximum upgrade level for the specified sub, taking tier and class restrictions into account + + + + + Parse a integer value from a string that is formatted like a percentage increase / decrease. + + String to parse + What XML attribute the value originates from, only used for warning formatting. + What XMLElement the value originates from, only used for warning formatting. + Whether or not to suppress warnings if both "attribute" and "sourceElement" are defined. + + + This sample returns -15 as an integer. + + XElement element = new XElement("change", new XAttribute("increase", "-15%")); + ParsePercentage(element.GetAttributeString("increase", string.Empty)); + + + + + Based on http://jakepoz.com/jake_poznanski__background_load_xna.html + + + + + Checks if point is inside of a polygon + + + + Additional check to see if the point is within the bounding box before doing more complex math + + Note that the bounding box check can be more expensive than the vertex calculations in some cases. + Reference + + + + + Convert a RGB value into a HSV value. + + + Reference + + Vector3 where X is the hue (0-360 or NaN) + Y is the saturation (0-1) + Z is the value (0-1) + + + + + a method for changing inputtypes with old names to the new ones to ensure backwards compatibility with older subs + + + + + Convert a HSV value into a RGB value. + + Value between 0 and 360 + Value between 0 and 1 + Value between 0 and 1 + Reference + + + + + Returns either a green [x] or a red [o] + + + + + + + + Turn the object into a string and give it rich color based on the object type + + + + + + + Calculates the minimum number of single-character edits (i.e. insertions, deletions or substitutions) required to change one string into the other + + + + + Reads a number of bits from the buffer and inserts them to a new NetBuffer instance + + + + + Returns a new instance of the class with all properties and fields copied. + + + + + Copies the values of the source to the destination. May not work, if the source is of higher inheritance class than the destination. Does not work with virtual properties. + + + + + Cleans up a path by replacing backslashes with forward slashes, and + optionally corrects the casing of the path. Recommended when serializing + paths to a human-readable file to force case correction on all platforms. + Also useful when working with paths to files that currently don't exist, + i.e. case cannot be corrected. + + Path to clean up + Should the case be corrected to match the filesystem? + Directories that the path should be found in, not returned. + Path with corrected slashes, and corrected case if requested. + + + + Cleans up a path by replacing backslashes with forward slashes, and + corrects the casing of the path on non-Windows platforms. Recommended + when loading a path from a file, to make sure that it is found on all + platforms when attempting to open it. + + Path to clean up + Path with corrected slashes, and corrected case if required by the platform. + + + + Extends % and + characters to color tags in talent name tooltips to make them look nicer. + This obviously does not work in languages like French where a non breaking space is used + so it's just a a bit extra for the languages it works with. + + + + + + + An arbitrary identifier that can be used to determine what kind of a message this is + and prevent characters from saying the same kind of line too often. + + + + + Returns true if any node in the path is in stairs + + + + + Seeks the ladder from the next and next + 1 nodes. + + + + + Don't start using a weapon if this condition is true + + + + + Seeks for more ammunition. Creates a new subobjective. + + + + + Reloads the ammunition found in the inventory. + If seekAmmo is true, tries to get find the ammo elsewhere. + + + + + Only remove existing items when the contain target can't be put in the inventory + + + + + If true drops the item when containing the item fails. + In both cases abandons the objective. + Note that has no effect if the target container was not defined (always drops) -> completes when the item is dropped. + + + + + 0-1 based on the horizontal size of all of the fires in the hull. + + + + + Diving gear that's suitable for wearing indoors (-> the bots don't try to unequip it when they don't need diving gear) + + + + + Tries to find the best (safe, nearby) hull the character can find a path to. + Checks one hull at a time, and returns HullSearchStatus.Finished when all potential hulls have been checked. + + + + + Is the character allowed to take the item from somewhere else than their own sub (e.g. an outpost) + + + + + Are variants of the specified item allowed + + + + + Returns the "best" item to spawn when using and there's multiple suitable items. + Best in this context is the one that's sold at the lowest price in stores (usually the most "basic" item) + + + + + + Does not reset the ignored items list + + + + + Doesn't allow the objective to complete if this condition is false + + + + + Which event action created this objective (if any) + + + + + Display units + + + + + If true, the distance to the destination is calculated from the character's AimSourcePos (= shoulder) instead of the collider's position + + + + + List of all possible items of the specified type. Used for filtering the removed objectives. + + + + + Excluding the current order. + + + + + When set above zero, the character will stand still doing nothing until the timer runs out. Does not affect orders, find safety or combat. + + + + + The AIObjective in with the highest + + + + Returns the last active objective of the specific type. + + + + + Returns all active objectives of the specific type. Creates a new collection -> don't use too frequently. + + + + + If undefined, a default filter will be used. + + + + + If set, only fix items where required skill matches this. + + + + + Name that can be used with the contextual version of the order + + + + + If defined, the order can only be quick-assigned to characters with these jobs. Or if it's a report, the icon will only be displayed to characters with these jobs. + + + + + Can the order be turned into a non-entity-targeting one if it was originally created with a target entity. + Note: if MustSetTarget is true, CanBeGeneralized will always be false. + + + + + If defined, the order will be quick-assigned to characters with these jobs before characters with other jobs. + + + + + Should the order icon be drawn when the order target is inside a container + + + + + Affects how high on the order list the order will be placed (i.e. the manual priority order when it's given) when it's first given. + Manually rearranging orders will override this priority. + + + + + Get the target item component based on the target item type + + + + Only returns items which are interactable for this character + + + Only returns items which are interactable for this character + + + + Used to create the order option for the Dismiss order to know which order it targets + + The order to target with the dismiss order + + + + Create an Order instance with a null target + + + + + Note this property doesn't return the follow target of the Follow objective, as expected! + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Get the target item component based on the target item type + + + + Only returns items which are interactable for this character + + + Only returns items which are interactable for this character + + + + Used to create the order option for the Dismiss order to know which order it targets + + The order to target with the dismiss order + + + + Note: Presupposes that the slow speed is lower than the high speed. Otherwise will give invalid results. + + + + + Note: creates a new list every time, because the params might have changed. If there is a need to access the property frequently, change the implementation to an array, where the slot is updated when the param is updated(?) + Currently it's not simple to implement, since the properties are not implemented here, but in the derived classes. Would require to change the params virtual and to call the base property getter/setter or something. + + + + + Which character gave this affliction + + + + + Copy properties here instead of using SerializableProperties (with reflection). + + + + + Use this method to skip clamping and additional logic of the setters. + Ideally we would keep this private, but doing so would require too much refactoring. + + + + + Prevents AfflictionHusks with the specified identifier(s) from transforming the character into an AI-controlled character + + + + + Bots will not try to treat the affliction if the character has any of these afflictions + + + + + The affliction is automatically removed after this time. 0 = unlimited + + + + + An arbitrary modifier that affects how much medical skill is increased when you apply the affliction on a target. + If the affliction causes damage or is of type poison or paralysis, the skill is increased only when the target is hostile. + If the affliction is of type buff, the skill is increased only when the target is friendly. + + + + + An arbitrary modifier that affects how much weapons skill is increased when you apply the affliction on a target. + The skill is increased only when the target is hostile. + + + + + Creates a character info from the human prefab. If there are custom character infos defined, those are used, otherwise a randomized info is generated. + + + + + + + How much this skill affects characters' hiring cost + + + + allAnimations[speciesName][fileName] + + + + In degrees. + + + + + In degrees. + + + + + Selects a random filepath from multiple paths, matching the specified animation type. + + + + + Selects all file paths that match the specified animation type. + + + + + If the file name is left null, default file is selected. If fails, will select the default file. Note: Use the filename without the extensions, don't use the full path! + If a custom folder is used, it's defined in the character info file. + + + + + Note: Overrides old animations, if found! + + + + + The angle of the collider when standing (i.e. out of water). + In degrees. + + + + + Key = limb id, value = angle in radians + + + + + In degrees. + + + + + Key = limb id, value = angle in radians + + + + + In degrees. + + + + + In degrees. + + + + + In degrees. + + + + + Contains character data that should be editable in the character editor. + + + + + key1: Species name + key2: File path + value: Ragdoll parameters + + + + + If the file name is left null, default file is selected. If fails, will select the default file. Note: Use the filename without the extensions, don't use the full path! + If a custom folder is used, it's defined in the character info file. + + + + + Creates a default ragdoll for the species using a predefined configuration. + Note: Use only to create ragdolls for new characters, because this overrides the old ragdoll! + + + + + Applies the current properties to the xml definition without saving to file. + + + + + Resets the current properties to the xml (stored in memory). Force reload reloads the file from disk. + + + + + Should be converted to sim units. + + + + + Should be converted to sim units. + + + + + In degrees. + + + + + In degrees. + + + + + The orientation of the sprite as drawn on the sprite sheet (in radians). + + + + + Some conditions rely on specific ability data that is integrally connected to the AbilityEffectType. + This is done in order to avoid having to create duplicate ability behavior, such as if an ability needs to trigger + a common ability effect but in specific circumstances. These conditions could also be partially replaced by + more explicit AbilityEffectType enums, but this would introduce bloat and overhead to integral game logic + when instead said logic can be made to only run when required using these conditions. + + These conditions will return an error if used outside their limited intended use. + + + + + Used primarily for StatusEffects. Default to constant outside interval abilities. + + + + + List of abilities that are triggered by this group. + Fallback abilities are triggered if the conditional fails + + + + + List of abilities that are triggered by this group. + Fallback abilities are triggered if the conditional fails + + + + + Talent identifiers of all the talents in this tree + + + + + How many talents need to be unlocked to consider this tree completed + + + + + How many talents can be unlocked in total + + + + + When specified the talent option will show talent with this identifier + and clicking on it will expand the talent option to show the talents + + + + + Base class for content file types, which are loaded + from filelist.xml via reflection. + PLEASE AVOID INHERITING FROM THIS CLASS DIRECTLY. + Inheriting from GenericPrefabFile<T> is likely what + you want. + + + + + Errors that occurred when loading this content package. + Currently, all errors are considered fatal and the game + will refuse to load a content package that has any errors. + + + + + An error that occurred when trying to enable this mod. + This field doesn't directly affect whether or not this mod + can be enabled, but if it's been set to anything other than + Option.None then the game has already refused to enable it + at least once. + + + + + Does the content package include some content that needs to match between all players in multiplayer. + + + + + Has the action finished. + + If null or empty, the event moves to the next action. Otherwise it moves to the specified label. + + + + + Rich test to display in debugdraw + + + + public override string ToDebugString() + { + return $"{ToolBox.GetDebugSymbol(isFinished)} SomeAction -> "(someInfo: {info.ColorizeObject()})"; + } + + + + + + + 'Exhaustible' sets won't appear in the same level until after one world step (~10 min, see Map.ProgressWorld) has passed. + + + + + If true, events from this set can only occur once in the level. + + + + + Used to force an event set based on how many other locations have been discovered before this. (Used for campaign tutorial event sets.) + + + + + Used to force an event set based on how many other outposts have been visited before this. (Used for campaign tutorial event sets.) + + + + + Randomizes the collection (using OrderBy) and returns it. + + + + + Randomizes the list in place without creating a new collection, using a Fisher-Yates-based algorithm. + + + + + Gets a random element of a list using one of the synced random number generators. + It's recommended that you guarantee a deterministic order of the elements of the + input list via sorting. + + List to pick a random element from + Which RNG to use + A random item from the list. Return value should match between clients and + the server, if applicable. + + + + Executes an action that modifies the collection on each element (such as removing items from the list). + Creates a temporary list, unless the collection is empty. + + + + + Generic version of List.ForEach. + Performs the specified action on each element of the collection (short hand for a foreach loop). + + + + + Iterates over all elements in a given enumerable and discards the result. + + + + + Shorthand for !source.Any(predicate) -> i.e. not any. + + + + + Returns whether a given collection has at least a certain amount + of elements for which the predicate returns true. + + Input collection + How many elements to match before stopping + Predicate used to evaluate the elements + + + + + Returns the maximum element in a given enumerable, or null if there + aren't any elements in the input. + + Input collection + Maximum element or null + + + + Same as FirstOrDefault but will always return null instead of default(T) when no element is found + + + + + Negates the X and Y components. + + + + + Flips the X and Y components. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Unity's Angle implementation without the conversion to degrees. + Returns the angle in radians between two vectors. + 0 - Pi. + + + + + Creates a forward pointing vector based on the rotation (in radians). + + + + + Creates a backward pointing vector based on the rotation (in radians). + + + + + Creates a forward pointing vector based on the rotation (in radians). TODO: remove when the implications have been neutralized + + + + + Creates a backward pointing vector based on the rotation (in radians). TODO: remove when the implications have been neutralized + + + + + Creates a normalized perpendicular vector to the right from a forward vector. + + + + + Creates a normalized perpendicular vector to the left from a forward vector. + + + + + Transforms a vector relative to the given up vector. + + + + + Flips the x and y components. + + + + + Returns the sum of the x and y components. + + + + + Capitalises the first letter (invariant) and forces the rest to lower case (invariant). + + + + + Adds spaces into a CamelCase string. + + + + + Spawns the items defined in the start item set in the specified sub. + + + + + Get what kind of affiliation this faction has towards the player depending on who they chose to side with via talents + + + + + + How low the reputation can drop on this faction + + + + + Maximum reputation level you can gain on this faction + + + + + What reputation does this faction start with + + + + + Reputation value normalized to the range of 0-1 + + + + + Network message for the server to update wallet values to clients + + + + + Network message for the client to transfer money between wallets + + + + + Network message for the client to set the salary of someone + + + + + Represents the difference in balance and salary when a wallet gets updated + Not really used right now but could be used for notifications when receiving funds similar to how talents do it + + + + + Represents an update that changed the amount of money or salary of the wallet + + + + + Does the wearable inherit all the scalings of the wearer? Also the wearable's own scale is used! + + + + + None = Any/Not Defined -> no effect. + Changing the gender forces re-initialization, because the textures can be different for male and female characters. + + + + + Note: this constructor cannot initialize automatically, because the gender is unknown at this point. We only know it when the item is equipped. + + + + + + + Should broken (0 condition) items be excluded + + + + + Should full condition (100%) items be excluded + + + + + Index of the slot the target must be in when targeting a Contained item + + + + + Overrides the position defined in ItemContainer. + + + + + Only affects when ItemContainer.hideItems is false. Doesn't override the value. + + + + + Additive sets of items spawned only at the start of the game. + + + + + The order in which the sets are displayed in menus + + + + Mod initialization + + + Error or client exit + + + + This function should be used whenever a new assembly is created. Wrapper to allow more complicated setup later if need be. + + + + + This function should be used whenever a new assembly is about to be destroyed/unloaded. Wrapper to allow more complicated setup later if need be. + + Assembly to remove + + + + Puts a type on the stack, as a object instead of a + runtime type token. + + The IL emitter. + The type to put on the stack. + + + + Converts the value on the stack to . + + The IL emitter. + The type of the value on the stack. + + + + Deferences the value on stack if the provided type is ByRef. + + The IL emitter. + The type to check if ByRef. + + + + Deferences the value on stack if the provided type is ByRef. + + The IL emitter. + The type to check if ByRef. + + + + Loads a local variable and casts it to the target type. + + The IL emitter. + The value to cast. Must be of type . + The type to cast into. + + + + Emits a call to . + + The IL emitter. + The string format. + The local variables passed to string.Format. + + + + Emits a call to . + + The IL emitter. + The message to print. + + + + Emits a call to , + using the string on the stack. + + The IL emitter. + + + + Emits a foreach loop that iterates over an local variable. + + The type of elements in the enumerable. + The IL emitter. + The enumerable. + The body of code to run on each iteration. + + + + Emits a foreach loop that iterates over an local variable. + + The type of elements in the enumerable. + The IL emitter. + The enumerator. + The body of code to run on each iteration. + + + + Emits a branch that only executes if the last value on the stack + is truthy (e.g. non-null references, 1, etc). + + The IL emitter. + The body of code to run if the value is truthy. + + + + Emits a branch that only executes if the last value on the stack + is falsy (e.g. null references, 0, etc). + + The IL emitter. + The body of code to run if the value is falsy. + + + + Emits two branches that diverge based on a condition -- analogous + to an if-else statement. If either + or are omitted, it behaves the same as + + and . + + The IL emitter. + The body of code to run if the value is truthy. + The body of code to run if the value is falsy. + + + + See . + + Lua value to convert and wrap in a userdata. + Descriptor of the type of the object to convert the Lua value to. Uses MoonSharp ScriptToClr converters. + A userdata that wraps the Lua value converted to an object of the desired type as described by . + + + + Converts a Lua value to a CLR object of a desired type and wraps it in a userdata. + If the type is not registered, then a new will be created and used. + The goal of this method is to allow Lua scripts to create userdata to wrap certain data without having to register types. + Wrapping the value in a userdata preserves the original type during script-to-CLR conversions.A Lua script needs to pass a List`1 to a CLR method expecting System.Object, MoonSharp gets + in the way by converting the List`1 to a MoonSharp.Interpreter.Table and breaking everything. + Registering the List`1 type can break other scripts relying on default converters, so instead + it is better to manually wrap the List`1 object into a userdata. + + Lua value to convert and wrap in a userdata. + Type describing the CLR type of the object to convert the Lua value to. + A userdata that wraps the Lua value converted to an object of the desired type. + + + + Unique, but non-persistent identifier. + Stays the same if the entities are created in the exactly same order, but doesn't persist e.g. between the rounds. + + + + + Finds a contiguous block of free IDs of at least the given size + + The first ID in the found block, or zero if none are found + + + + Find an entity based on the ID + + + + + Removes the entity from the entity dictionary and frees up the ID it was using. + + + + + Overrides the commonness of the object in a specific level type. + Key = name of the level type, value = commonness in that level type. + + + + + Minimum difficulty of the level before hunting grounds can appear. + + + + + Probability of hunting grounds appearing in 100% difficulty levels. + + + + + The depth at which the level starts at, in in-game coordinates. E.g. if this was set to 100 000 (= 1000 m), the nav terminal would display the depth as 1000 meters at the top of the level. + + + + + Determined during level generation based on the size of the submarine. Null if the level hasn't been generated. + + + + + Events that have previously triggered in this level. Used for making events the player hasn't seen yet more likely to trigger when re-entering the level. Has a maximum size of . + + + + + Events that have already triggered in this level and can never trigger again. . + + + + + 'Exhaustible' sets won't appear in the same level until after one world step (~10 min, see Map.ProgressWorld) has passed. . + + + + + The crush depth of a non-upgraded submarine in in-game coordinates. Note that this can be above the top of the level! + + + + + The crush depth of a non-upgraded submarine in "real world units" (meters from the surface of Europa). Note that this can be above the top of the level! + + + + + Instantiates level data using the properties of the connection (seed, size, difficulty) + + + + + Instantiates level data using the properties of the location + + + + + Is some mission blocking this location from changing its type? + + + + + In percentages. Larger values make buying more expensive and selling less profitable, and vice versa. + + + + + Create new StoreInfo + + + + + Load previously saved StoreInfo + + + + If null, item.GetPriceInfo() will be used to get it. + /// If false, the price won't be affected by + + If null, item.GetPriceInfo() will be used to get it. + If false, the price won't be affected by + + + + How many map progress steps it takes before the discounts should be updated. + + + + + Create a location from save data + + + + + Removes all unlocked missions from the location + + + + + Mark the items that have been taken from the outpost to prevent them from spawning when re-entering the outpost + + + + + Mark the characters who have been killed to prevent them from spawning when re-entering the outpost + + + + If true, the stores will be recreated if they already exists. + + + + Can this location type be used in the random, non-campaign levels that don't take place in any specific zone + + + + + If set to true, only event sets that explicitly define this location type in can be selected at this location. Defaults to false. + + + + + In percentages + + + + + The change can only happen if there's at least one of the given types of locations near this one + + + + + How close the location needs to be to one of the RequiredLocations for the change to occur + + + + + Base probability per turn for the location to change if near one of the RequiredLocations + + + + + How close the location needs to be to one of the RequiredLocations for the probability to increase + + + + + How much the probability increases per turn if within RequiredProximityForProbabilityIncrease steps of RequiredLocations + + + + + Does there need to be a beacon station within RequiredProximity + + + + + Does there need to be hunting grounds within RequiredProximity + + + + + Base probability per turn for the location to change if near one of the RequiredLocations + + + + + The change can't happen if there's one or more of the given types of locations near this one + + + + + How close the location needs to be to one of the DisallowedAdjacentLocations for the change to be disabled + + + + + The location can't change it's type for this many turns after this location type changes occurs + + + + + Identifiers of the location types this outpost can appear in. If empty, can appear in all types of locations. + + + + + Info of this outpost module + + + + + Which module is this one attached to + + + + + The position of this module's gap that attaches to the previous module + + + + + Select the number and types of the modules to use in the outpost + + + + + Attaches additional modules to all the available gaps of the given module, + and continues recursively through the attached modules until all the pending module types have been placed. + + The module to attach to + Which modules we can choose from + Which types of modules we still need in the outpost + The modules we've already selected to be used in the outpost. + + + + Attaches a new random module to one side of the given module + + The module to attach to + Which side of the module to attach the new module to + Which modules we can choose from + Which types of modules we still need in the outpost + The modules we've already selected to be used in the outpost. + + + + Check if any of the modules in modules1 overlap with modules in modules2 + + + + + Check if the modules overlap, taking their Offsets and MoveOffsets into account + + + + + Check if any of the modules overlaps with a connection between 2 other modules + + + + + Attempt to find a way to move the modules in a way that stops the 2 specific modules from overlapping. + Done by iterating through the modules and testing how much the subsequent modules (i.e. modules that are further from the initial outpost) + would need to be moved further to solve the overlap. The solution that requires moving the modules the least is chosen. + + The set of modules the method is allowed to move + Module overlapping with module2 + Module overlapping with module1 + All generated modules + The solution to the overlap (if any). Key = placed module, value = distance to move the module + Was a solution found for resolving the overlap. + + + + Get the modules that are further from the initial module than the startModule. StartModule is also included in the list. + + + + + Can the item be a Daily Special or a Requested Good + + + + + The item isn't available in stores unless the level's difficulty is above this value + + + + + The cost of item when sold by the store. Higher modifier means the item costs more to buy from the store. + + + + + Used when both and are set to 0. + + + + + Minimum reputation needed to buy the item (Key = faction ID, Value = min rep) + + + + + Support for the old style of determining item prices + when there were individual Price elements for each location type + where the item was for sale. + + + + + Marks fields and properties as to be serialized and deserialized by . + Also contains settings for some types like maximum and minimum values for numbers to reduce bits used. + + + + struct NetPurchasedItem : INetSerializableStruct + { + [NetworkSerialize] + public string Identifier; + + [NetworkSerialize(ArrayMaxSize = 16)] + public string[] Tags; + + [NetworkSerialize(MinValueInt = 0, MaxValueInt = 8)] + public int Amount; + } + + + + Using the attribute on the struct will make all fields and properties serialized + + + + + Static class that contains serialize and deserialize functions for different types used in + + + The type that the behavior handles + The type that will be used as the generic parameter for the read/write methods + The read method. + It must have a generic parameter. + The return type must be such that if the generic parameter is replaced with funcGenericParam, you get behaviorGenericParam. + The write method. The first parameter's type must be the same as readFunc's return type. + Ideally the least specific type possible, because it's replaced by behaviorGenericParam + A ReadWriteBehavior<behaviorGenericParam> + + + + Interface that allows the creation of automatically serializable and deserializable structs. +

+ + + public enum PurchaseResult + { + Unknown, + Completed, + Declined + } + + [NetworkSerialize] + struct NetStoreTransaction : INetSerializableStruct + { + public long Timestamp { get; set; } + public PurchaseResult Result { get; set; } + public NetPurchasedItem? PurchasedItem { get; set; } + } + + [NetworkSerialize] + struct NetPurchasedItem : INetSerializableStruct + { + public string Identifier; + public string[] Tags; + public int Amount; + } + + + + Supported types are:
bool
byte
ushort
short
uint
int
ulong
long
float
double
string




+ In addition arrays, enums, and are supported.
+ Using or will make the field or property optional. +
+ +
+ + + Deserializes a network message into a struct. + + + + public void ClientRead(IReadMessage inc) + { + NetStoreTransaction transaction = INetSerializableStruct.Read<NetStoreTransaction>(inc); + if (transaction.Result == PurchaseResult.Declined) + { + Console.WriteLine("Purchase declined!"); + return; + } + + if (transaction.PurchasedItem is { } item) + { + // Purchased 3x Wrench with tags: smallitem, mechanical, tool + Console.WriteLine($"Purchased {item.Amount}x {item.Identifier} with tags: {string.Join(", ", item.Tags)}"); + } + } + + + Incoming network message + Type of the struct that implements + A new struct of type T with fields and properties deserialized + + + + Serializes the struct into a network message + + public void ServerWrite(IWriteMessage msg) + { + INetSerializableStruct transaction = new NetStoreTransaction + { + Result = PurchaseResult.Completed, + Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(), + PurchasedItem = new NetPurchasedItem + { + Identifier = "Wrench", + Amount = 3, + Tags = new []{ "smallitem", "mechanical", "tool" } + } + }; + + transaction.Write(msg); + } + + Outgoing network message + + + + Default constructor. + + + + + Constructor with OnAdd and OnRemove callbacks provided. + + + + + Constructor with only the OnSort callback provided. + + + + + Method to be called when calling Add(T prefab, bool override). + If provided, the method is called only if Add succeeds. + + + + + Method to be called when calling Remove(T prefab). + If provided, the method is called before success + or failure can be determined within the body of Remove. + + + + + Method to be called when calling SortAll(). + + + + + Method to be called when calling AddOverrideFile(ContentFile file). + + + + + Method to be called when calling RemoveOverrideFile(ContentFile file). + + + + + Dictionary containing all prefabs of the same type. + Key is the identifier. + Value is a list of prefabs that share the same identifier, + where the first element is the "base" prefab, + i.e. the only prefab that's loaded when override tags are not defined. + This first element can be null, if only overrides are defined. + The last element of the list is the prefab that is effectively used + (hereby called "active prefab") + + + + + Collection of content files that override all previous prefabs + i.e. anything set to load before these effectively doesn't exist + + + + + AllPrefabs exposes all prefabs instead of just the active ones. + + + + + Returns the active prefab with the given identifier. + + Prefab identifier + Active prefab with the given identifier + + + + Returns true if a prefab with the identifier exists, false otherwise. + + Prefab identifier + The matching prefab (if one is found) + Whether a prefab with the identifier exists or not + + + + Finds the first active prefab that returns true given the predicate, + or null if no such prefab is found. + + Predicate to perform the search with. + + + + + Returns true if a prefab with the given identifier exists, false otherwise. + + Prefab identifier + Whether a prefab with the given identifier exists or not + + + + Determines whether a prefab is implemented as an override or not. + + Prefab in this collection + Whether a prefab is implemented as an override or not + + + + Add a prefab to the collection. + If not marked as an override, fail if a prefab with the same + identifier already exists. + Otherwise, add to the corresponding list, + without making any changes to the base prefab. + + Prefab + Is marked as override + + + + Removes a prefab from the collection. + + Prefab + + + + Removes all prefabs that were loaded from a certain file. + + + + + Adds an override file to the collection. + + + + + Removes an override file from the collection. + + + + + Sorts all prefabs in the collection based on the content package load order. + + + + + GetEnumerator implementation to enable foreach + + IEnumerator + + + + GetEnumerator implementation to enable foreach + + IEnumerator + + + + Prefab that has a property serves as a deterministic hash of + a prefab's identifier. This member is filled automatically + by PrefabCollection.Add. Required for GetRandom to work on + arbitrary Prefab enumerables, recommended for network synchronization. + + + + + Sample a pre-generated perlin noise map. Faster than calculating the noise on the fly. + + Normalized x position. The noise map starts repeating after x > 1 + Normalized y position. The noise map starts repeating after y > 1 + A noise value between 0.0f and 1.0f + + + + Labels of the components of a vector property (defaults to x,y,z,w) + + + + + If a translation can't be found for the property name, this tag is used instead + + + + + Currently implemented only for int and bool fields. TODO: implement the remaining types (SerializableEntityEditor) + + + + + If set to true, the instance values saved in a submarine file will always override the prefab values, even if using a mod that normally overrides instance values. + + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try setting the values of some commonly used properties directly without reflection + + + + + Try setting the values of some commonly used properties directly without reflection + + + + + Upgrade the properties of an entity saved with an older version of the game. Properties that should be upgraded are defined using "Upgrade" elements in the config file. + for example, would force the scale of the entity to 0.5 if it was saved with a version prior to 0.9.2.0. + + The entity to upgrade + The XML element to get the upgrade instructions from (e.g. the config of an item prefab) + The game version the entity was saved with + + + + Returns the first child element that matches the name using the provided comparison method. + + + + + Returns all child elements that match the name using the provided comparison method. + + + + + Resets every round. + + + + + Keeps track of things that have happened during the round + + + + + Check if the currently selected language is available, and switch to English if not + + + + + Maximum FPS (0 = unlimited). + + + + + Calculate the new value of the property + + level of the upgrade + + + + + Sets the OriginalValue to a value stored in the save XML element + + + + + + Recursively apply a percentage to a value certain amount of times + + original value + percentage increase/decrease + how many times to apply the percentage change + + + + + Finds saved properties in the XML element and resets properties that are not managed by the upgrade anymore to their default values + + XML save element + + + + Find an item component matching the XML element + + Target item + XML ItemComponent element + Array of matching ItemComponents or null + + + + Applies the upgrade to the target item and components + + + This method should be called every time a new upgrade is added unless you set the original values of PropertyReference manually. + Do note that calls this method automatically. + + + + List of homoglyphs taken from https://github.com/codebox/homoglyph/ + + + + wrap the angle between 0.0f and 2pi + + + + + wrap the angle between -pi and pi + + + + + Returns the angle between the two angles, where the direction matters. + + + + + solves the angle opposite to side a (parameters: lengths of each side) + + + + + check whether line from a to b is intersecting with line from c to b + + + + + Get the intersections between a line (either infinite or a line segment) and a circle + + Center of the circle + Radius of the circle + 1st point on the line + 2nd point on the line + Is the line a segment or infinite + The number of intersections + + + + Get a point on a circle's circumference + + Center of the circle + Radius of the circle + Angle (in radians) from the center + + + + + Get a specific number of evenly distributed points on a circle's circumference + + Center of the circle + Radius of the circle + Number of points to calculate + Angle (in radians) of the first point from the center + + + + + divide a convex hull into triangles + + List of triangle vertices (sorted counter-clockwise) + + + + Float comparison. Note that may still fail in some cases. + + + + + Float comparison. Note that may still fail in some cases. + + + + + Returns a position in a curve. + + + + + Converts the alignment to a vector where -1,-1 is the top-left corner, 0,0 the center and 1,1 bottom-right + + + + + Rotates a point in 2d space around another point. + Modified from: + http://www.gamefromscratch.com/post/2012/11/24/GameDev-math-recipes-Rotating-one-point-around-another-point.aspx + + + + + Rotates a point in 2d space around the origin + + + + + Returns the corners of an imaginary rectangle. + Unlike the XNA rectangle, this can be rotated with the up parameter. + + + + + Returns the corners of an imaginary rectangle. + Unlike the XNA Rectangle, this can be rotated with the up parameter. + + + + + Check if a point is inside a rectangle. + Unlike the XNA Rectangle, this rectangle might have been rotated. + For XNA Rectangles, use the Contains instance method. + + + + + Check if a point is inside a rectangle. + Unlike the XNA Rectangle, this rectangle might have been rotated. + For XNA Rectangles, use the Contains instance method. + + + + + Slightly modified from https://gamedev.stackexchange.com/questions/110229/how-do-i-efficiently-check-if-a-point-is-inside-a-rotated-rectangle + + + + + Returns a scalar t from a value v between a range from min to max. Clamped between 0 and 1. + + + + + Mersenne Twister based random + + + + + Constructor with randomized seed + + + + + Constructor with provided 32 bit seed + + + + + (Re)initialize this instance with provided 32 bit seed + + + + + Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively + + + + + Generates a random value that is greater or equal than 0 and less than Int32.MaxValue + + + + + Returns a random value is greater or equal than 0 and less than maxValue + + + + + Generates a random value greater or equal than 0 and less or equal than Int32.MaxValue (inclusively) + + + + + Returns random value larger or equal to 0.0 and less than 1.0 + + + + + Min inclusive, Max exclusive! + + + + + Random float between 0 and 1. + + + + + + Adds an assembly's Non-Abstract Types to the cache for Barotrauma's Type lookup. + + Assembly to be added + Whether or not to overwrite an entry if the assembly already exists within it. + + + + Removes an assembly from the cache for Barotrauma's Type lookup. + + Assembly to remove. + + + + Skips validation for as long as the returned object remains in scope (remember to use using) + + + + + When set to true, the game is allowed to modify the vanilla content in debug builds. Has no effect in non-debug builds. + + + + + Returns file name characters that are invalid on any of our supported platforms (essentially the list of invalid characters on Windows) + + + + + Diff from UTC + + + + + DateTime wrapper that tries to offer a reliable + string representation that's also human-friendly + + + + + Event raised when a Character has been entered. + + + + + Event raised when a key has been pressed down. May fire multiple times due to keyboard repeat. + + + + + Event raised when a key has been released. + + + + + Raised when the user is editing text and IME is in progress. + + + + + Initialize the TextInput with the given GameWindow. + + The XNA window to which text input should be linked. + + + + Description of Voronoi. + + + + + @param xValuesIn Array of X values for each site. + @param yValuesIn Array of Y values for each site. Must be identical length to yValuesIn + @param minX The minimum X of the bounding box around the voronoi + @param maxX The maximum X of the bounding box around the voronoi + @param minY The minimum Y of the bounding box around the voronoi + @param maxY The maximum Y of the bounding box around the voronoi + @return + + + + Executed when the cell is destroyed (only applies to destructible level walls) + + + + + Returns the normal of the edge that points outwards from the specified cell + + +
+
\ No newline at end of file diff --git a/Lua For Barotrauma/Binary/BuildDocServer.xml b/Lua For Barotrauma/Binary/BuildDocServer.xml new file mode 100644 index 0000000..c180404 --- /dev/null +++ b/Lua For Barotrauma/Binary/BuildDocServer.xml @@ -0,0 +1,6139 @@ + + + + DedicatedServer + + + + Normally full affliction data is not written for dead characters, this can be used to force them to be written + + + + MonsterEvents disable monsters (which includes removing them from the character list, so they essentially "don't exist") until they're ready to spawn + + + + + Is the character controlled remotely (either by another player, or a server-side AIController) + + + + + Is the character controlled by another human player (should always be false in single player) + + + + + Is the character player or does it have an active ship command manager (an AI controlled sub)? Bots in the player team are not treated as commanders. + + + + + Prevents the character from interacting with items or characters + + + + + Prevents the character from highlighting items or characters with the cursor, + meaning it can't interact with anything but the things it has currently selected/equipped + + + + + Items the character has in their hand slots. Doesn't return nulls and only returns items held in both hands once. + + + + + Can be used by status effects to check whether the characters is in a high-pressure environment + + + + + Can be used by status effects + + + + + Was the character in full health at the beginning of the frame? + + + + + Current speed of the character's collider. Can be used by status effects to check if the character is moving. + + + + + The primary selected item. It can be any device that character interacts with. This excludes items like ladders and chairs which are assigned to . + + + + + The secondary selected item. It's an item other than a device (see ), e.g. a ladder or a chair. + + + + + Has the characters selected a primary or a secondary item? + + + + + Is the item either the primary or the secondary selected item? + + + + + + + Create a new character + + The name, gender, config file, etc of the character. + Position in display units. + RNG seed to use if the character config has randomizable parameters. + Is the character controlled by a remote player. + Is the character controlled by AI. + Ragdoll configuration file. If null, will select the default. + + + + Create a new character + + Name of the species (or the path to the config file) + Position in display units. + RNG seed to use if the character config has randomizable parameters. + The name, gender, etc of the character. Only used for humans, and if the parameter is not given, a random CharacterInfo is generated. + ID to assign to the character. If set to 0, automatically find an available ID. + Is the character controlled by a remote player. + Is the character controlled by AI. + Should clients receive a network event about the creation of this character? + Ragdoll configuration file. If null, will select the default. + + + + Can be used to modify the character's speed via StatusEffects + + + + + Can be used to modify the speed at which Propulsion ItemComponents move the character via StatusEffects (e.g. heavy suit can slow down underwater scooters) + + + + + Can be used to modify the character's health via StatusEffects + + + + + Health multiplier of the human prefab this character is an instance of (if any) + + + + + Speed reduction from the current limb specific damage. Min 0, max 1. + + + + + Values lower than this seem to cause constantious flipping when the mouse is near the player and the player is running, because the root collider moves after flipping. + + + + + A simple check if the character Dir is towards the target or not. Uses the world coordinates. + + + + + Finds the closest item seeking by identifiers or tags from the world. + Ignores items that are outside or in another team's submarine or in a submarine that is not connected to this submarine. + Also ignores non-interactable items and items that are taken by someone else. + The method is run in steps for performance reasons. So you'll have to provide the reference to the itemIndex. + Returns false while running and true when done. + + + + + Set an action that's invoked when another character interacts with this one. + + Action invoked when another character interacts with this one. T1 = this character, T2 = the interacting character + Displayed on the character when highlighted. + + + + How far the character is from the closest human player (including spectators) + + + + + How far the character is from the closest human player (including spectators) + + + + Force an order to be set for the character, bypassing hearing checks + + + + Apply the specified attack to this character. If the targetLimb is not specified, the limb closest to worldPosition will receive the damage. + + + + + Is the character knocked down regardless whether the technical state is dead, unconcious, paralyzed, or stunned. + With stunning, the parameter uses an one second delay before the character is treated as knocked down. The purpose of this is to ignore minor stunning. If you don't want to to ignore any stun, use the Stun property. + + + + + Calls using 'Inventory' and 'Info.InventoryData' + + + + + Returns hulls that are visible to the player, including the current hull. + Can be heavy if used every frame. + + + + + Is the character currently protected from the pressure by immunity/ability or a status effect (e.g. from a diving suit). + + + + + Check if the character is in the same room + Room and hull differ in that a room can consist of multiple linked hulls + + + + + Shows visual notification of money gained by the specific player. Useful for mid-mission monetary gains. + + + + + This dictionary is used for stats that are required very frequently. Not very performant, but easier to develop with for now. + If necessary, the approach of using a dictionary could be replaced by an encapsulated class that contains the stats as attributes. + + + + + A dictionary with temporary values, updated when the character equips/unequips wearables. Used to reduce unnecessary inventory checking. + + + + + ID of the last inputs the server has processed + + + + + The client opted to create a new character and discard this one + + + + + Note: Can be null. + + + + + Endocrine boosters can unlock talents outside the user's talent tree. This method is used to cull them from the selection + + + + + Returns unlocked talents that aren't part of the character's talent tree (which can be unlocked e.g. with an endocrine booster) + + + + + Can be used to disable displaying the job in any info panels + + + + + Unique ID given to character infos in MP. Non-persistent. + Used by clients to identify which infos are the same to prevent duplicate characters in round summary. + + + + + Returns a presumably (not guaranteed) unique hash using the (current) Name, appearence, and job. + So unless there's another character with the exactly same name, job, and appearance, the hash should be unique. + + + + + Returns a presumably (not guaranteed) unique hash using the OriginalName, appearence, and job. + So unless there's another character with the exactly same name, job, and appearance, the hash should be unique. + + + + + Reloads the head sprite and the attachment sprites. + + + + + Save current orders to the parameter element + + + + + Save current orders to + + + + Reloads the attachment xml elements according to the indices. Doesn't reload the sprites. + + + + + Executed server-side when a client attempts to use the command. + + + + + Using a command that's considered a cheat disables achievements + + + + + Use this constructor to create a command that executes the same action regardless of whether it's executed by a client or the server. + + + + + Other events can't trigger conversations if some other event has triggered one within this time. + Intended to prevent multiple events from triggering conversations at the same time. + + + + + Registers the exhaustible events in the level as exhausted, and adds the current events to the event history + + + + + Finds all actions in a ScriptedEvent + + + + + Get the entity that should be used in determining how far the player has progressed in the level. + = The submarine or player character that has progressed the furthest. + + + + + The list order is important. + It defines the order in which we "override" in case no valid position types are found + in the level when generating them in . + + + + + Percentage. Value between 0 and 1. + + + + + The reward that was actually given from completing the mission, taking any talent bonuses into account + (some of which may not be possible to determine in advance) + + + + + Where was this mission received from? Affects which faction we give reputation for if the mission is configured to give reputation for the faction that gave the mission. + Defaults to Locations[0] + + + + + Triggers the event or adds it to the delayedTriggerEvents it if it has a delay + + + + + Triggers the event immediately, ignoring any delays + + + + + End the mission and give a reward if it was completed successfully + + + + + Get the final reward, taking talent bonuses into account if the mission has concluded and the talents modified the reward accordingly. + + + + + Calculates the final reward after talent bonuses have been applied. Note that this triggers talent effects of the type OnGainMissionMoney, + and should only be called once when the mission is completed! + + + + + Note that the integer values matter here: + a larger or equal value than the RequiredRetrievalState means the item counts as retrieved + (if the item needs to be picked up to be considered retrieved, it's also considered retrieved if it's in the sub) + + + + + Does the target need to be picked up or brought to the sub for mission to be considered successful. + If None, the target has no effect on the completion of the mission. + + + + + Status effects executed on the target item when the mission starts. A random effect is chosen from each child list. + + + + + Entity sold in SP. Or, entity sold by client and confirmed by server in MP. + + + + + Entity sold by client in MP. Client has received at least one update from server after selling, but this entity wasn't yet confirmed. + + + + + Entity sold by client in MP. Client hasn't yet received an update from server after selling. + + + + + Saves bots in multiplayer + + + + + Remove info of a selected character. The character will not be visible in any menus or the round summary. + + + + + + Remove the character from the crew (and crew menus). + + The character to remove + If the character info is also removed, the character will not be visible in the round summary. + + + + Forces the server to sync the state of the wallet regardless if the balance/reward has changed + + + + + There is a client-side implementation of the method in + + + + The location that's displayed as the "current one" in the map screen. Normally the current outpost or the location at the start of the level, + but when selecting the next destination at the end of the level at an uninhabited location we use the location at the end + + + + + Automatically cleared after triggering -> no need to unregister + + + + + Load the first level and start the round after loading a save file + + + + + Which type of transition between levels is currently possible (if any) + + + + + Which submarine is at a position where it can leave the level and enter another one (if any). + + + + + Updates store stock before saving the game + + + + + Returns a random faction based on their ControlledOutpostPercentage + + If true, the method can return null if the sum of the factions ControlledOutpostPercentage is less than 100% + + + + Returns a random faction based on their SecondaryControlledOutpostPercentage + + If true, the method can return null if the sum of the factions SecondaryControlledOutpostPercentage is less than 100% + + + + Also serializes the current sub. + + + + + Notifies the clients of the current bot situation like syncing pending and available hires + + Inform the clients that these characters have been hired. + Inform the clients that this character has been fired. + + It might be obsolete to sync available hires. I found that the available hires are always the same between + the client and the server when there's only one person on the server but when a second person joins both of + their available hires are different from the server. + + + + + Loads the campaign from an XML element. Creates the map if it hasn't been created yet, otherwise updates the state of the map. + + + + + This class handles all upgrade logic. + Storing, applying, checking and validation of upgrades. + + + Upgrades are applied per item basis meaning each item has their own set of slots for upgrades. + The store applies upgrades globally to categories of items so the purpose of this class is to keep those individual "upgrade slots" in sync. + The target level of an upgrade is stored in the metadata and is what the store displays and modifies while this class will make sure that + the upgrades on the items match the values stored in the metadata. + + + + + This one toggles whether or not connected submarines get upgraded too. + Could probably be removed, I just didn't like magic numbers. + + + + + This is used by the client in multiplayer, acts like a secondary PendingUpgrades list + but is not affected by server messages. + + + Not used in singleplayer. + + + + + This is used by the client to notify the server which upgrades are yet to be paid for. + + + In singleplayer this does nothing. + + + + + Purchases an upgrade and handles logic for deducting the credit. + + + Purchased upgrades are temporarily stored in and they are applied + after the next round starts similarly how items are spawned in the stowage room after the round starts. + + + + + Purchases an item swap and handles logic for deducting the credit. + + + + + Cancels the currently pending item swap, or uninstalls the item if there's no swap pending + + + + + Applies all our pending upgrades to the submarine. + + + Upgrades are applied similarly to how items on the submarine are spawned at the start of the round. + Upgrades should be applied at the start of the round and after the round ends they are written into + the submarine save and saved there. + Because of the difficulty of accessing the actual Submarine object from and outpost or when the campaign UI is created + we modify levels that are shown on the store interface using campaign metadata. + + This method should be called by both the client and the server during level generation. + + + + + Makes the NPC talk or if no NPC has been specified find the upgrade NPC and make it talk. + + + + Optional NPC to make talk, if null tries to find one at the outpost. + + This might seem a bit spaghetti but it's the only way I could figure out how to do this and make it work + in both multiplayer and singleplayer because in multiplayer the client doesn't have access to SubmarineInfo.OutpostNPCs list + so we cannot find the upgrade NPC using that and the client cannot use Character.Speak anyways in multiplayer so the alternative + is to send network packages when interacting with the NPC. + + + + + Validates that upgrade values stored in CampaignMetadata matches the values on the submarine and fixes any inconsistencies. + Should be called after every round start right after + + + + + Applies an upgrade on the submarine, should be called by when the round starts. + + + + + + New level that was applied, -1 if no upgrades were applied. + + + + Gets the progress that is shown on the store interface. + Includes values stored in the metadata and , and takes submarine tier and class restrictions into account + + Submarine used to determine the upgrade limit. If not defined, will default to the current sub. + + + + Gets the level of the upgrade that is stored in the metadata. May be higher than the apparent level on the current sub if the player has switched to a lower-tier sub + + + + + Gets the level of the upgrade that is stored in the metadata. Takes into account the limits of the provided submarine. + + + + + Stores the target upgrade level in the campaign metadata. + + + + + Used to sync the pending upgrades list in multiplayer. + + + + + + Can be used by status effects + + + + + Automatically cleared after docking -> no need to unregister + + + + + Automatically cleared after undocking -> no need to unregister + + + + + Updates plant's state to fully grown or dead depending on its conditions. + + True if the plant has finished growing. + + + + The base class for components holding the different functionalities of the item + + + + + Which sound should be played when manual sound selection type is selected? Not [Editable] because we don't want this visible in the editor for every component. + + + + + Can be used by status effects or conditionals to the speed of the item + + + + a Character has picked the item + + + a Character has dropped the item + + + true if the operation was completed + + + + Remove the component so that it doesn't appear to exist in the game world (stop sounds, remove bodies etc) + but don't reset anything that's required for cloning the item + + + + + Returns 0.0f-1.0f based on how well the Character can use the itemcomponent + + 0.5f if all the skills meet the skill requirements exactly, 1.0f if they're way above and 0.0f if way less + + + + Returns 0.0f-1.0f based on how well the Character can use the itemcomponent + + 0.5f if all the skills meet the skill requirements exactly, 1.0f if they're way above and 0.0f if way less + + + + Shorthand for !HasRequiredContainedItems() + + + + + Only checks if any of the Picked requirements are matched (used for checking id card(s)). Much simpler and a bit different than HasRequiredItems. + + + + + Called when all items have been loaded. Use to initialize connections between items. + + + + + Called when all the components of the item have been loaded. Use to initialize connections between components and such. + + + + + The current brightness of the light source, affected by powerconsumption/voltage + + + + + Move items towards the last slot in the inventory if there's free slots + + + + + Power consumption of the engine. Only consume power when active and adjust consumption based on condition and target force. + + + + + When grid is resolved update the previous voltage + + + + + Power consumption of the fabricator. Only consume power when active and adjust consumption based on condition. + + + + + Move the items required for fabrication into the input container. + The method assumes that all the required ingredients are available either in the input container or linked containers. + + + + + Power consumption of the Pump. Only consume power when active and adjust consumption based on condition. + + + + + Returns a negative value (indicating the reactor generates power) when querying the power output connection. + + + + + Min and Max power output of the reactor based on tolerance + + + + + Determine how much power to output based on the load. The load is divided between reactors according to their maximum output in multi-reactor setups. + + + + + Do we need more fuel to generate enough power to match the current load. + + How low we allow the output/load ratio to go before loading more fuel. + 1.0 = always load more fuel when maximum output is too low, 0.5 = load more if max output is 50% of the load + + + + How fast the steering vector adjusts when the nav terminal is operated by something else than a character (= signals) + + + + + Get optimal velocity for moving towards a position + + Position to steer towards to + How heavily the sub slows down when approaching the target + + + + + Returns the power consumption if checking the powerIn connection, or a negative value if the output can provide power when checking powerOut. + Power consumption is proportional to set recharge speed and if there is less than max charge. + + + + + Minimum and maximum output for the queried connection. + Powerin min max equals CurrPowerConsumption as its abnormal for there to be power out. + PowerOut min power out is zero and max is the maxout unless below 10% charge where + the output is scaled relative to the 10% charge. + + Connection being queried + Current grid load + Minimum and maximum power output for the connection + + + + Finalized power out from the container for the connection, provided the given grid information + Output power based on the maxpower all batteries can output. So all batteries can + equally share powerout based on their output capabilities. + + + + + + + + + + When the corresponding grid connection is resolved, adjust the container's charge. + + + + + The item that launched this projectile (if any) + + + + + Should the collision with the target submarine be ignored (e.g. did the projectile collide with the wall behind the turret when being launched) + + Fixture the projectile hit + Contact between the projectile and the target + True if the target isn't a submarine or if the collision happened behind the launch position of the projectile + + + + Check if the character manages to succesfully repair the item + + + + + Should the progress bar be displayed. Use when AlwaysDisplayProgressBar is set to false. + + + + + Wires that have been disconnected from the panel, but not removed completely (visible at the bottom of the connection panel). + + + + + Allows rewiring the connection panel despite rewiring being disabled on a server + + + + + Check if the character manages to succesfully rewire the panel, and if not, apply OnFailure effects + + + + + Pass the parent component to the constructor to access the serializable properties + for elements which change property values. + + + + + Can be used to display messages on the terminal via status effects + + + + + Returns the wifi components that can receive signals from this one + + + + + Returns the wifi components that can transmit signals to this one + + + + + Effects applied to entities inside the trigger + + + + + Attacks applied to entities inside the trigger + + + + + Get a random quality for an item spawning in some sub, taking into account the type of the submarine and the difficulty of the current level + (high-quality items become more common as difficulty increases) + + + + + Discharge coil only draws power when charging + + + + + Returns a random side that is not occupied. + + + There is probably a much better way of doing this than allocating memory with an array + but this felt like the most reliable approach I could come up with. + + + + + + Defines items that boost the weapon functionality, like battery cell for stun batons. + + + + + Activate sleeping ragdolls that are close enough to hit with the weapon (otherwise the collision will not be registered) + + + + + The capacity of the main container without taking the sub containers into account. Only differs when there's a sub container defined for the component. + + + + + Can be used by status effects to lock the inventory + + + + + Returns the index of the first slot whose restrictions match the specified tag or identifier + + + + + Power consumption of the MiniMap. Only consume power when active and adjust consumption based on condition. + + + + + Power consumption of the Oxygen Generator. Only consume power when active and adjust consumption based on condition. + + + + Accessed through event actions. Do not remove even if there are no references in code. + + + + Power consumption of the sonar. Only consume power when active and adjust the consumption based on the sonar mode. + + + + + Attempts to harvest a fully grown plant or removes a decayed plant if any + + The character who gets the produce or null if they should drop on the floor. + + + + + Order in which power sources will provide to a grid, lower number is higher priority + + + + + Used by reactors to communicate their maximum output to each other so they can divide the grid load between each other in a sensible way + + + + + List of all powered ItemComponents + + + + + The amount of power currently consumed by the item. Negative values mean that the item is providing power to connected items + + + + + Current voltage of the item (load / power) + + + + + The minimum voltage required for the item to work + + + + + The maximum amount of power the item can draw from connected items + + + + + Maximum voltage factor when the device is being overvolted. I.e. how many times more effectively the device can function when it's being overvolted + + + + + Essentially Voltage / MinVoltage (= how much of the minimum required voltage has been satisfied), clamped between 0 and 1. + Can be used by status effects or sounds to check if the item has enough power to run + + + + + Allocate electrical devices into their grids based on connections + + Use previous grids and change in connections + + + + Update the power calculations of all devices and grids + Updates grids in the order of + ConnCurrConsumption - Get load of device/ flag it as an outputting connection + -- If outputting power -- + MinMaxPower - Minimum and Maximum power output of the connection for devices to coordinate + ConnPowerOut - Final power output based on the sum of the MinMaxPower + -- Finally -- + GridResolved - Indicate that a connection's grid has been finished being calculated + + Power outputting devices are calculated in stages based on their priority + Reactors will output first, followed by relays then batteries. + + + + + + + Current power consumption of the device (or amount of generated power if negative) + + Connection to calculate power consumption for. + + + + Minimum and maximum power the connection can provide + + Connection being queried about its power capabilities + Load of the connected grid + + + + Finalize how much power the device will be outputting to the connection + + Connection being queried + Current grid power + Current load on the grid + Power pushed to the grid + + + + Can be overridden to perform updates for the device after the connected grid has resolved its power calculations, i.e. storing voltage for later updates + + + + + Returns the amount of power that can be supplied by batteries directly connected to the item + + + + + Returns a list of batteries directly connected to the item + + + + + Additional load coming from somewhere else than the devices connected to the junction box (e.g. ballast flora or piezo crystals). + Goes back to zero automatically if you stop setting the value. + + + + + Relay power consumption. Load consumption is based on the internal buffer. + This allows for the relay to react to demand and find equilibrium in loop configurations. + + + + + Minimum and maximum power out for the relay. + Max out is adjusted to allow for other relays to compensate if this relay is undervolted. + + + + + Power out for the relay connection. + Relay will output the necessary power to the grid based on maximum power output of other + relays and will undervolt and overvolt the grid following its supply grid. + + Power outputted to the grid + + + + Connection's grid resolved, determine the difference to be added to the buffer. + Ensure the prevVoltage voltage is updated once both grids are resolved. + + + + + Turret doesn't consume grid power, directly takes from the batteries on its grid instead. + + + + Defaults to if null + + + + Removes one item from the slot + + + + + Removes all items from the slot + + + + + All items contained in the inventory. Stacked items are returned as individual instances. DO NOT modify the contents of the inventory while enumerating this list. + + + + + All items contained in the inventory. Allows modifying the contents of the inventory while being enumerated. + + + + + Is the item contained in this inventory. Does not recursively check items inside items. + + + + + Return the first item in the inventory, or null if the inventory is empty. + + + + + Return the last item in the inventory, or null if the inventory is empty. + + + + + Get the item stored in the specified inventory slot. If the slot contains a stack of items, returns the first item in the stack. + + + + + Get all the item stored in the specified inventory slot. Can return more than one item if the slot contains a stack of items. + + + + + Find the index of the first slot the item is contained in. + + + + + Find the indices of all the slots the item is contained in (two-hand items for example can be in multiple slots). Note that this method instantiates a new list. + + + + + Returns true if the item owns any of the parent inventories. + + + + + Can the item be put in the inventory (i.e. is there a suitable free slot or a stack the item can be put in). + + + + + Can the item be put in the specified slot. + + + + + If there is room, puts the item in the inventory and returns true, otherwise returns false + + + + + Is there room to put more items in the inventory. Doesn't take stacking into account by default. + + If true, the inventory is not considered full if all the stacks are not full. + + + + Forces an item to a specific slot. Doesn't remove the item from existing slots/inventories or do any other sanity checks, use with caution! + + + + + Removes an item from a specific slot. Doesn't do any sanity checks, use with caution! + + + + + Deletes all items inside the inventory (and also recursively all items inside the items) + + + + + Items that have one more more Repairable component + + + + + Items that may potentially need to be cleaned up (pickable, not attached to a wall, and not inside a valid container) + + + + + Components that are Active or need to be updated for some other reason (status effects, sounds) + + + + + Removes the override value -> falls back to using the original value defined in the xml. + + + + + Unscaled rect + + + + + Use to also check + + + + Checks both and + + + + Returns interactibility based on whether the character is on a player team + + + + + Can be used by status effects or conditionals to check what item this item is contained inside + + + + + Can be used by status effects or conditionals to check whether the item is contained inside something + + + + + Can be used by status effects or conditionals to the speed of the item + + + + + Can be used by status effects or conditionals to check if the physics body of the item is active + + + + + Should the item's Use method be called with the "Use" or with the "Shoot" key? + + + + + If true, the user has to hold the "aim" key before use is registered. False by default. + + + + + If true, the user has to hold the "aim" key before secondary use is registered. True by default. + + + + + Return true if the condition of this item increased within the last second. + + + + + Per-instance value - if not set, the value of the prefab is used. + + + + + A list of connections the last signal sent by this item went through + + + + + Can be used to move the item from XML (e.g. to correct the positions of items whose sprite origin has been changed) + + + + + Can be used to move the item from XML (e.g. to correct the positions of items whose sprite origin has been changed) + + + + + Creates a new item + + Should the OnItemLoaded methods of the ItemComponents be called. Use false if the item needs additional initialization before it can be considered fully loaded (e.g. when loading an item from a sub file or cloning an item). + + + + Is dropping the item allowed when trying to swap it with the other item + + + + + Recheck if the item needs to be included in the list of cleanable items + + + + + goes through every item and re-checks which hull they are in + + + + + Recalculates the item's maximum condition, condition percentage and whether it's in full condition. + You generally never need to call this manually - done automatically when any of the factors that affect the values change. + + + + + Applies buoyancy, drag and angular drag caused by water + + + + + Note: This function generates garbage and might be a bit too heavy to be used once per frame. + + + + + Note: This function generates garbage and might be a bit too heavy to be used once per frame. + + + + + Character who dropped the item + Should clients be notified of the item being dropped + Should the transform of the physics body be updated. Only disable this if you're moving the item somewhere else / calling SetTransform manually immediately after dropping! + + + + Instantiate a new item and load its data from the XML element. + + The element containing the data of the item + The submarine to spawn the item in (can be null) + Should an EntitySpawner event be created to notify clients about the item being created. + + + + + Remove the item so that it doesn't appear to exist in the game world (stop sounds, remove bodies etc) + but don't reset anything that's required for cloning the item + + + + + How far outside the boundaries of the level the water current that pushes subs towards the level starts + + + + + How far outside the boundaries of the level the strength of the current starts to increase exponentially + + + + + How far outside the boundaries of the level the current stops submarines entirely + + + + + The level generator won't try to adjust the width of the main path above this limit. + + + + + The crush depth of a non-upgraded submarine in in-game coordinates. Note that this can be above the top of the level! + + + + + The crush depth of a non-upgraded submarine in "real world units" (meters from the surface of Europa). Note that this can be above the top of the level! + + + + + Random integers generated during the level generation. If these values differ between clients/server, + it means the levels aren't identical for some reason and there will most likely be major ID mismatches. + + + + + Is there a loaded level set and is it an outpost? + + + + + Is there a loaded level set, and is it a friendly outpost (FriendlyNPC or Team1). Does not take reputation into account. + + + + + Can be null unless initialized in constructor + + + + List is initialized only when specified, otherwise will be null + + + Used by clients to set the rotation for the resources + + + + Calculate the "real" depth in meters from the surface of Europa + + + + + Reset what this client has voted for and the kick votes given to this client + + + + + An ID for this client for the current session. + THIS IS NOT A PERSISTENT VALUE. DO NOT STORE THIS LONG-TERM. + IT CANNOT BE USED TO IDENTIFY PLAYERS ACROSS SESSIONS. + + + + + The ID of the account used to authenticate this session. + This value can be used as a persistent value to identify + players in the banlist and campaign saves. + + + + + Is the client using the 'freecam' console command? + + + + + How much messages sent by should get garbled. Takes the distance between the entities and optionally the obstructions between them into account (see ). + + Values greater than or equal to 1 cause the message to get garbled more heavily when there's some obstruction between the characters. Values smaller than 1 mean the garbling only depends on distance. + + + + Chat messages that get sent to the owner of the server when the owner is determined + + + + + Creates a message that gets sent to the server owner once the connection is initialized. Can be used to for example notify the owner of problems during initialization + + + + + Write info that the client needs when joining the server + + + + + Add the message to the chatbox and pass it to all clients who can receive it + + + + + Writes all the events that the client hasn't received yet into the outgoing message + + + + + Writes all the events that the client hasn't received yet into the outgoing message + + + + + Returns a list of events that should be sent to the client from the eventList + + + + + Read the events from the message, ignoring ones we've already received + + + + + Check if the two version are compatible (= if they can play together in multiplayer). + + + + + Used when the order targets a wall + + + + + Same as calling , + but the text parameter is set using + + + + How much skills drop towards the job's default skill levels when dying + + + + + When will the shuttle be dispatched with respawned characters + + + + + When will the sub start heading back out of the level + + + + + Have some of the properties listed in the server list changed + + + + + A list of int pairs that represent the ranges of UTF-16 codes allowed in client names + + + + + Interface for entities that the clients can send events to the server + + + + + Interface for entities that the server can send events to the clients + + + + + Interface for entities that handle ServerNetObject.ENTITY_POSITION + + + + + How long the server waits for the clients to get in sync after the round has started before kicking them + + + + + How long the server keeps events that everyone currently synced has received + + + + + If a client hasn't received an event that has been succesfully sent to someone within this time, they get kicked + + + + + If a client hasn't received an event after this time, they get kicked + + + + + Interpolates the positional error of a physics body towards zero. + + + + + Interpolates the rotational error of a physics body towards zero. + + + + + Interpolates the cursor position error towards zero. + + + + + Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager + + + + + Helper class for dealing with 16-bit IDs that wrap around ushort.MaxValue + + + + + Is newID more recent than oldID, i.e. newId > oldId accounting for ushort rollover + + + + + newId >= oldId accounting for ushort rollover (newer or equals) + + + + + Returns some ID that is older than the input ID. There are no guarantees + regarding its relation to values other than the input. + + + + + Is the current ID valid given the previous ID and latest possible ID (not smaller than the previous ID or larger than the latest ID) + + + + Based on information found here: https://developer.valvesoftware.com/wiki/SteamID + ------------------------------------------------------------------------------------ + A SteamID is a 64-bit value (16 hexadecimal digits) that's broken up as follows: + + | a | b | c | d | + Most significant - | 01 | 1 | 00001 | 0546779D | - Least significant + + a) 8 bits representing the universe the account belongs to. + b) 4 bits representing the type of account. Typically 1. + c) 20 bits representing the instance of the account. Typically 1. + d) 32 bits representing the account number. + + The account number is additionally broken up as follows: + + | e | f | + Most significant - | 0000010101000110011101111001110 | 1 | - Least significant + + e) These are the 31 most significant bits of the account number. + f) This is the least significant bit of the account number, discriminated under the name Y for some reason. + + Barotrauma supports two textual representations of SteamIDs: + 1. STEAM40: Given this name as it represents 40 of the 64 bits in the ID. The account type and instance both + have an implied value of 1. The format is "STEAM_{universe}:{Y}:{restOfAccountNumber}". + 2. STEAM64: If STEAM40 does not suffice to represent an ID (i.e. the account type or instance were different + from 1), we use "STEAM64_{fullId}" where fullId is the 64-bit decimal representation of the full + ID. + + + + The primary ID for a given user + + + + + Other user IDs that this user might be closely tied to, + such as the owner of the current copy of Barotrauma + + + + + Utility struct for writing Singles + + + + + Value as a 32 bit float + + + + + Value as an unsigned 32 bit integer + + + + + This exists because Lidgren is a piece of shit and + doesn't readily support sending anything other than + a string through a disconnect packet, so this thing + needs a sufficiently nasty string representation that + can be decoded with some certainty that it won't get + mangled by user input. + + + + + Update which branches are currently in range of fires + + + + + Create a body for a branch which works as the hitbox for flamer + + + + + + Decorative branches that grow around the root + + + + + How far from the root this branch is + + + + + Inherited flags from outpost generation. + + + + + Approximate distance from this hull to the target hull, moving through open gaps without passing through walls. + Uses a greedy algo and may not use the most optimal path. Returns float.MaxValue if no path is found. + + + + + Returns the hull which contains the point (or null if it isn't inside any) + + The position to check + This hull is checked first: if the current hull is known, this can be used as an optimization + Should world coordinates or the sub's local coordinates be used? + Does being exactly at the edge of the hull count as being inside? + + + + Returns the hull which contains the point (or null if it isn't inside any). The difference to FindHull is that this method goes through all hulls without trying + to first find the sub the point is inside and checking the hulls in that sub. + = This is slower, use with caution in situations where the sub's extents or hulls may have changed after it was loaded. + + + + + Is this hull or any of the items inside it tagged as "airlock"? + + + + + Does this hull have any doors leading outside? + + Used to check if this character has access to the door leading outside + + + + Unscaled rect + + + + + In radians, takes flipping into account + + + + + Offset of the physics body from the center of the structure. Takes flipping into account. + + + + + Checks if there's a structure items can be attached to at the given position and returns it. + + + + + Sections that are leaking have a gap placed on them + + + + + Extents of the solid items/structures (ones with a physics body) and hulls + + + + + Extents of all the visible items/structures/hulls (including ones without a physics body) + + + + + How deep down the sub is from the surface of Europa in meters (affected by level type, does not correspond to "actual" coordinate systems) + + + + + Creates an AI that operates all the turrets on a sub, same as Thalamus but only operates the turrets. + + + + + Returns a rect that contains the borders of this sub and all subs docked to it, excluding outposts + + + + + Don't use this directly, because the list is updated only when GetConnectedSubs() is called. The method is called so frequently that we don't want to create new list here. + + + + + Returns a list of all submarines that are connected to this one via docking ports, including this sub. + + + + + Attempt to find a spawn position close to the specified position where the sub doesn't collide with walls/ruins + + + + + Returns a list of physics bodies the ray intersects with, sorted according to distance (the closest body is at the beginning of the list). + + Can be used to filter the bodies based on some condition. If the predicate returns false, the body isignored. + Should fixtures that the start of the ray is inside be returned + + + + check visibility between two points (in sim units) + + a physics body that was between the points (or null) + + + If has value, the sub must match the team type. + + + + Returns true if the sub is same as the other. + + + + + Finds the sub whose borders contain the position + + + + + Permanently disables obstructed waypoints obstructed by the level. + + + + + Temporarily disables waypoints obstructed by the other sub. + + + + + Only affects temporarily disabled waypoints. + + + + + Are there any entities in the spawn queue that match the given predicate + + + + + How many entities in the spawn queue match the given predicate + + + + + Takes flipping (Dir) into account. + + + + + Ignore rotation calls for the rest of this and the next update. Automatically disabled after that. Used for temporarily suppressing the SmoothRotate calls to prevent conflicting or unitentionally amplified rotations. + + + + + Returns the farthest point towards the forward of the body. + For capsules and circles, the front is at the top. + For horizontal capsules, the front is at the right-most point. + For rectangles, the front is either at the top or at the right, depending on which one of the two is greater: width or height. + The rotation is in radians. + + + + + Apply an impulse to the body without increasing it's velocity above a specific limit. + + + + + Apply an impulse to the body without increasing it's velocity above a specific limit. + + + + + Applies buoyancy, drag and angular drag caused by water + + + + + Rotate the body towards the target rotation in the "shortest direction", taking into account the current angular velocity to prevent overshooting. + + Desired rotation in radians + How fast the body should be rotated. Does not represent any real unit, you may want to experiment with different values to get the desired effect. + Should the angles be wrapped. Set to false if it makes a difference whether the angle of the body is 0.0f or 360.0f. + + + + The main class. + + + + + The main entry point for the application. + + + + + Fetches a Workshop item's metadata. This is batched to minimize Steamworks API calls. + The description of the returned item is truncated to save bandwidth. + + Workshop Item ID + + + + Fetches a Workshop item's metadata in its own API call instead of batching. + This minimizes delay but needs to be used with caution to prevent rate limiting. + + Workshop Item ID + + If true, ask for the item's entire description, otherwise it'll be truncated. + + + + + This class creates a file called ".copying" that + serves to keep mod copy operations in the same + directory from overlapping. + + + + + This class serves the purpose of preventing + more than 10 mod install tasks from proceeding + at the same time. + + + + + Has the mission been completed (does not mean that the traitor necessarily won, the mission is considered completed if the traitor fails for whatever reason) + + + + + A struct that executes an action when it's created and another one when it's disposed. + + + + + Timer that keeps track of how long it takes to process a packet. + + + + + Amount of strikes the client has received for causing the server to slow down. + + + + + How many packets have been sent in the last minute. + + + + + Resets the strikes and packet count. + + + + + Resets the timer. + + + + + Called when the server receives a packet to start logging how much time it takes to process. + + The client to start a timer for. + Nothing useful. Required for the "using" keyword. + + Calling stop is not required, the timer will be stopped automatically when the function it was started in returns. + + + + public void ServerRead(IReadMessage msg, Client c) + { + // start the timer + using var _ = dosProtection.Start(connectedClient); + + if (condition) + { + // the timer will be stopped here. + return; + } + + ProcessMessage(msg); + // the timer will be stopped here. + } + + + + + + Temporary pauses the timer for the client. + Used when we know a packet is going to slow down the server but we don't want to count it as a strike. + For example when a client is starting a round. + + The client to pause the timer for. + Nothing useful. Required for the "using" keyword. + + Calling resume is not required, the timer will be resumed automatically when the using block ends. + + + + using (dos.Pause(client)) + { + // do something that will slow down the server + } + // the timer will be resumed here + + + + + + An arbitrary identifier that can be used to determine what kind of a message this is + and prevent characters from saying the same kind of line too often. + + + + + Is the current path valid, using the provided parameters. + + + + + When is defined, returns false if any of the nodes fails to match the predicate. + + + + How long does it take for the ai target to fade out if not kept alive. + + + + + Should be reset to false each frame and kept indetectable by e.g. a status effect. + + + + + Does the AI target do something that requires Update() to be called (e.g. static targets don't need to be updated) + + + + + Enable the character to attack the outposts and the characters inside them. Disabled by default in normal levels, enabled in outpost levels. + + + + + The monster won't try to damage these submarines + + + + + How long do we hold on to the current state after losing a target before we reset back to the original state. + In other words, how long do we have to idle before the original state is restored. + + + + + Resets the target's state to the original value defined in the xml. + + + + + Temporarily changes the predefined state for a target. Eg. Idle -> Attack. + Note: does not change the current AIState! + + + + + Resets each frame + + + + + How far other characters can hear reports done by this character (e.g. reports for fires, intruders). Defaults to infinity. + + + + + List of previous attacks done to this character + + + + + Waypoints that are not linked to a sub (e.g. main path). + + + + + Returns true when the safety is stale + + + + + The bot breaks free if being dragged by a human player from another team for longer than this + + + + + If the RefuseDraggingDuration is active (the bot recently broke free of being dragged), the bot breaks free much faster + + + + + Check whether the character has a diving suit in usable condition plus some oxygen. + + + + + Check whether the character has a diving mask in usable condition plus some oxygen. + + + + + Note: uses a single list for matching items. The item is reused each time when the method is called. So if you use the method twice, and then refer to the first items, you'll actually get the second. + To solve this, create a copy of the collection or change the code so that you first handle the first items and only after that query for the next items. + + + + + Updates the hull safety for all ai characters in the team. The idea is that the crew communicates (magically) via radio about the threads. + The safety levels need to be calculated for each bot individually, because the formula takes into account things like current orders. + There's now a cached value per each hull, which should prevent too frequent calculations. + + + + + Including the player characters in the same team. + + + + + Returns true if any node in the path is in stairs + + + + + Seeks the ladder from the next and next + 1 nodes. + + + + + Can there be multiple objective instaces of the same type? + + + + + Run the main objective with all subobjectives concurrently? + If false, the main objective will continue only when all the subobjectives have been removed (done). + + + + + There's a separate property for diving suit and mask: KeepDivingGearOn. + + + + + Final priority value after all calculations. + + + + + When true, the objective is never completed, unless CanBeCompleted returns false. + + + + + Aborts the objective when this condition is true. + + + + + A single shot event. Automatically cleared after launching. Use OnCompleted method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnAbandoned method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnSelected method for implementing (internal) persistent behavior. + + + + + A single shot event. Automatically cleared after launching. Use OnDeselected method for implementing (internal) persistent behavior. + + + + + Makes the character act according to the objective, or according to any subobjectives that need to be completed before this one + + + + + This method allows multiple subobjectives of same type. Use with caution. + + + + + Call this only when the priority needs to be recalculated. Use the cached Priority property when you don't need to recalculate. + + + + + Checks if the subobjectives in the given collection are removed from the subobjectives. And if so, removes it also from the dictionary. + + + + + Checks if the objective already is created and added in subobjectives. If not, creates it. + Handles objectives that cannot be completed. If the objective has been removed form the subobjectives, a null value is assigned to the reference. + Returns true if the objective was created and successfully added. + + + + + Don't start using a weapon if this condition is true + + + + + Seeks for more ammunition. Creates a new subobjective. + + + + + Reloads the ammunition found in the inventory. + If seekAmmo is true, tries to get find the ammo elsewhere. + + + + + Only remove existing items when the contain target can't be put in the inventory + + + + + If true drops the item when containing the item fails. + In both cases abandons the objective. + Note that has no effect if the target container was not defined (always drops) -> completes when the item is dropped. + + + + + 0-1 based on the horizontal size of all of the fires in the hull. + + + + + Diving gear that's suitable for wearing indoors (-> the bots don't try to unequip it when they don't need diving gear) + + + + + Tries to find the best (safe, nearby) hull the character can find a path to. + Checks one hull at a time, and returns HullSearchStatus.Finished when all potential hulls have been checked. + + + + + Is the character allowed to take the item from somewhere else than their own sub (e.g. an outpost) + + + + + Are variants of the specified item allowed + + + + + Returns the "best" item to spawn when using and there's multiple suitable items. + Best in this context is the one that's sold at the lowest price in stores (usually the most "basic" item) + + + + + + Does not reset the ignored items list + + + + + Doesn't allow the objective to complete if this condition is false + + + + + Which event action created this objective (if any) + + + + + Display units + + + + + If true, the distance to the destination is calculated from the character's AimSourcePos (= shoulder) instead of the collider's position + + + + + List of all possible items of the specified type. Used for filtering the removed objectives. + + + + + Excluding the current order. + + + + + When set above zero, the character will stand still doing nothing until the timer runs out. Does not affect orders, find safety or combat. + + + + + The AIObjective in with the highest + + + + Returns all active objectives of the specific type. Creates a new collection -> don't use too frequently. + + + + + If undefined, a default filter will be used. + + + + + If set, only fix items where required skill matches this. + + + + + Name that can be used with the contextual version of the order + + + + + If defined, the order can only be quick-assigned to characters with these jobs. Or if it's a report, the icon will only be displayed to characters with these jobs. + + + + + Can the order be turned into a non-entity-targeting one if it was originally created with a target entity. + Note: if MustSetTarget is true, CanBeGeneralized will always be false. + + + + + If defined, the order will be quick-assigned to characters with these jobs before characters with other jobs. + + + + + Should the order icon be drawn when the order target is inside a container + + + + + Affects how high on the order list the order will be placed (i.e. the manual priority order when it's given) when it's first given. + Manually rearranging orders will override this priority. + + + + + Get the target item component based on the target item type + + + + Only returns items which are interactable for this character + + + Only returns items which are interactable for this character + + + + Used to create the order option for the Dismiss order to know which order it targets + + The order to target with the dismiss order + + + + Create an Order instance with a null target + + + + + Note this property doesn't return the follow target of the Follow objective, as expected! + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Constructor for orders with the target type OrderTargetType.Entity + + + + + Constructor for orders with the target type OrderTargetType.Position + + + + + Constructor for orders with the target type OrderTargetType.WallSection + + + + + Get the target item component based on the target item type + + + + Only returns items which are interactable for this character + + + Only returns items which are interactable for this character + + + + Used to create the order option for the Dismiss order to know which order it targets + + The order to target with the dismiss order + + + + Note: Presupposes that the slow speed is lower than the high speed. Otherwise will give invalid results. + + + + + Note: creates a new list every time, because the params might have changed. If there is a need to access the property frequently, change the implementation to an array, where the slot is updated when the param is updated(?) + Currently it's not simple to implement, since the properties are not implemented here, but in the derived classes. Would require to change the params virtual and to call the base property getter/setter or something. + + + + + Maximum damage per impact (0.1 = 10% of the character's maximum health) + + + + + In sim units. Joint scale applied. + + + + + Call this to create the ragdoll from the RagdollParams. + + + + + Saves all serializable data in the currently selected ragdoll params. This method should properly handle character flipping. + + + + + Resets the serializable data to the currently selected ragdoll params. + Force reloading always loads the xml stored on the disk. + + + + + Resets the current joint values to the serialized joint params. + + + + + Resets the current limb values to the serialized limb params. + + + + if false, force is applied to the position of pullJoint + + + + How long has the ragdoll stayed motionless + + + + + Get the position of the surface of water at the position of the character, in display units (taking into account connected hulls above the hull the character is in) + + + + + Get the position of the surface of water and the ceiling (= upper edge of the hull) at the position of the character, in display units (taking into account connected hulls above the hull the character is in). + + + + + Note that if there are multiple limbs of the same type, only the first (valid) limb is returned. + + + + + Attacks are used to deal damage to characters, structures and items. + They can be defined in the weapon components of the items or the limb definitions of the characters. + The limb attacks can also be used by the player, when they control a monster or have some appendage, like a husk stinger. + + + + + Used for multiplying all the damage. + + + + + Used for multiplying all the ranges. + + + + + Used for multiplying the physics forces. + + + + + Only affects ai decision making. All the conditionals has to be met in order to select the attack. TODO: allow to define conditionals using any (implemented in StatusEffect -> move from there to PropertyConditional?) + + + + + StatusEffects to apply when the attack triggers. + StatusEffect types of 'OnUse' are executed always, 'OnFailure' only when the attack doesn't deal damage and 'OnSuccess' executes when some damage is dealt. + + + + + Which character gave this affliction + + + + + Copy properties here instead of using SerializableProperties (with reflection). + + + + + Use this method to skip clamping and additional logic of the setters. + Ideally we would keep this private, but doing so would require too much refactoring. + + + + + A special affliction type that increases the character's Bloodloss affliction with a rate relative to the strength of the bleeding. + + + + + A special affliction type that gradually makes the character turn into another type of character. + See for more details. + + + + + AfflictionPrefabHusk is a special type of affliction that has added functionality for husk infection. + + + + + The minimum strength at which husk infection will be in the dormant stage. + It must be less than or equal to ActiveThreshold. + + + + + The minimum strength at which husk infection will be in the active stage. + It must be greater than or equal to DormantThreshold and less than or equal to TransitionThreshold. + + + + + The minimum strength at which husk infection will be in its final stage. + It must be greater than or equal to ActiveThreshold. + + + + + The minimum strength the affliction must have for the affected character + to transform into a husk upon death. + + + + + The species of husk to convert the affected character to + once husk infection reaches its final stage. + + + + + If set to true, all buffs are transferred to the converted + character after husk transformation is complete. + + + + + If set to true, the affected player will see on-screen messages describing husk infection symptoms + and affected bots will speak about their current husk infection stage. + + + + + If set to true, affected characters will have their speech impeded once the affliction + reaches the dormant stage. + + + + + If set to false, affected characters will no longer require air + once the affliction reaches the active stage. + + + + + If set to true, affected players will retain control of their character + after transforming into a husk. + + + + + AfflictionPrefab is a prefab that defines a type of affliction that can be applied to a character. + There are multiple sub-types of afflictions such as AfflictionPrefabHusk, AfflictionPsychosis and AfflictionBleeding that can be used for additional functionality. + + When defining a new affliction, the type will be determined by the element name. + + + + + + + + + + + + + + + + + Effects are the primary way to add functionality to afflictions. + + + + + Enables the specified flag on the character as long as the effect is active. + + + + Flag that will be enabled for the character as long as the effect is active. + + + Which ability flag to enable. + + + + + + + A list of identifiers of afflictions that the affected character will be + resistant to when this effect is active. + + + + + StatType that will be applied to the affected character when the effect is active that is proportional to the effect's strength. + + + + + + + + + + + + + + + Which StatType to apply + + + + + Minimum value to apply + + + + + Minimum value to apply + + + + + Constant value to apply, will be ignored if MinValue or MaxValue are set + + + + + Prevents AfflictionHusks with the specified identifier(s) from transforming the character into an AI-controlled character. + + + + + StatType that will be applied to the affected character when the effect is active that is proportional to the effect's strength. + + + + + Returns 0 if affliction.Strength is MinStrength, + 1 if affliction.Strength is MaxStrength + + + + + Returns 0 if affliction.Strength is MinStrength, + 1 if affliction.Strength is MaxStrength + + + + + The description element can be used to define descriptions for the affliction which are shown under specific conditions; + for example a description that only shows to other players or only at certain strength levels. + + + + Raw text for the description. + + + + + + Everyone can see the description. + + + + + Only the affected character can see the description. + + + + + The affected character cannot see the description but others can. + + + + + Raw text for the description. + + + + + Text tag used to set the text from the localization files. + + + + + Minimum strength required for the description to be shown. + + + + + Maximum strength required for the description to be shown. + + + + + Who can see the description. + + + + + PeriodicEffect applies StatusEffects to the character periodically. + + + + + How often the status effect is applied in seconds. + Setting this attribute will set both the min and max interval to the specified value. + + + Minimum interval between applying the status effect in seconds. + + + Maximum interval between applying the status effect in seconds. + + + + + + Arbitrary string that is used to identify the type of the affliction. + + + + + If set to true, the affliction affects individual limbs. Otherwise, it affects the whole character. + + + + + If the affliction doesn't affect individual limbs, this attribute determines + where the game will render the affliction's indicator when viewed in the + in-game health UI. + + For example, the psychosis indicator is rendered on the head, and low oxygen + is rendered on the torso. + + + + + Can be set to the identifier of another affliction to make this affliction + reuse the same name and description. + + + + + If set to true, the game will recognize this affliction as a buff. + This means, among other things, that bots won't attempt to treat it, + and the health UI will render the affected limb in green rather than red. + + + + + If set to true, this affliction can affect characters that are marked as + machines, such as the Fractal Guardian. + + + + + If set to true, this affliction can be healed at the medical clinic. + + + + false if the affliction is a buff or has the type "geneticmaterialbuff" or "geneticmaterialdebuff", true otherwise. + + + + + + How much each unit of this affliction's strength will add + to the cost of healing at the medical clinic. + + + + + The minimum cost of healing this affliction at the medical clinic. + + + + + If set to false, the health UI will not show the strength of the affliction + as a bar under its indicator. + + + + + If set to true, this affliction's icon will be hidden from the HUD after 5 seconds. + + + + + How high the strength has to be for the affliction to take effect + + + + + How high the strength has to be for the affliction icon to be shown in the UI + + + + + How high the strength has to be for the affliction icon to be shown to others with a health scanner or via the health interface + + + + + The maximum strength this affliction can have. + + + + + The strength of the radiation grain effect to apply when the strength of this affliction increases. + + + + + How high the strength has to be for the affliction icon to be shown with a health scanner + + + + + How strong the affliction needs to be before bots attempt to treat it. + Also effects when the affliction is shown in the suitable treatments list. + + + + + Bots will not try to treat the affliction if the character has any of these afflictions + + + + + The duration of the affliction, in seconds. If set to 0, the affliction does not expire. + + + + + How much karma changes when a player applies this affliction to someone (per strength of the affliction) + + + + + Opacity of the burn effect (darker tint) on limbs affected by this affliction. 1 = full strength. + + + + + Opacity of the bloody damage overlay on limbs affected by this affliction. 1 = full strength. + + + + + + Steam achievement given when the affliction is removed from the controlled character. + + + + + A gradient that defines which color to render this affliction's icon + with, based on the affliction's current strength. + + + + + If set to true and the affliction has an AfflictionOverlay element, the overlay's opacity will be strictly proportional to its strength. + Otherwise, the overlay's opacity will be determined based on its activation threshold and effects. + + + + + If set to true, this affliction will not persist between rounds. + + + + + Should damage particles be emitted when a character receives this affliction? + Only relevant if the affliction is of the type "bleeding" or "damage". + + + + + An arbitrary modifier that affects how much medical skill is increased when you apply the affliction on a target. + If the affliction causes damage or is of the 'poison' or 'paralysis' type, the skill is increased only when the target is hostile. + If the affliction is of the 'buff' type, the skill is increased only when the target is friendly. + + + + + An arbitrary modifier that affects how much weapons skill is increased when you apply the affliction on a target. + The skill is increased only when the target is hostile. + + + + + A list of species this affliction is allowed to affect. + + + + + Effects to apply at various strength levels. + Only one effect can be applied at any given moment, so their ranges should be defined with no overlap. + + + + + PeriodicEffect applies StatusEffects to the character periodically. + + + + + An icon that’s used in the UI to represent this affliction. + + + + + A sprite that covers the affected player's entire screen when this affliction is active. + Its opacity is controlled by the active effect's MinAfflictionOverlayAlphaMultiplier and MaxAfflictionOverlayAlphaMultiplier + + + + + A special affliction type that makes the character see and hear things that aren't there. + + + + + A special affliction type that periodically inverts the character's controls and stuns the character. + The frequency and duration of the effects increases the higher the strength of the affliction is. + + + + + A special affliction type that increases the duration of buffs (afflictions of the type "buff"). The increase is defined using the + and attributes of the affliction effect. + + + + + Maximum vitality without talent- or job-based modifiers + + + + + Was the character in full health at the beginning of the frame? + + + + + Get the total strength of the afflictions of a specific type attached to a specific limb + + Type of the affliction + The limb the affliction is attached to + Does the affliction have to be attached to only the specific limb. + Most monsters for example don't have separate healths for different limbs, essentially meaning that every affliction is applied to every limb. + + + + 0-1. + + + + + How much vitality the affliction reduces, taking into account the effects of vitality modifiers on the limb the affliction is on (if limb-based) + + + + + Get the identifiers of the items that can be used to treat the character. Takes into account all the afflictions the character has, + and negative treatment suitabilities (e.g. a medicine that causes oxygen loss may not be suitable if the character is already suffocating) + + A dictionary where the key is the identifier of the item and the value the suitability + If true, the suitability values are normalized between 0 and 1. If not, they're arbitrary values defined in the medical item XML, where negative values are unsuitable, and positive ones suitable. + If above 0, the method will take into account how much currently active status effects while affect the afflictions in the next x seconds. + + + + Automatically filters out buffs. + + + + + Returns true if the type or the identifier matches the defined types/identifiers. + + + + + Creates a character info from the human prefab. If there are custom character infos defined, those are used, otherwise a randomized info is generated. + + + + + + + Tag -> priority. + + + + + How much this skill affects characters' hiring cost + + + + + Note that during the limb initialization, character.AnimController returns null, whereas this field is already assigned. + + + + + Returns true if the attack successfully hit something. If the distance is not given, it will be calculated. + + + + + Attach the limb to a target with WeldJoints. + Uses sim units. + + + + allAnimations[speciesName][fileName] + + + + In degrees. + + + + + In degrees. + + + + + Selects a random filepath from multiple paths, matching the specified animation type. + + + + + Selects all file paths that match the specified animation type. + + + + + If the file name is left null, default file is selected. If fails, will select the default file. Note: Use the filename without the extensions, don't use the full path! + If a custom folder is used, it's defined in the character info file. + + + + + Note: Overrides old animations, if found! + + + + + The angle of the collider when standing (i.e. out of water). + In degrees. + + + + + Key = limb id, value = angle in radians + + + + + In degrees. + + + + + Key = limb id, value = angle in radians + + + + + In degrees. + + + + + In degrees. + + + + + In degrees. + + + + + Contains character data that should be editable in the character editor. + + + + + key1: Species name + key2: File path + value: Ragdoll parameters + + + + + If the file name is left null, default file is selected. If fails, will select the default file. Note: Use the filename without the extensions, don't use the full path! + If a custom folder is used, it's defined in the character info file. + + + + + Creates a default ragdoll for the species using a predefined configuration. + Note: Use only to create ragdolls for new characters, because this overrides the old ragdoll! + + + + + Applies the current properties to the xml definition without saving to file. + + + + + Resets the current properties to the xml (stored in memory). Force reload reloads the file from disk. + + + + + Should be converted to sim units. + + + + + Should be converted to sim units. + + + + + In degrees. + + + + + In degrees. + + + + + The orientation of the sprite as drawn on the sprite sheet (in radians). + + + + + Some conditions rely on specific ability data that is integrally connected to the AbilityEffectType. + This is done in order to avoid having to create duplicate ability behavior, such as if an ability needs to trigger + a common ability effect but in specific circumstances. These conditions could also be partially replaced by + more explicit AbilityEffectType enums, but this would introduce bloat and overhead to integral game logic + when instead said logic can be made to only run when required using these conditions. + + These conditions will return an error if used outside their limited intended use. + + + + + Used primarily for StatusEffects. Default to constant outside interval abilities. + + + + + List of abilities that are triggered by this group. + Fallback abilities are triggered if the conditional fails + + + + + List of abilities that are triggered by this group. + Fallback abilities are triggered if the conditional fails + + + + + Checks talents for a given AbilityObject taking into account non-stackable talents. + + + + + Migration that adds a missing permanent stat to the character. + + + + + Migration that updates permanent stat identifiers. + + + + + When set to false the AbilityEffects of multiple of the same talent will not be checked and only the first one. + + + + + Talent identifiers of all the talents in this tree + + + + + How many talents need to be unlocked to consider this tree completed + + + + + How many talents can be unlocked in total + + + + + When specified the talent option will show talent with this identifier + and clicking on it will expand the talent option to show the talents + + + + + Implementation of the Command pattern. + + + Created by Markus Isberg on 11th of March 2020 for the submarine editor. + "Implementing a global undo and redo with Memento pattern proved too difficult of a task for me so I implemented it with this pattern instead." + + + + + A method that should apply a new state on an object or perform an action + + + + + A method that should revert Execute() method's actions + + + + + State no longer exists, clean up the lingering garbage + + + + + Base class for content file types, which are loaded + from filelist.xml via reflection. + PLEASE AVOID INHERITING FROM THIS CLASS DIRECTLY. + Inheriting from GenericPrefabFile<T> is likely what + you want. + + + + + Errors that occurred when loading this content package. + Currently, all errors are considered fatal and the game + will refuse to load a content package that has any errors. + + + + + An error that occurred when trying to enable this mod. + This field doesn't directly affect whether or not this mod + can be enabled, but if it's been set to anything other than + Option.None then the game has already refused to enable it + at least once. + + + + + Does the content package include some content that needs to match between all players in multiplayer. + + + + + StatTypes are used to alter several traits of a character. They are mostly used by talents. + + A lot of StatTypes use a "percentage" value. The way this works is that the value is 0 by default and 1 is added to the value of the stat type to get the final multiplier. + For example if the value is set to 0.2 then 1 is added to it making it 1.2 and that is used as a multiplier. + This makes it so values between -100% and +100% can be easily represented as -1 and 1 respectively. For example 0.5 would translate to 1.5 for +50% and -0.2 would translate to 0.8 for -20% multiplier. + + + + + Used to indicate an invalid stat type. Should not be used. + + + + + Boosts electrical skill by a flat amount. + + + + + Boosts helm skill by a flat amount. + + + + + Boosts mechanical skill by a flat amount. + + + + + Boosts medical skill by a flat amount. + + + + + Boosts weapons skill by a flat amount. + + + + + Boosts the character's helm skill to the given value if it's lower than the given value. + + + + + Boosts the character's medical skill to the given value if it's lower than the given value. + + + + + Boosts the character's weapons skill to the given value if it's lower than the given value. + + + + + Boosts the character's electrical skill to the given value if it's lower than the given value. + + + + + Boosts the character's mechanical skill to the given value if it's lower than the given value. + + + + + Increases character's maximum vitality by a percentage. + + + + + Increases both walking and swimming speed of the character by a percentage. + + + + + Increases the character's walking speed by a percentage. + + + + + Increases the character's swimming speed by a percentage. + + + + + Decreases how long it takes for buffs applied to the character decay over time by a percentage. + Buffs are afflictions that have isBuff set to true. + + + + + Decreases how long it takes for debuff applied to the character decay over time by a percentage. + Debuffs are afflictions that have isBuff set to false. + + + + + Increases the strength of afflictions that are applied to the character by a percentage. + Medicines are items that have the "medical" tag. + + + + + Increases the resistance to pushing force caused by flowing water by a percentage. The resistance cannot be below 0% or higher than 100%. + + + + + Increases how much damage the character deals via all attacks by a percentage. + + + + + Increases how much damage the character deals to other characters on the same team by a percentage. + + + + + Decreases the reload time of ranged weapons held by the character by a percentage. + + + + + Decreases the reload time of submarine turrets operated by the character by a percentage. + + + + + Decreases the power consumption of submarine turrets operated by the character by a percentage. + + + + + Increases how fast submarine turrets operated by the character charge up by a percentage. Affects turrets like pulse laser. + + + + + Increases how fast the character can swing melee weapons by a percentage. + + + + + Increases the damage dealt by melee weapons held by the character by a percentage. + + + + + Decreases the spread of ranged weapons held by the character by a percentage. + + + + + Increases the repair speed of the character by a percentage. + + + + + Increases the repair speed of the character when repairing mechanical items by a percentage. + + + + + Increase deconstruction speed of deconstructor operated by the character by a percentage. + + + + + Increases the repair speed of repair tools that fix submarine walls by a percentage. + + + + + Increases the wall damage of tools that destroy submarine walls like plasma cutter by a percentage. + + + + + Increase the detach speed of items like minerals that require a tool to detach from the wall by a percentage. + + + + + Allows the character to repair mechanical items past the maximum condition by a flat percentage amount. For example setting this to 0.1 allows the character to repair mechanical items to 110% condition. + + + + + Allows the character to repair electrical items past the maximum condition by a flat percentage amount. For example setting this to 0.1 allows the character to repair electrical items to 110% condition. + + + + + Increase the the quality of items crafted by the character by a flat amount. + Can be made to only affect certain item with a given tag types by specifying a tag via CharacterAbilityGivePermanentStat, when no tag is specified the ability affects all items. + + + + + Boosts the condition of genes combined by the character by a flat amount. + + + + + Reduces the chance to taint a gene when combining genes by a percentage. Tainting probability can not go below 0% or above 100%. + + + + + Increases the speed at which the character gains skills by a percentage. + + + + + Whenever the character's skill level up add a flat amount of more skill levels to the character. + + + + + Increases the speed at which the character gains helm skill by a percentage. + + + + + Increases the speed at which the character gains weapons skill by a percentage. + + + + + Increases the speed at which the character gains medical skill by a percentage. + + + + + Increases the speed at which the character gains electrical skill by a percentage. + + + + + Increases the speed at which the character gains mechanical skill by a percentage. + + + + + Increases the strength of afflictions the character applies to other characters via medicine by a percentage. + Medicines are items that have the "medical" tag. + + + + + Increases the strength of afflictions the character applies to other characters via medicine by a percentage. + Works only for afflictions that have isBuff set to true. + + + + + Increases the strength of afflictions the character applies to other characters via medicine by a percentage. + Works only for afflictions that have "poison" type. + + + + + Increases how long the character can tinker with items by a flat amount where 1 = 1 second. + + + + + Increases the effectiveness of the character's tinkerings by a percentage. + Tinkering strength affects the speed and effectiveness of the item that is being tinkered with. + + + + + Increases how much condition tinkered items lose when the character tinkers with them by a percentage. + + + + + Increases how much reputation the character gains by a percentage. + Can be made to only affect certain factions with a given tag types by specifying a tag via CharacterAbilityGivePermanentStat, when no tag is specified the ability affects all factions. + + + + + Increases how much reputation the character loses by a percentage. + Can be made to only affect certain factions with a given tag types by specifying a tag via CharacterAbilityGivePermanentStat, when no tag is specified the ability affects all factions. + + + + + Increases how much money the character gains from missions by a percentage. + + + + + Increases how much talent experience the character gains from all sources by a percentage. + + + + + Increases how much talent experience the character gains from missions by a percentage. + + + + + Increases how many missions the characters crew can have at the same time by a flat amount. + + + + + Increases how many items are in stock in special sales in the store by a flat amount. + + + + + Increases how much money is gained from selling items to the store by a percentage. + + + + + Decreases the prices of items in affiliated store by a percentage. + + + + + Decreases the prices of items in all stores by a percentage. + + + + + Decreases the price of upgrades and submarines in affiliated outposts by a percentage. + + + + + Decreases the price of upgrades and submarines in all outposts by a percentage. + + + + + Limits how many of a certain item can be attached to the wall in the submarine at the same time. + Has to be used with CharacterAbilityGivePermanentStat to specify the tag of the item that is affected. Does nothing if no tag is specified. + + + + + Increase the radius of explosions caused by the character by a percentage. + + + + + Increases the damage of explosions caused by the character by a percentage. + + + + + Decreases the time it takes to fabricate items on fabricators operated by the character by a percentage. + + + + + Increases how much damage the character deals to ballast flora by a percentage. + + + + + Increases the time it takes for the character to pass out when out of oxygen. + + + + + Used to set the character's apprencticeship to a certain job. + Used by the "apprenticeship" talent and requires a job to be specified via CharacterAbilityGivePermanentStat. + + + + + Increases the revival chance of the character when performing CPR by a percentage. + + + + + Can be used to prevent certain talents from being unlocked by specifying the talent's identifier via CharacterAbilityGivePermanentStat. + + + + + AbilityFlags are a set of toggleable flags that can be applied to characters. + + + + + Used to indicate an erroneous ability flag. Should not be used. + + + + + Character will not be able to run. + + + + + Character is immune to pressure. + + + + + Character won't be targeted by enemy AI. + + + + + Character can drag corpses without a movement speed penalty. + + + + + Character is able to tinker with items. + + + + + Character is able to tinker with fabricators and deconstructors. + + + + + Allows items tinkered by the character to consume no power. + + + + + Allows the character to gain skills past 100. + + + + + Allows the character to retain experience when respawning as a new character. + + + + + Allows CharacterAbilityApplyStatusEffectsToLastOrderedCharacter to affect the last 2 characters ordered. + + + + + Character will stay conscious even if their vitality drops below 0. + + + + + Prevents afflictions on the character from dropping the characters vitality below the kill threshold. + The character can still die from sources like getting crushed by pressure or if their head is severed. + + + + + Has the action finished. + + If null or empty, the event moves to the next action. Otherwise it moves to the specified label. + + + + + Rich test to display in debugdraw + + + + public override string ToDebugString() + { + return $"{ToolBox.GetDebugSymbol(isFinished)} SomeAction -> "(someInfo: {info.ColorizeObject()})"; + } + + + + + + + 'Exhaustible' sets won't appear in the same level until after one world step (~10 min, see Map.ProgressWorld) has passed. + + + + + If true, events from this set can only occur once in the level. + + + + + Used to force an event set based on how many other locations have been discovered before this. (Used for campaign tutorial event sets.) + + + + + Used to force an event set based on how many other outposts have been visited before this. (Used for campaign tutorial event sets.) + + + + + If enabled, locations this mission takes place in cannot change their type + + + + + The mission can only be received when travelling from a location of the first type to a location of the second type + + + + + The mission can only be received in these location types + + + + + Show entities belonging to these sub categories when the mission starts + + + + + Randomizes the collection (using OrderBy) and returns it. + + + + + Randomizes the list in place without creating a new collection, using a Fisher-Yates-based algorithm. + + + + + Gets a random element of a list using one of the synced random number generators. + It's recommended that you guarantee a deterministic order of the elements of the + input list via sorting. + + List to pick a random element from + Which RNG to use + A random item from the list. Return value should match between clients and + the server, if applicable. + + + + Executes an action that modifies the collection on each element (such as removing items from the list). + Creates a temporary list, unless the collection is empty. + + + + + Generic version of List.ForEach. + Performs the specified action on each element of the collection (short hand for a foreach loop). + + + + + Iterates over all elements in a given enumerable and discards the result. + + + + + Shorthand for !source.Any(predicate) -> i.e. not any. + + + + + Returns whether a given collection has at least a certain amount + of elements for which the predicate returns true. + + Input collection + How many elements to match before stopping + Predicate used to evaluate the elements + + + + + Returns the maximum element in a given enumerable, or null if there + aren't any elements in the input. + + Input collection + Maximum element or null + + + + Same as FirstOrDefault but will always return null instead of default(T) when no element is found + + + + + Negates the X and Y components. + + + + + Flips the X and Y components. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. + + + + + Unity's Angle implementation without the conversion to degrees. + Returns the angle in radians between two vectors. + 0 - Pi. + + + + + Creates a forward pointing vector based on the rotation (in radians). + + + + + Creates a backward pointing vector based on the rotation (in radians). + + + + + Creates a forward pointing vector based on the rotation (in radians). TODO: remove when the implications have been neutralized + + + + + Creates a backward pointing vector based on the rotation (in radians). TODO: remove when the implications have been neutralized + + + + + Creates a normalized perpendicular vector to the right from a forward vector. + + + + + Creates a normalized perpendicular vector to the left from a forward vector. + + + + + Transforms a vector relative to the given up vector. + + + + + Flips the x and y components. + + + + + Returns the sum of the x and y components. + + + + + Capitalises the first letter (invariant) and forces the rest to lower case (invariant). + + + + + Adds spaces into a CamelCase string. + + + + + No attempt to contact the consent server has been made + + + + + An error occurred while attempting to retrieve consent status + + + + + The consent status was not saved on the remote database + + + + + The user explicitly denied consent + + + + + The user explicitly granted consent + + + + + Sets the consent status. This method cannot be called to + set the status to Consent.Yes; only a positive response from + the database or the user accepting via the privacy policy + prompt should enable it. + + + + + Implementation of the bulk of SetConsent. + DO NOT CALL THIS UNLESS NEEDED. + + + + + Adds an error event to GameAnalytics if an event with the same identifier has not been added yet. + + + + + Spawns the items defined in the start item set in the specified sub. + + + + + Get what kind of affiliation this faction has towards the player depending on who they chose to side with via talents + + + + + + How low the reputation can drop on this faction + + + + + Maximum reputation level you can gain on this faction + + + + + What reputation does this faction start with + + + + + Maximum amount of reputation loss you can get from damaging outpost NPCs per round + + + + + Maximum amount of reputation loss you can get from damaging outpost walls per round + + + + + Reputation value normalized to the range of 0-1 + + + + + Network message for the server to update wallet values to clients + + + + + Network message for the client to transfer money between wallets + + + + + Network message for the client to set the salary of someone + + + + + Represents the difference in balance and salary when a wallet gets updated + Not really used right now but could be used for notifications when receiving funds similar to how talents do it + + + + + Represents an update that changed the amount of money or salary of the wallet + + + + + Start a new GameSession. Will be saved to the specified save path (if playing a game mode that can be saved). + + + + + Start a new GameSession with a specific pre-selected mission. + + + + + Load a game session from the specified XML document. The session will be saved to the specified path. + + + + + Switch to another submarine. The sub is loaded when the next round starts. + + + + + Returns a list of crew characters currently in the game with a given filter. + + Character type filter + + + In singleplayer mode the CharacterType.Player returns the currently controlled player. + + + + + Can the inventory be accessed when the character is still alive + + + + + Can the inventory be accessed by the character itself when the character is still alive (only has an effect if AccessibleWhenAlive false) + + + + + If there is no room in the generic inventory (InvSlotType.Any), check if the item can be auto-equipped into its respective limbslot + + + + + If there is room, puts the item in the inventory and returns true, otherwise returns false + + + + + Does the wearable inherit all the scalings of the wearer? Also the wearable's own scale is used! + + + + + None = Any/Not Defined -> no effect. + Changing the gender forces re-initialization, because the textures can be different for male and female characters. + + + + + Note: this constructor cannot initialize automatically, because the gender is unknown at this point. We only know it when the item is equipped. + + + + + + + Any item with a Price element in the definition can be sold everywhere. + + + + + Defines areas where the item can be interacted with. If RequireBodyInsideTrigger is set to true, the character + has to be within the trigger to interact. If it's set to false, having the cursor within the trigger is enough. + + + + + Is this prefab overriding a prefab in another content package + + + + + How likely it is for the item to spawn in a level of a given type. + + + + + Can the item be chosen as extra cargo in multiplayer. If not set, the item is available if it can be bought from outposts in the campaign. + + + + + Stackable identifiers feature a unique ID to allow multiple stats applied by the same talent from different characters to coexist. + + + + + Unstackable identifiers do not have a unique ID causing them to be identical to other stats applied by the same talent from different characters and thus only one of them will be applied. + will always use the highest value for unstackable stats. + + + + + Used for setting the value value from network packet; bypassing all validity checks. + + + + + Used by various features to define different kinds of relations between items: + for example, which item a character must have equipped to interact with some item in some way, + which items can go inside a container, or which kind of item the target of a status effect must have for the effect to execute. + + + + + The item must be contained inside the item this relation is defined in. + Can for example by used to make an item usable only when there's a specific kind of item inside it. + + + + + The user must have equipped the item (i.e. held or worn). + + + + + The user must have picked up the item (i.e. the item needs to be in the user's inventory). + + + + + The item this relation is defined in must be inside a specific kind of container. + Can for example by used to make an item do something when it's inside some other type of item. + + + + + Should an empty inventory be considered valid? Can be used to, for example, make an item do something if there's a specific item, or nothing, inside it. + + + + + Should only an empty inventory be considered valid? Can be used to, for example, make an item do something when there's nothing inside it. + + + + + Only valid for the RequiredItems of an ItemComponent. Can be used to ignore the requirement in the submarine editor, + making it easier to for example make rewire things that require some special tool to rewire. + + + + + Identifier(s) or tag(s) of the items that are NOT considered valid. + Can be used to, for example, exclude some specific items when using tags that apply to multiple items. + + + + + Only valid for the RequiredItems of an ItemComponent. A message displayed if the required item isn't found (e.g. a notification about lack of ammo or fuel). + + + + + Only valid for the RequiredItems of an ItemComponent. The localization tag of a message displayed if the required item isn't found (e.g. a notification about lack of ammo or fuel). + + + + + Should broken (0 condition) items be excluded? + + + + + Should full condition (100%) items be excluded? + + + + + Are item variants considered valid? + + + + + Index of the slot the target must be in when targeting a Contained item + + + + + Overrides the position defined in ItemContainer. Only valid when used in the Containable definitions of an ItemContainer. + + + + + Only valid when used in the Containable definitions of an ItemContainer. + Only affects when ItemContainer.hideItems is false. Doesn't override the value. + + + + + Only valid when used in the Containable definitions of an ItemContainer. + Can be used to override the rotation of specific items in the container. + + + + + Only valid when used in the Containable definitions of an ItemContainer. + Can be used to force specific items to stay active inside the container (such as flashlights attached to a gun). + + + + + Only valid for the RequiredItems of an ItemComponent. Can be used to make the requirement optional, + meaning that you don't need to have the item to interact with something, but having it may still affect what the interaction does (such as using a crowbar on a door). + + + + + Identifier(s) or tag(s) of the items that are considered valid. + + + + + Additive sets of items spawned only at the start of the game. + + + + + The order in which the sets are displayed in menus + + + + Mod initialization + + + Error or client exit + + + + This function should be used whenever a new assembly is created. Wrapper to allow more complicated setup later if need be. + + + + + This function should be used whenever a new assembly is about to be destroyed/unloaded. Wrapper to allow more complicated setup later if need be. + + Assembly to remove + + + + Puts a type on the stack, as a object instead of a + runtime type token. + + The IL emitter. + The type to put on the stack. + + + + Converts the value on the stack to . + + The IL emitter. + The type of the value on the stack. + + + + Deferences the value on stack if the provided type is ByRef. + + The IL emitter. + The type to check if ByRef. + + + + Deferences the value on stack if the provided type is ByRef. + + The IL emitter. + The type to check if ByRef. + + + + Loads a local variable and casts it to the target type. + + The IL emitter. + The value to cast. Must be of type . + The type to cast into. + + + + Emits a call to . + + The IL emitter. + The string format. + The local variables passed to string.Format. + + + + Emits a call to . + + The IL emitter. + The message to print. + + + + Emits a call to , + using the string on the stack. + + The IL emitter. + + + + Emits a foreach loop that iterates over an local variable. + + The type of elements in the enumerable. + The IL emitter. + The enumerable. + The body of code to run on each iteration. + + + + Emits a foreach loop that iterates over an local variable. + + The type of elements in the enumerable. + The IL emitter. + The enumerator. + The body of code to run on each iteration. + + + + Emits a branch that only executes if the last value on the stack + is truthy (e.g. non-null references, 1, etc). + + The IL emitter. + The body of code to run if the value is truthy. + + + + Emits a branch that only executes if the last value on the stack + is falsy (e.g. null references, 0, etc). + + The IL emitter. + The body of code to run if the value is falsy. + + + + Emits two branches that diverge based on a condition -- analogous + to an if-else statement. If either + or are omitted, it behaves the same as + + and . + + The IL emitter. + The body of code to run if the value is truthy. + The body of code to run if the value is falsy. + + + + List of upgrades this item has + + + + + The index of the outpost module this entity originally spawned in (-1 if not an outpost item) + + + + + Adds a new upgrade to the item + + + + + Remove the entity from the entity list without removing links to other entities + + + + + Call Update() on every object in Entity.list + + + + + Flip the entity horizontally + + Should the entity be flipped across the y-axis of the sub it's inside + + + + Flip the entity vertically + + Should the entity be flipped across the x-axis of the sub it's inside + + + + Update the linkedTo-lists of the entities based on the linkedToID-lists + Has to be done after all the entities have been loaded (an entity can't + be linked to some other entity that hasn't been loaded yet) + + + + + Gets all linked entities of specific type. + + + + + Gets all linked entities of specific type. + + + + + See . + + Lua value to convert and wrap in a userdata. + Descriptor of the type of the object to convert the Lua value to. Uses MoonSharp ScriptToClr converters. + A userdata that wraps the Lua value converted to an object of the desired type as described by . + + + + Converts a Lua value to a CLR object of a desired type and wraps it in a userdata. + If the type is not registered, then a new will be created and used. + The goal of this method is to allow Lua scripts to create userdata to wrap certain data without having to register types. + Wrapping the value in a userdata preserves the original type during script-to-CLR conversions.A Lua script needs to pass a List`1 to a CLR method expecting System.Object, MoonSharp gets + in the way by converting the List`1 to a MoonSharp.Interpreter.Table and breaking everything. + Registering the List`1 type can break other scripts relying on default converters, so instead + it is better to manually wrap the List`1 object into a userdata. + + Lua value to convert and wrap in a userdata. + Type describing the CLR type of the object to convert the Lua value to. + A userdata that wraps the Lua value converted to an object of the desired type. + + + + Unique, but non-persistent identifier. + Stays the same if the entities are created in the exactly same order, but doesn't persist e.g. between the rounds. + + + + + Finds a contiguous block of free IDs of at least the given size + + The first ID in the found block, or zero if none are found + + + + Find an entity based on the ID + + + + + Removes the entity from the entity dictionary and frees up the ID it was using. + + + + + Explosions are area of effect attacks that can damage characters, items and structures. + + + + Used to enable all particle effects without having to specify them one by one. + + + + + + How much force the explosion applies to the characters. + + + + + Intensity of the screen shake effect. + + + + 10% of the range if showEffects is true, 0 otherwise. + + + + + + How far away does the camera shake effect reach. + + + + Same as attack range if showEffects is true, 0 otherwise. + + + + + + Color tint to apply to the player's screen when in range of the explosion. + + + + + How far away can the screen color effect be seen. + + + + 10% of the range if showEffects is true, 0 otherwise. + + + + + + How long the screen color effect lasts. + + + + + Whether a spark particle effect is created when the explosion happens. + + + + + Whether a shockwave particle effect is created when the explosion happens. + + + + + Whether a flame particle effect is created when the explosion happens. + + + + + Whether a smoke particle effect is created when the explosion happens. + + + + + Whether a flash effect is created when the explosion happens. + + + + + Whether a underwater bubble particle effect is created when the explosion happens. + + + + + Color of the light source created by the explosion. + + + + + Whether the explosion plays a tinnitus sound to players who get hit by it. + + + + + Whether the explosion executes 'OnFire' status effects on the items it hits. + + + + true if showEffects is true and flames haven't been explicitly set to false, false otherwise. + + + + + + List of item tags that the explosion ignores when applying fire effects. + + + + + When set to true, the explosion don't deal less damage when the target is behind a solid object. + + + + + How long the light source created by the explosion lasts. + + + + + How large the light source created by the explosion is. + + + + + Identifier of the decal the explosion creates on the background structure it explodes over. + Set to empty string to disable. + + + + + Relative size of the decal created by the explosion. + + + + + Whether the explosion only affects characters inside a submarine. + + + + + Whether the explosion only affects characters outside a submarine. + + + + + How much the explosion repairs items. + + + + + Strength of the EMP effect created by the explosion. + + + + + How much damage the explosion does to ballast flora. + + + + + Returns a dictionary where the keys are the structures that took damage and the values are the amount of damage taken + + + + + "Diagonal" gaps are used on sloped walls to allow characters to pass through them either horizontally or vertically. + Water still flows through them only horizontally or vertically + + + + + Overrides the commonness of the object in a specific level type. + Key = name of the level type, value = commonness in that level type. + + + + + Makes the cell rounder by subdividing the edges and offsetting them at the middle + + How small the individual subdivided edges can be (smaller values produce rounder shapes, but require more geometry) + + + + Minimum difficulty of the level before hunting grounds can appear. + + + + + Probability of hunting grounds appearing in 100% difficulty levels. + + + + + The depth at which the level starts at, in in-game coordinates. E.g. if this was set to 100 000 (= 1000 m), the nav terminal would display the depth as 1000 meters at the top of the level. + + + + + Determined during level generation based on the size of the submarine. Null if the level hasn't been generated. + + + + + Events that have previously triggered in this level. Used for making events the player hasn't seen yet more likely to trigger when re-entering the level. Has a maximum size of . + + + + + Events that have already triggered in this level and can never trigger again. . + + + + + 'Exhaustible' sets won't appear in the same level until after one world step (~10 min, see Map.ProgressWorld) has passed. . + + + + + The crush depth of a non-upgraded submarine in in-game coordinates. Note that this can be above the top of the level! + + + + + The crush depth of a non-upgraded submarine in "real world units" (meters from the surface of Europa). Note that this can be above the top of the level! + + + + + Instantiates level data using the properties of the connection (seed, size, difficulty) + + + + + Instantiates level data using the properties of the location + + + + + Which sides of a wall the object can appear on. + + + + + Overrides the commonness of the object in a specific level type. + Key = name of the level type, value = commonness in that level type. + + + + + A list of prefabs whose properties override this one's properties when a trigger is active. + E.g. if a trigger in the index 1 of the trigger list is active, the properties in index 1 in this list are used (unless it's null) + + + + + Effects applied to entities that are inside the trigger + + + + + Attacks applied to entities that are inside the trigger + + + + + How long the trigger stays in the triggered state after triggerers have left + + + + + does the force diminish by distance + + + + + Stop applying forces to objects if they're moving faster than this + + + + + Are there any active contacts between the physics body and the target entity + + + + + Another trigger was triggered, check if this one should react to it + + + + + Applies attacks to a damageable. + + + + + Applies attacks to structures. + + + + + Find a matching map entity prefab + + The name of the item (can be omitted when searching based on identifier) + The identifier of the item (if null, the identifier is ignored and the search is done only based on the name) + + + + Find a matching map entity prefab + + A predicate that returns true on the desired prefab. + + + + Links defined to identifiers. + + + + + Check if the name or any of the aliases of this prefab match the given name. + + + + + Is some mission blocking this location from changing its type? + + + + + In percentages. Larger values make buying more expensive and selling less profitable, and vice versa. + + + + + Create new StoreInfo + + + + + Load previously saved StoreInfo + + + + If null, item.GetPriceInfo() will be used to get it. + /// If false, the price won't be affected by + + If null, item.GetPriceInfo() will be used to get it. + If false, the price won't be affected by + + + + How many map progress steps it takes before the discounts should be updated. + + + + + Create a location from save data + + + + + Removes all unlocked missions from the location + + + + + Mark the items that have been taken from the outpost to prevent them from spawning when re-entering the outpost + + + + + Mark the characters who have been killed to prevent them from spawning when re-entering the outpost + + + + If true, the stores will be recreated if they already exists. + + + + Can this location type be used in the random, non-campaign levels that don't take place in any specific zone + + + + + If set to true, only event sets that explicitly define this location type in can be selected at this location. Defaults to false. + + + + + In percentages + + + + + The change can only happen if there's at least one of the given types of locations near this one + + + + + How close the location needs to be to one of the RequiredLocations for the change to occur + + + + + Base probability per turn for the location to change if near one of the RequiredLocations + + + + + How close the location needs to be to one of the RequiredLocations for the probability to increase + + + + + How much the probability increases per turn if within RequiredProximityForProbabilityIncrease steps of RequiredLocations + + + + + Does there need to be a beacon station within RequiredProximity + + + + + Does there need to be hunting grounds within RequiredProximity + + + + + Base probability per turn for the location to change if near one of the RequiredLocations + + + + + The change can't happen if there's one or more of the given types of locations near this one + + + + + How close the location needs to be to one of the DisallowedAdjacentLocations for the change to be disabled + + + + + The location can't change it's type for this many turns after this location type changes occurs + + + + + From -> To + + + + + Load a previously saved campaign map from XML + + + + + Generate a new campaign map from the seed + + + + + Get the shortest distance from the start location to another location that satisfies the specified criteria. + + The distance to a matching location, or int.MaxValue if none are found. + + + + Load a previously saved map from an xml element + + + + + Load the state of an existing map from xml (current state of locations, where the crew is now, etc). + + + + + Advances the progress of the radiation. + + + + + + Identifiers of the location types this outpost can appear in. If empty, can appear in all types of locations. + + + + + Info of this outpost module + + + + + Which module is this one attached to + + + + + The position of this module's gap that attaches to the previous module + + + + + Select the number and types of the modules to use in the outpost + + + + + Attaches additional modules to all the available gaps of the given module, + and continues recursively through the attached modules until all the pending module types have been placed. + + The module to attach to + Which modules we can choose from + Which types of modules we still need in the outpost + The modules we've already selected to be used in the outpost. + + + + Attaches a new random module to one side of the given module + + The module to attach to + Which side of the module to attach the new module to + Which modules we can choose from + Which types of modules we still need in the outpost + The modules we've already selected to be used in the outpost. + + + + Check if any of the modules in modules1 overlap with modules in modules2 + + + + + Check if the modules overlap, taking their Offsets and MoveOffsets into account + + + + + Check if any of the modules overlaps with a connection between 2 other modules + + + + + Attempt to find a way to move the modules in a way that stops the 2 specific modules from overlapping. + Done by iterating through the modules and testing how much the subsequent modules (i.e. modules that are further from the initial outpost) + would need to be moved further to solve the overlap. The solution that requires moving the modules the least is chosen. + + The set of modules the method is allowed to move + Module overlapping with module2 + Module overlapping with module1 + All generated modules + The solution to the overlap (if any). Key = placed module, value = distance to move the module + Was a solution found for resolving the overlap. + + + + Get the modules that are further from the initial module than the startModule. StartModule is also included in the list. + + + + + Can the item be a Daily Special or a Requested Good + + + + + The item isn't available in stores unless the level's difficulty is above this value + + + + + The cost of item when sold by the store. Higher modifier means the item costs more to buy from the store. + + + + + Used when both and are set to 0. + + + + + Minimum reputation needed to buy the item (Key = faction ID, Value = min rep) + + + + + Support for the old style of determining item prices + when there were individual Price elements for each location type + where the item was for sale. + + + + + If null, the orientation is determined automatically based on the dimensions of the structure instances + + + + + Extents of the solid items/structures (ones with a physics body) and hulls + + + + + Extents of all the visible items/structures/hulls (including ones without a physics body) + + + + + Moves away any character that is inside the bounding box of the sub (but not inside the sub) + + The translation that was applied to the sub before doing the displacement + (used for determining where to push the characters) + + + + A random int that gets assigned when saving the sub. Used in mp campaign to verify that sub files match + + + + + Note: Refreshed for loaded submarines when they are saved, when they are loaded, and on round end. If you need to refresh it, please use Submarine.CheckFuel() method! + + + + + Calculated from . Can be used when the sub hasn't been loaded and we can't access . + + + + + Only called by a Gap when the state changes. + So in practice used like an event callback, although technically just a method + (It would be cleaner to use an actual event in Gap.cs, but event registering and unregistering might cause an extra hassle) + + + + + Marks fields and properties as to be serialized and deserialized by . + Also contains settings for some types like maximum and minimum values for numbers to reduce bits used. + + + + struct NetPurchasedItem : INetSerializableStruct + { + [NetworkSerialize] + public string Identifier; + + [NetworkSerialize(ArrayMaxSize = 16)] + public string[] Tags; + + [NetworkSerialize(MinValueInt = 0, MaxValueInt = 8)] + public int Amount; + } + + + + Using the attribute on the struct will make all fields and properties serialized + + + + + Static class that contains serialize and deserialize functions for different types used in + + + The type that the behavior handles + The type that will be used as the generic parameter for the read/write methods + The read method. + It must have a generic parameter. + The return type must be such that if the generic parameter is replaced with funcGenericParam, you get behaviorGenericParam. + The write method. The first parameter's type must be the same as readFunc's return type. + Ideally the least specific type possible, because it's replaced by behaviorGenericParam + A ReadWriteBehavior<behaviorGenericParam> + + + + Interface that allows the creation of automatically serializable and deserializable structs. +

+ + + public enum PurchaseResult + { + Unknown, + Completed, + Declined + } + + [NetworkSerialize] + struct NetStoreTransaction : INetSerializableStruct + { + public long Timestamp { get; set; } + public PurchaseResult Result { get; set; } + public NetPurchasedItem? PurchasedItem { get; set; } + } + + [NetworkSerialize] + struct NetPurchasedItem : INetSerializableStruct + { + public string Identifier; + public string[] Tags; + public int Amount; + } + + + + Supported types are:
bool
byte
ushort
short
uint
int
ulong
long
float
double
string




+ In addition arrays, enums, and are supported.
+ Using or will make the field or property optional. +
+ +
+ + + Deserializes a network message into a struct. + + + + public void ClientRead(IReadMessage inc) + { + NetStoreTransaction transaction = INetSerializableStruct.Read<NetStoreTransaction>(inc); + if (transaction.Result == PurchaseResult.Declined) + { + Console.WriteLine("Purchase declined!"); + return; + } + + if (transaction.PurchasedItem is { } item) + { + // Purchased 3x Wrench with tags: smallitem, mechanical, tool + Console.WriteLine($"Purchased {item.Amount}x {item.Identifier} with tags: {string.Join(", ", item.Tags)}"); + } + } + + + Incoming network message + Type of the struct that implements + A new struct of type T with fields and properties deserialized + + + + Serializes the struct into a network message + + public void ServerWrite(IWriteMessage msg) + { + INetSerializableStruct transaction = new NetStoreTransaction + { + Result = PurchaseResult.Completed, + Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(), + PurchasedItem = new NetPurchasedItem + { + Identifier = "Wrench", + Amount = 3, + Tags = new []{ "smallitem", "mechanical", "tool" } + } + }; + + transaction.Write(msg); + } + + Outgoing network message + + + + Default constructor. + + + + + Constructor with OnAdd and OnRemove callbacks provided. + + + + + Constructor with only the OnSort callback provided. + + + + + Method to be called when calling Add(T prefab, bool override). + If provided, the method is called only if Add succeeds. + + + + + Method to be called when calling Remove(T prefab). + If provided, the method is called before success + or failure can be determined within the body of Remove. + + + + + Method to be called when calling SortAll(). + + + + + Method to be called when calling AddOverrideFile(ContentFile file). + + + + + Method to be called when calling RemoveOverrideFile(ContentFile file). + + + + + Dictionary containing all prefabs of the same type. + Key is the identifier. + Value is a list of prefabs that share the same identifier, + where the first element is the "base" prefab, + i.e. the only prefab that's loaded when override tags are not defined. + This first element can be null, if only overrides are defined. + The last element of the list is the prefab that is effectively used + (hereby called "active prefab") + + + + + Collection of content files that override all previous prefabs + i.e. anything set to load before these effectively doesn't exist + + + + + AllPrefabs exposes all prefabs instead of just the active ones. + + + + + Returns the active prefab with the given identifier. + + Prefab identifier + Active prefab with the given identifier + + + + Returns true if a prefab with the identifier exists, false otherwise. + + Prefab identifier + The matching prefab (if one is found) + Whether a prefab with the identifier exists or not + + + + Finds the first active prefab that returns true given the predicate, + or null if no such prefab is found. + + Predicate to perform the search with. + + + + + Returns true if a prefab with the given identifier exists, false otherwise. + + Prefab identifier + Whether a prefab with the given identifier exists or not + + + + Determines whether a prefab is implemented as an override or not. + + Prefab in this collection + Whether a prefab is implemented as an override or not + + + + Add a prefab to the collection. + If not marked as an override, fail if a prefab with the same + identifier already exists. + Otherwise, add to the corresponding list, + without making any changes to the base prefab. + + Prefab + Is marked as override + + + + Removes a prefab from the collection. + + Prefab + + + + Removes all prefabs that were loaded from a certain file. + + + + + Adds an override file to the collection. + + + + + Removes an override file from the collection. + + + + + Sorts all prefabs in the collection based on the content package load order. + + + + + GetEnumerator implementation to enable foreach + + IEnumerator + + + + GetEnumerator implementation to enable foreach + + IEnumerator + + + + Prefab that has a property serves as a deterministic hash of + a prefab's identifier. This member is filled automatically + by PrefabCollection.Add. Required for GetRandom to work on + arbitrary Prefab enumerables, recommended for network synchronization. + + + + + Sample a pre-generated perlin noise map. Faster than calculating the noise on the fly. + + Normalized x position. The noise map starts repeating after x > 1 + Normalized y position. The noise map starts repeating after y > 1 + A noise value between 0.0f and 1.0f + + + + Allows the game to run logic such as updating the world, + checking for collisions, gathering input, and playing audio. + + + + + Labels of the components of a vector property (defaults to x,y,z,w) + + + + + If a translation can't be found for the property name, this tag is used instead + + + + + Currently implemented only for int and bool fields. TODO: implement the remaining types (SerializableEntityEditor) + + + + + If set to true, the instance values saved in a submarine file will always override the prefab values, even if using a mod that normally overrides instance values. + + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try getting the values of some commonly used properties directly without reflection + + + + + Try setting the values of some commonly used properties directly without reflection + + + + + Try setting the values of some commonly used properties directly without reflection + + + + + Upgrade the properties of an entity saved with an older version of the game. Properties that should be upgraded are defined using "Upgrade" elements in the config file. + for example, would force the scale of the entity to 0.5 if it was saved with a version prior to 0.9.2.0. + + The entity to upgrade + The XML element to get the upgrade instructions from (e.g. the config of an item prefab) + The game version the entity was saved with + + + + Returns the first child element that matches the name using the provided comparison method. + + + + + Returns all child elements that match the name using the provided comparison method. + + + + + Resets every round. + + + + + Reference to the xml element from where the sprite was created. Can be null if the sprite was not defined in xml! + + + + + In pixels + + + + + 0 - 1 + + + + + Identifier of the Map Entity so that we can link the sprite to its owner. + + + + + Creates a supposedly unique identifier from the parent element. If the parent element is not found, uses the sprite element. + TODO: If there are multiple elements with exactly the same data, the ids will fail. -> Is there a better way to identify the sprites? + ALSO TODO: delete :) + + + + + Works only if there is a name attribute defined for the sprite. For items and structures, the entity id or name is used if the sprite's name attribute is not defined. + + + + + Should the item spawn even if the container can't contain items of this type + + + + + The maximum amount of creatures of the same species in the same team that are allowed to be spawned via this status effect. + Also the creatures spawned by other means are counted in the check. + + + + + Index of the slot the target must be in when targeting a Contained item + + + + + Always do the conditional checks for the duration/delay. If false, only check conditional on apply. + + + + + Only valid if the effect has a duration or delay. Can the effect be applied on the same target(s)s if the effect is already being applied? + + + + + The interval at which the effect is executed. The difference between delay and interval is that effects with a delay find the targets, check the conditions, etc + immediately when Apply is called, but don't apply the effects until the delay has passed. Effects with an interval check if the interval has passed when Apply is + called and apply the effects if it has, otherwise they do nothing. + + + + + Can the StatusEffect be applied when the item applying it is broken + + + + + Which type of afflictions the target must receive for the StatusEffect to be applied. Only valid when the type of the effect is OnDamaged. + + + + + Keeps track of things that have happened during the round + + + + + Check if the currently selected language is available, and switch to English if not + + + + + Maximum FPS (0 = unlimited). + + + + + Calculate the new value of the property + + level of the upgrade + + + + + Sets the OriginalValue to a value stored in the save XML element + + + + + + Recursively apply a percentage to a value certain amount of times + + original value + percentage increase/decrease + how many times to apply the percentage change + + + + + Finds saved properties in the XML element and resets properties that are not managed by the upgrade anymore to their default values + + XML save element + + + + Find an item component matching the XML element + + Target item + XML ItemComponent element + Array of matching ItemComponents or null + + + + Applies the upgrade to the target item and components + + + This method should be called every time a new upgrade is added unless you set the original values of PropertyReference manually. + Do note that calls this method automatically. + + + + + Maximum upgrade level without taking submarine tier or class restrictions into account + + + + + Returns the maximum upgrade level for the current sub, taking tier and class restrictions into account + + + + + Returns the maximum upgrade level for the specified sub, taking tier and class restrictions into account + + + + + Parse a integer value from a string that is formatted like a percentage increase / decrease. + + String to parse + What XML attribute the value originates from, only used for warning formatting. + What XMLElement the value originates from, only used for warning formatting. + Whether or not to suppress warnings if both "attribute" and "sourceElement" are defined. + + + This sample returns -15 as an integer. + + XElement element = new XElement("change", new XAttribute("increase", "-15%")); + ParsePercentage(element.GetAttributeString("increase", string.Empty)); + + + + List of homoglyphs taken from https://github.com/codebox/homoglyph/ + + + + wrap the angle between 0.0f and 2pi + + + + + wrap the angle between -pi and pi + + + + + Returns the angle between the two angles, where the direction matters. + + + + + solves the angle opposite to side a (parameters: lengths of each side) + + + + + check whether line from a to b is intersecting with line from c to b + + + + + Get the intersections between a line (either infinite or a line segment) and a circle + + Center of the circle + Radius of the circle + 1st point on the line + 2nd point on the line + Is the line a segment or infinite + The number of intersections + + + + Get a point on a circle's circumference + + Center of the circle + Radius of the circle + Angle (in radians) from the center + + + + + Get a specific number of evenly distributed points on a circle's circumference + + Center of the circle + Radius of the circle + Number of points to calculate + Angle (in radians) of the first point from the center + + + + + divide a convex hull into triangles + + List of triangle vertices (sorted counter-clockwise) + + + + Float comparison. Note that may still fail in some cases. + + + + + Float comparison. Note that may still fail in some cases. + + + + + Returns a position in a curve. + + + + + Converts the alignment to a vector where -1,-1 is the top-left corner, 0,0 the center and 1,1 bottom-right + + + + + Rotates a point in 2d space around another point. + Modified from: + http://www.gamefromscratch.com/post/2012/11/24/GameDev-math-recipes-Rotating-one-point-around-another-point.aspx + + + + + Rotates a point in 2d space around the origin + + + + + Returns the corners of an imaginary rectangle. + Unlike the XNA rectangle, this can be rotated with the up parameter. + + + + + Returns the corners of an imaginary rectangle. + Unlike the XNA Rectangle, this can be rotated with the up parameter. + + + + + Check if a point is inside a rectangle. + Unlike the XNA Rectangle, this rectangle might have been rotated. + For XNA Rectangles, use the Contains instance method. + + + + + Check if a point is inside a rectangle. + Unlike the XNA Rectangle, this rectangle might have been rotated. + For XNA Rectangles, use the Contains instance method. + + + + + Slightly modified from https://gamedev.stackexchange.com/questions/110229/how-do-i-efficiently-check-if-a-point-is-inside-a-rotated-rectangle + + + + + Returns a scalar t from a value v between a range from min to max. Clamped between 0 and 1. + + + + + Mersenne Twister based random + + + + + Constructor with randomized seed + + + + + Constructor with provided 32 bit seed + + + + + (Re)initialize this instance with provided 32 bit seed + + + + + Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively + + + + + Generates a random value that is greater or equal than 0 and less than Int32.MaxValue + + + + + Returns a random value is greater or equal than 0 and less than maxValue + + + + + Generates a random value greater or equal than 0 and less or equal than Int32.MaxValue (inclusively) + + + + + Returns random value larger or equal to 0.0 and less than 1.0 + + + + + Min inclusive, Max exclusive! + + + + + Random float between 0 and 1. + + + + + + Adds an assembly's Non-Abstract Types to the cache for Barotrauma's Type lookup. + + Assembly to be added + Whether or not to overwrite an entry if the assembly already exists within it. + + + + Removes an assembly from the cache for Barotrauma's Type lookup. + + Assembly to remove. + + + + Skips validation for as long as the returned object remains in scope (remember to use using) + + + + + When set to true, the game is allowed to modify the vanilla content in debug builds. Has no effect in non-debug builds. + + + + + Returns file name characters that are invalid on any of our supported platforms (essentially the list of invalid characters on Windows) + + + + + Diff from UTC + + + + + DateTime wrapper that tries to offer a reliable + string representation that's also human-friendly + + + + + a method for changing inputtypes with old names to the new ones to ensure backwards compatibility with older subs + + + + + Convert a HSV value into a RGB value. + + Value between 0 and 360 + Value between 0 and 1 + Value between 0 and 1 + Reference + + + + + Returns either a green [x] or a red [o] + + + + + + + + Turn the object into a string and give it rich color based on the object type + + + + + + + Calculates the minimum number of single-character edits (i.e. insertions, deletions or substitutions) required to change one string into the other + + + + + Reads a number of bits from the buffer and inserts them to a new NetBuffer instance + + + + + Returns a new instance of the class with all properties and fields copied. + + + + + Copies the values of the source to the destination. May not work, if the source is of higher inheritance class than the destination. Does not work with virtual properties. + + + + + Cleans up a path by replacing backslashes with forward slashes, and + optionally corrects the casing of the path. Recommended when serializing + paths to a human-readable file to force case correction on all platforms. + Also useful when working with paths to files that currently don't exist, + i.e. case cannot be corrected. + + Path to clean up + Should the case be corrected to match the filesystem? + Directories that the path should be found in, not returned. + Path with corrected slashes, and corrected case if requested. + + + + Cleans up a path by replacing backslashes with forward slashes, and + corrects the casing of the path on non-Windows platforms. Recommended + when loading a path from a file, to make sure that it is found on all + platforms when attempting to open it. + + Path to clean up + Path with corrected slashes, and corrected case if required by the platform. + + + + Extends % and + characters to color tags in talent name tooltips to make them look nicer. + This obviously does not work in languages like French where a non breaking space is used + so it's just a a bit extra for the languages it works with. + + + + + + + Description of Voronoi. + + + + + @param xValuesIn Array of X values for each site. + @param yValuesIn Array of Y values for each site. Must be identical length to yValuesIn + @param minX The minimum X of the bounding box around the voronoi + @param maxX The maximum X of the bounding box around the voronoi + @param minY The minimum Y of the bounding box around the voronoi + @param maxY The maximum Y of the bounding box around the voronoi + @return + + + + Executed when the cell is destroyed (only applies to destructible level walls) + + + + + Returns the normal of the edge that points outwards from the specified cell + + +
+
\ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Concentus.NetStandard.dll b/Lua For Barotrauma/Binary/Concentus.NetStandard.dll new file mode 100644 index 0000000..293008d Binary files /dev/null and b/Lua For Barotrauma/Binary/Concentus.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/Concentus.NetStandard.pdb b/Lua For Barotrauma/Binary/Concentus.NetStandard.pdb new file mode 100644 index 0000000..013374a Binary files /dev/null and b/Lua For Barotrauma/Binary/Concentus.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/Concentus_LICENSE b/Lua For Barotrauma/Binary/Concentus_LICENSE new file mode 100644 index 0000000..74985b0 --- /dev/null +++ b/Lua For Barotrauma/Binary/Concentus_LICENSE @@ -0,0 +1,30 @@ +Copyright (c) by various holding parties, including (but not limited to): +Skype Limited, Xiph.Org Foundation, CSIRO, Microsoft Corporation, +Jean-Marc Valin, Gregory Maxwell, Mark Borgerding, Timothy B. Terriberry, +Logan Stromberg. All rights are reserved by their respective holders. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Internet Society, IETF or IETF Trust, nor the + names of specific contributors, may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Lua For Barotrauma/Binary/Data/campaignsettings.xml b/Lua For Barotrauma/Binary/Data/campaignsettings.xml new file mode 100644 index 0000000..24ec3a6 --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/campaignsettings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Data/clientpermissions.xml b/Lua For Barotrauma/Binary/Data/clientpermissions.xml new file mode 100644 index 0000000..f518b03 --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/clientpermissions.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Data/forbiddenwordlist.txt b/Lua For Barotrauma/Binary/Data/forbiddenwordlist.txt new file mode 100644 index 0000000..81cbd5d --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/forbiddenwordlist.txt @@ -0,0 +1,427 @@ +4r5e +5h1t +5hit +Dumbcunt +a$$ +a$$hole +a2m +a54 +a55 +a55hole +a_s_s +adolf +ahole + anal +anus +anuses +arrse +arse + ass +asses +asshat +asshole +assshole +b!tch +b17ch +b1tch +ballsack +beatch +bitch +bitchass +bitched +bitcher +bitchers +bitches +bitches +bitching +bitchy +blowjob +blowjobs +bulldyke +bullshit +bullshits +bullshitted +bullturds +bung +bunghole +buttfucker +butthole +buttmuch +buttmunch +c-0-c-k +c.0.c.k +c.o.c.k. +c.u.n.t +c0ck +carpetmuncher + chinc +chincs +chink +chinky +clitoris + cock +cock sucker +cock-sucker +cocks +cocksucker +cocksuckers +cocksucking +cocksucks +coochie +coochy + coon +coonnass + coons +cracker +crackwhore +crap +cumbubble +cumdump +cumdump +cumdumpster +cumguzzler +cumjockey +cummer +cummin +cumming + cums +cumshot +cumshots +cumslut +cumstain +cumtart +cunilingus +cunillingus +cunnie +cunnilingus + cunny +cunt +cuntass +cuntbag +cuntbag +cuntface +cunthole +cunthunter +cuntlick +cuntlick +cuntlicker +cuntlicker +cuntlicking +cuntlicking +cuntrag +cunts +cunts +cuntsicle +cuntsicle +cuntslut +d0uch3 +d0uche +d1ck +d1ld0 +d1ldo +deepthroat +dick +dick-ish +dick-sneeze +dickbag +dickbeaters +dickdipper +dickface +dickflipper +dickfuck +dickfucker +dickhead +dickheads +dickhole +dickish +dickjuice +dickmilk +dickmonger +dickripper +dicks +dicks +dicksipper +dickslap +dicksucker +dicksucking +dicktickler +dickwad +dickweasel +dickweed +dickwhipper +dickwod +dickzipper +diddle +dike +dildo +dildos +douche +douchebag +dumbass +dumbasses +dumbfuck +dumbshit +dyke +dykes +ejaculate +ejaculated +ejaculates +ejaculates +ejaculating +ejaculating +ejaculatings +ejaculation +ejakulate +erect +f u c k +f u c k e r +f.u.c.k +f4nny +f_u_c_k + fag +fagbag +fagfucker +fagg +fagged +fagging +faggit +faggitt +faggot +faggot* +faggotcock +faggots +faggots +faggs +fagot +fagots + fags +fagtard +fatass +fcuk +fcuker +fcuking +feck +fecker +fistfuck +fistfucked +fistfucked +fistfucker +fistfucker +fistfuckers +fistfuckers +fistfucking +fistfucking +fistfuckings +fistfuckings +fistfucks +fistfucks +fuck +fuck-ass +fuck ass +fuck-bitch +fuck bitch +fucktard +fuck tard +fucka +fuckass +fuckbag +fuckboy +fuckbrain +fuckbutt +fuckbutter +fucked +fuckedup +fucker +fuckers +fuckersucker +fuckface +fuckhead +fuckheads +fuckhole +fuckin +fucking +fuckings +fuckingshitmotherfucker +fuckme +fuckme +fuckmeat +fucknugget +fucknut +fucknutt +fuckoff +fucks +fuckstick +fucktard +fucktards +fucktart +fucktoy +fucktoy +fucktwat +fuckup +fuckwad +fuckwhit +fuckwit +fuckwitt +gay +gayass +gaybob +gaydo +gayfuck +gayfuckist +gaylord +gays +god-dam +god-damned +godamn +godamnit +goddam +goddammit +goddamn +goddamned +goddamnit +godsdamn +hitler +homo +homodumbshit +homoerotic +homoey +homos +honkey +honky +jack-off +jackass +jackass +jackasses +jackasses +jackhole +jackhole +jackoff +jackoff +jaggi +jagoff +jailbait +jailbait + jap +japs + jerk +jerk-off +jerkoff +jerk off +jerk0ff +jerkass +jerked +jerkoff +jew +jews +jism +jiz +jiz +jizm +jizm +jizz +jizzed +kike +kikes +knob + kum +kummer +kumming +kums +lesbian +lesbians +lesbo +lesbos +lez +lezzie +master-bate +master-bate +masterbat* +masterbat3 +masterbate +masterbating +masterbation +masterbations +masturbate +masturbating +masturbation +mothafuck +mothafucka +mothafuckas +mothafuckaz +mothafucked +mothafucked +mothafucker +mothafuckers +mothafuckin +mothafucking +mothafuckings +mothafucks +motherfuck +motherfucka +motherfucked +motherfucker +motherfucker +motherfuckers +motherfuckin +motherfucking +motherfuckings +motherfuckka +motherfucks +mudslime* +mudslimes* +nazi +nazis + nig +nig-nog +nigg3r +nigg4h +nigga +nigga +niggah +niggas +niggas +niggaz +nigger +nigger +niggers +niggle +niglet +negroid +negroids +penis +pigfucker + piss +piss-off +pissed +pisser +pissers +pisses +pisses +pissflaps +pissin +pissin +pissing +pissoff +pissoff +pussies +pussy +queaf +queaf +queef +queer +queers + rape +raped +raper +rapey +raping +rapist +slut +sluts +twat +twats +vagina +vaginas +white power +whore +whores \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Data/karmasettings.xml b/Lua For Barotrauma/Binary/Data/karmasettings.xml new file mode 100644 index 0000000..d46863b --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/karmasettings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Data/languageoptions.xml b/Lua For Barotrauma/Binary/Data/languageoptions.xml new file mode 100644 index 0000000..777a211 --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/languageoptions.xml @@ -0,0 +1,23 @@ + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Data/permissionpresets.xml b/Lua For Barotrauma/Binary/Data/permissionpresets.xml new file mode 100644 index 0000000..c1cef49 --- /dev/null +++ b/Lua For Barotrauma/Binary/Data/permissionpresets.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/DedicatedServer.deps.json b/Lua For Barotrauma/Binary/DedicatedServer.deps.json new file mode 100644 index 0000000..7ee2699 --- /dev/null +++ b/Lua For Barotrauma/Binary/DedicatedServer.deps.json @@ -0,0 +1,1987 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": {}, + ".NETCoreApp,Version=v6.0/win-x64": { + "DedicatedServer/1.7.7.0": { + "dependencies": { + "BarotraumaCore": "1.0.0", + "Concentus": "1.1.6", + "EosInterface": "1.0.0", + "Facepunch.Steamworks": "2.3.4", + "Farseer.NetStandard": "3.5.0", + "Hyper.ComponentModel.NetStandard": "1.0.0", + "Lib.Harmony": "2.2.2", + "Lidgren.NetStandard": "2012.1.7", + "Luatrauma.Internal.AssemblyPublicizer.MSBuild": "0.1.4", + "Microsoft.CodeAnalysis.CSharp.Scripting": "4.1.0", + "MoonSharp.Interpreter": "2.0.0", + "MoonSharp.VsCodeDebugger": "2.0.0", + "RestSharp": "106.13.0", + "Sigil": "5.0.0", + "Concentus.NetStandard": "1.1.6.0", + "Facepunch.Steamworks.Win64": "1.0.0.0", + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64": "6.0.8" + }, + "runtime": { + "DedicatedServer.dll": {} + } + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/6.0.8": { + "runtime": { + "Microsoft.CSharp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.VisualBasic.Core.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.100.822.36306" + }, + "Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "Microsoft.Win32.Registry.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.AppContext.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Buffers.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Concurrent.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Immutable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.NonGeneric.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.Specialized.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Collections.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.Annotations.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ComponentModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Console.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.Common.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.DataSetExtensions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Contracts.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Debug.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Process.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Tools.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Diagnostics.Tracing.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Drawing.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Drawing.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Dynamic.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Formats.Asn1.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.Calendars.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Globalization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.Brotli.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Compression.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.FileSystem.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.IsolatedStorage.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.Pipes.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.IO.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Expressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.Queryable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Memory.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Http.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Http.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.HttpListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Mail.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.NameResolution.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.NetworkInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Ping.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Quic.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Requests.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Security.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.ServicePoint.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.Sockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebClient.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebSockets.Client.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.WebSockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Numerics.Vectors.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ObjectModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.CoreLib.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.DataContractSerialization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Uri.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Xml.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Private.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Emit.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Metadata.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Reflection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.Reader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.ResourceManager.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Resources.Writer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Handles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.InteropServices.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Intrinsics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Loader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Numerics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Claims.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Principal.Windows.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.Principal.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.SecureString.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Encodings.Web.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Text.RegularExpressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Channels.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Overlapped.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Tasks.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Thread.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.ThreadPool.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.Timer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Threading.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Transactions.Local.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.ValueTuple.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Web.HttpUtility.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.ReaderWriter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XPath.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XmlDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.XmlSerializer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "WindowsBase.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.822.36306" + }, + "netstandard.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "6.0.822.36306" + } + }, + "native": { + "Microsoft.DiaSymReader.Native.amd64.dll": { + "fileVersion": "14.28.29715.1" + }, + "System.IO.Compression.Native.dll": { + "fileVersion": "42.42.42.42424" + }, + "api-ms-win-core-console-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-console-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-datetime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-debug-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-errorhandling-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-fibers-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l2-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-handle-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-interlocked-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-libraryloader-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-localization-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-memory-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-namedpipe-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processenvironment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-1.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-profile-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-rtlsupport-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-sysinfo-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-timezone-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-util-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-conio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-convert-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-environment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-filesystem-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-locale-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-math-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-multibyte-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-private-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-process-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-runtime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-stdio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-time-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-utility-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "clretwrc.dll": { + "fileVersion": "6.0.822.36306" + }, + "clrjit.dll": { + "fileVersion": "6.0.822.36306" + }, + "coreclr.dll": { + "fileVersion": "6.0.822.36306" + }, + "createdump.exe": { + "fileVersion": "6.0.822.36306" + }, + "dbgshim.dll": { + "fileVersion": "6.0.822.36306" + }, + "hostfxr.dll": { + "fileVersion": "6.0.822.36306" + }, + "hostpolicy.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordaccore.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordaccore_amd64_amd64_6.0.822.36306.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscordbi.dll": { + "fileVersion": "6.0.822.36306" + }, + "mscorrc.dll": { + "fileVersion": "6.0.822.36306" + }, + "msquic.dll": { + "fileVersion": "1.7.0.0" + }, + "ucrtbase.dll": { + "fileVersion": "10.0.22000.194" + } + } + }, + "Lib.Harmony/2.2.2": { + "dependencies": { + "MonoMod.Common": "22.6.3.1", + "System.Text.Json": "5.0.2" + }, + "runtime": { + "lib/net6.0/0Harmony.dll": { + "assemblyVersion": "2.2.2.0", + "fileVersion": "2.2.2.0" + } + } + }, + "Luatrauma.Internal.AssemblyPublicizer.MSBuild/0.1.4": {}, + "Microsoft.CodeAnalysis.Analyzers/3.3.3": {}, + "Microsoft.CodeAnalysis.Common/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "5.0.0", + "System.Memory": "4.5.4", + "System.Reflection.Metadata": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "5.0.0", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting/4.1.0": { + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "Microsoft.CodeAnalysis.CSharp": "4.1.0", + "Microsoft.CodeAnalysis.Common": "4.1.0", + "Microsoft.CodeAnalysis.Scripting.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.Scripting.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CodeAnalysis.Scripting.Common/4.1.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.1.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.Scripting.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.100.22.11411" + } + } + }, + "Microsoft.CSharp/4.7.0": {}, + "Microsoft.NETCore.Platforms/2.1.2": {}, + "Microsoft.NETCore.Targets/1.1.0": {}, + "Mono.Cecil/0.11.4": { + "runtime": { + "lib/netstandard2.0/Mono.Cecil.Mdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Pdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Rocks.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + } + } + }, + "MonoMod.Common/22.6.3.1": { + "dependencies": { + "Mono.Cecil": "0.11.4", + "System.Collections.NonGeneric": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Reflection.TypeExtensions": "4.7.0" + }, + "runtime": { + "lib/net5.0/MonoMod.Common.dll": { + "assemblyVersion": "22.6.3.1", + "fileVersion": "22.6.3.1" + } + } + }, + "RestSharp/106.13.0": { + "runtime": { + "lib/netstandard2.0/RestSharp.dll": { + "assemblyVersion": "106.13.0.0", + "fileVersion": "106.13.0.0" + } + } + }, + "runtime.any.System.Collections/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Globalization/4.3.0": {}, + "runtime.any.System.IO/4.3.0": {}, + "runtime.any.System.Reflection/4.3.0": {}, + "runtime.any.System.Reflection.Extensions/4.3.0": {}, + "runtime.any.System.Reflection.Primitives/4.3.0": {}, + "runtime.any.System.Resources.ResourceManager/4.3.0": {}, + "runtime.any.System.Runtime/4.3.0": { + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles/4.3.0": {}, + "runtime.any.System.Runtime.InteropServices/4.3.0": {}, + "runtime.any.System.Text.Encoding/4.3.0": {}, + "runtime.any.System.Threading.Tasks/4.3.0": {}, + "runtime.win.System.Diagnostics.Debug/4.3.0": {}, + "runtime.win.System.Runtime.Extensions/4.3.0": { + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "Sigil/5.0.0": { + "runtime": { + "lib/netstandard2.1/Sigil.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.0.0" + } + } + }, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Collections.Immutable/5.0.0": {}, + "System.Collections.NonGeneric/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized/4.3.0": { + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Primitives/4.3.0": { + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Memory/4.5.4": {}, + "System.Private.Uri/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration/4.7.0": {}, + "System.Reflection.Emit.Lightweight/4.7.0": {}, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Metadata/5.0.0": {}, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.7.0": {}, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": {}, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.CodePages/4.5.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "5.0.0" + } + }, + "System.Text.Json/5.0.2": {}, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions/4.5.4": {}, + "BarotraumaCore/1.0.0": { + "dependencies": { + "XNATypes": "1.0.0" + }, + "runtime": { + "BarotraumaCore.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Concentus/1.1.6": { + "runtime": { + "Concentus.NetStandard.dll": { + "assemblyVersion": "1.1.6", + "fileVersion": "1.1.6.0" + } + } + }, + "EosInterface/1.0.0": { + "dependencies": { + "BarotraumaCore": "1.0.0" + }, + "runtime": { + "EosInterface.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Facepunch.Steamworks/2.3.4": { + "runtime": { + "Facepunch.Steamworks.Win64.dll": { + "assemblyVersion": "2.3.4", + "fileVersion": "2.3.4" + } + } + }, + "Farseer.NetStandard/3.5.0": { + "dependencies": { + "XNATypes": "1.0.0" + }, + "runtime": { + "Farseer.NetStandard.dll": { + "assemblyVersion": "3.5.0", + "fileVersion": "3.5.0.0" + } + } + }, + "Hyper.ComponentModel.NetStandard/1.0.0": { + "runtime": { + "Hyper.ComponentModel.NetStandard.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Lidgren.NetStandard/2012.1.7": { + "runtime": { + "Lidgren.NetStandard.dll": { + "assemblyVersion": "2012.1.7", + "fileVersion": "2012.1.7.0" + } + } + }, + "MoonSharp.Interpreter/2.0.0": { + "runtime": { + "MoonSharp.Interpreter.dll": { + "assemblyVersion": "2.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "MoonSharp.VsCodeDebugger/2.0.0": { + "dependencies": { + "MoonSharp.Interpreter": "2.0.0" + }, + "runtime": { + "MoonSharp.VsCodeDebugger.dll": { + "assemblyVersion": "2.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "XNATypes/1.0.0": { + "runtime": { + "XNATypes.dll": { + "assemblyVersion": "1.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Concentus.NetStandard/1.1.6.0": { + "runtime": { + "Concentus.NetStandard.dll": { + "assemblyVersion": "1.1.6.0", + "fileVersion": "1.1.6.0" + } + } + }, + "Facepunch.Steamworks.Win64/1.0.0.0": { + "runtime": { + "Facepunch.Steamworks.Win64.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "2.3.4.0" + } + } + } + } + }, + "libraries": { + "DedicatedServer/1.7.7.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/6.0.8": { + "type": "runtimepack", + "serviceable": false, + "sha512": "" + }, + "Lib.Harmony/2.2.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-70KvWz+DiUELxafsYL/LHxA/jH3PDWeApLo/VwtnrpTvRWQ/eUdPfS/l5funmhZWOy41QXw6UjVv+6C57Nx77A==", + "path": "lib.harmony/2.2.2", + "hashPath": "lib.harmony.2.2.2.nupkg.sha512" + }, + "Luatrauma.Internal.AssemblyPublicizer.MSBuild/0.1.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IYE30WBR3dAgHRRaEMNsILJWug1KxsM3CP181A/0/PWD4aUmEC1UBVMq22UHa0PnIRJxK0EzRVRicQjoy6aoZA==", + "path": "luatrauma.internal.assemblypublicizer.msbuild/0.1.4", + "hashPath": "luatrauma.internal.assemblypublicizer.msbuild.0.1.4.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==", + "path": "microsoft.codeanalysis.analyzers/3.3.3", + "hashPath": "microsoft.codeanalysis.analyzers.3.3.3.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==", + "path": "microsoft.codeanalysis.common/4.1.0", + "hashPath": "microsoft.codeanalysis.common.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sbu6kDGzo9bfQxuqWpeEE7I9P30bSuZEnpDz9/qz20OU6pm79Z63+/BsAzO2e/R/Q97kBrpj647wokZnEVr97w==", + "path": "microsoft.codeanalysis.csharp/4.1.0", + "hashPath": "microsoft.codeanalysis.csharp.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp.Scripting/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G3HBl6t7p8azLZS67jxUdYQhd/M00IQMag3wNkOK5qAWgEX+QSOmzWiG7GjTp84HbviFCqZplZbCNzDc5gGsBw==", + "path": "microsoft.codeanalysis.csharp.scripting/4.1.0", + "hashPath": "microsoft.codeanalysis.csharp.scripting.4.1.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Scripting.Common/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lRjDlFhq4HllCNFaWvfSRGr9JYyFlkR0fW7a8+7bBjybBTi2WqTZr4/pJCd4iPrSS+zSI6EdgnrEF+xNEsZHrQ==", + "path": "microsoft.codeanalysis.scripting.common/4.1.0", + "hashPath": "microsoft.codeanalysis.scripting.common.4.1.0.nupkg.sha512" + }, + "Microsoft.CSharp/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==", + "path": "microsoft.csharp/4.7.0", + "hashPath": "microsoft.csharp.4.7.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/2.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", + "path": "microsoft.netcore.platforms/2.1.2", + "hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "Mono.Cecil/0.11.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IC1h5g0NeJGHIUgzM1P82ld57knhP0IcQfrYITDPXlNpMYGUrsG5TxuaWTjaeqDNQMBDNZkB8L0rBnwsY6JHuQ==", + "path": "mono.cecil/0.11.4", + "hashPath": "mono.cecil.0.11.4.nupkg.sha512" + }, + "MonoMod.Common/22.6.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7CUFpelStpHwdWhIJrwyn56f1IXe3OLrNc9oytWIvBu6mAFT4ELqH1o9gVjmMIN6xf1KPl+OTYd0YRUP8wRZ9g==", + "path": "monomod.common/22.6.3.1", + "hashPath": "monomod.common.22.6.3.1.nupkg.sha512" + }, + "RestSharp/106.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vwUdmmtC5vtePeNfBWnFcixBF2KjUeVv3ss4ZFzCIkOf7NB7W/9qX8JNZD9DOrz2yGk4AJW8k9znwgPZhnoiNg==", + "path": "restsharp/106.13.0", + "hashPath": "restsharp.106.13.0.nupkg.sha512" + }, + "runtime.any.System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "path": "runtime.any.system.collections/4.3.0", + "hashPath": "runtime.any.system.collections.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==", + "path": "runtime.any.system.globalization/4.3.0", + "hashPath": "runtime.any.system.globalization.4.3.0.nupkg.sha512" + }, + "runtime.any.System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==", + "path": "runtime.any.system.io/4.3.0", + "hashPath": "runtime.any.system.io.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==", + "path": "runtime.any.system.reflection/4.3.0", + "hashPath": "runtime.any.system.reflection.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==", + "path": "runtime.any.system.reflection.extensions/4.3.0", + "hashPath": "runtime.any.system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==", + "path": "runtime.any.system.reflection.primitives/4.3.0", + "hashPath": "runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==", + "path": "runtime.any.system.resources.resourcemanager/4.3.0", + "hashPath": "runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "path": "runtime.any.system.runtime/4.3.0", + "hashPath": "runtime.any.system.runtime.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==", + "path": "runtime.any.system.runtime.handles/4.3.0", + "hashPath": "runtime.any.system.runtime.handles.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==", + "path": "runtime.any.system.runtime.interopservices/4.3.0", + "hashPath": "runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==", + "path": "runtime.any.system.text.encoding/4.3.0", + "hashPath": "runtime.any.system.text.encoding.4.3.0.nupkg.sha512" + }, + "runtime.any.System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==", + "path": "runtime.any.system.threading.tasks/4.3.0", + "hashPath": "runtime.any.system.threading.tasks.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==", + "path": "runtime.win.system.diagnostics.debug/4.3.0", + "hashPath": "runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "runtime.win.System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "path": "runtime.win.system.runtime.extensions/4.3.0", + "hashPath": "runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "Sigil/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9376TkXVKwEJNDOpnAunqjqlto9v0RZX/YNBGfWUVl9eyBNS1rmP49HgjPH5xr4rdVI+qT0p/+ngCNc/sM3PPA==", + "path": "sigil/5.0.0", + "hashPath": "sigil.5.0.0.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.Immutable/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", + "path": "system.collections.immutable/5.0.0", + "hashPath": "system.collections.immutable.5.0.0.nupkg.sha512" + }, + "System.Collections.NonGeneric/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "path": "system.collections.nongeneric/4.3.0", + "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" + }, + "System.Collections.Specialized/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "path": "system.collections.specialized/4.3.0", + "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" + }, + "System.ComponentModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "path": "system.componentmodel/4.3.0", + "hashPath": "system.componentmodel.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "path": "system.componentmodel.primitives/4.3.0", + "hashPath": "system.componentmodel.primitives.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "path": "system.componentmodel.typeconverter/4.3.0", + "hashPath": "system.componentmodel.typeconverter.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Memory/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "path": "system.memory/4.5.4", + "hashPath": "system.memory.4.5.4.nupkg.sha512" + }, + "System.Private.Uri/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "path": "system.private.uri/4.3.0", + "hashPath": "system.private.uri.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA==", + "path": "system.reflection.emit.ilgeneration/4.7.0", + "hashPath": "system.reflection.emit.ilgeneration.4.7.0.nupkg.sha512" + }, + "System.Reflection.Emit.Lightweight/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA==", + "path": "system.reflection.emit.lightweight/4.7.0", + "hashPath": "system.reflection.emit.lightweight.4.7.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Metadata/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==", + "path": "system.reflection.metadata/5.0.0", + "hashPath": "system.reflection.metadata.5.0.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==", + "path": "system.reflection.typeextensions/4.7.0", + "hashPath": "system.reflection.typeextensions.4.7.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==", + "path": "system.runtime.compilerservices.unsafe/5.0.0", + "hashPath": "system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.CodePages/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "path": "system.text.encoding.codepages/4.5.1", + "hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512" + }, + "System.Text.Json/5.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ==", + "path": "system.text.json/5.0.2", + "hashPath": "system.text.json.5.0.2.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "path": "system.threading.tasks.extensions/4.5.4", + "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" + }, + "BarotraumaCore/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Concentus/1.1.6": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "EosInterface/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Facepunch.Steamworks/2.3.4": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Farseer.NetStandard/3.5.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Hyper.ComponentModel.NetStandard/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Lidgren.NetStandard/2012.1.7": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "MoonSharp.Interpreter/2.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "MoonSharp.VsCodeDebugger/2.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "XNATypes/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Concentus.NetStandard/1.1.6.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Facepunch.Steamworks.Win64/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + }, + "runtimes": { + "win-x64": [ + "win", + "any", + "base" + ], + "win-x64-aot": [ + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win10-x64": [ + "win10", + "win81-x64", + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win10-x64-aot": [ + "win10-aot", + "win10-x64", + "win10", + "win81-x64-aot", + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win7-x64": [ + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win7-x64-aot": [ + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win8-x64": [ + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win8-x64-aot": [ + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win81-x64": [ + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win81-x64-aot": [ + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ] + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/DedicatedServer.dll b/Lua For Barotrauma/Binary/DedicatedServer.dll new file mode 100644 index 0000000..71127bb Binary files /dev/null and b/Lua For Barotrauma/Binary/DedicatedServer.dll differ diff --git a/Lua For Barotrauma/Binary/DedicatedServer.exe b/Lua For Barotrauma/Binary/DedicatedServer.exe new file mode 100644 index 0000000..933a1d9 Binary files /dev/null and b/Lua For Barotrauma/Binary/DedicatedServer.exe differ diff --git a/Lua For Barotrauma/Binary/DedicatedServer.pdb b/Lua For Barotrauma/Binary/DedicatedServer.pdb new file mode 100644 index 0000000..1d20ec3 Binary files /dev/null and b/Lua For Barotrauma/Binary/DedicatedServer.pdb differ diff --git a/Lua For Barotrauma/Binary/DedicatedServer.runtimeconfig.json b/Lua For Barotrauma/Binary/DedicatedServer.runtimeconfig.json new file mode 100644 index 0000000..736800c --- /dev/null +++ b/Lua For Barotrauma/Binary/DedicatedServer.runtimeconfig.json @@ -0,0 +1,16 @@ +{ + "runtimeOptions": { + "tfm": "net6.0", + "includedFrameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "6.0.8" + } + ], + "configProperties": { + "System.Globalization.Invariant": true, + "System.Globalization.PredefinedCulturesOnly": true, + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false + } + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/EosInterface.dll b/Lua For Barotrauma/Binary/EosInterface.dll new file mode 100644 index 0000000..86cff3c Binary files /dev/null and b/Lua For Barotrauma/Binary/EosInterface.dll differ diff --git a/Lua For Barotrauma/Binary/EosInterface.pdb b/Lua For Barotrauma/Binary/EosInterface.pdb new file mode 100644 index 0000000..f2155a1 Binary files /dev/null and b/Lua For Barotrauma/Binary/EosInterface.pdb differ diff --git a/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.dll b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.dll new file mode 100644 index 0000000..cd4b4e6 Binary files /dev/null and b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.dll differ diff --git a/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.pdb b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.pdb new file mode 100644 index 0000000..795c1db Binary files /dev/null and b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.pdb differ diff --git a/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.xml b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.xml new file mode 100644 index 0000000..3b45457 --- /dev/null +++ b/Lua For Barotrauma/Binary/Facepunch.Steamworks.Win64.xml @@ -0,0 +1,4117 @@ + + + + Facepunch.Steamworks.Win64 + + + + + An awaitable version of a SteamAPICall_t + + + + + This gets called if IsComplete returned false on the first call. + The Action "continues" the async call. We pass it to the Dispatch + to be called when the callback returns. + + + + + Gets the result. This is called internally by the async shit. + + + + + Return true if complete or failed + + + + + This is what makes this struct awaitable + + + + + Gives us a generic way to get the CallbackId of structs + + + + + Cancels a ticket. + You should cancel your ticket when you close the game or leave a server. + + + + + Cancels a ticket. + You should cancel your ticket when you close the game or leave a server. + + + + + Responsible for all callback/callresult handling + + This manually pumps Steam's message queue and dispatches those + events to any waiting callbacks/callresults. + + + + + If set then we'll call this function every time a callback is generated. + + This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific + callback then please create an issue on github and I'll add it! + + Params are : [Callback Type] [Callback Contents] [server] + + + + + + Called if an exception happens during a callback/callresult. + This is needed because the exception isn't always accessible when running + async.. and can fail silently. With this hooked you won't be stuck wondering + what happened. + + + + + This gets called from Client/Server Init + It's important to switch to the manual dispatcher + + + + + Make sure we don't call Frame in a callback - because that'll cause some issues for everyone. + + + + + Calls RunFrame and processes events from this Steam Pipe + + + + + To be safe we don't call the continuation functions while iterating + the Callback list. This is maybe overly safe because the only way this + could be an issue is if the callback list is modified in the continuation + which would only happen if starting or shutting down in the callback. + + + + + A callback is a general global message + + + + + Given a callback, try to turn it into a string + + + + + A result is a reply to a specific command + + + + + Pumps the queue in an async loop so we don't + have to think about it. This has the advantage that + you can call .Wait() on async shit and it still works. + + + + + Pumps the queue in an async loop so we don't + have to think about it. This has the advantage that + you can call .Wait() on async shit and it still works. + + + + + Watch for a steam api call + + + + + Install a global callback. The passed function will get called if it's all good. + + + + + The score is just a simple numerical value + + + + + The score represents a time, in seconds + + + + + The score represents a time, in milliseconds + + + + + The top-score is the lowest number + + + + + The top-score is the highest number + + + + + Send the message unreliably. Can be lost. Messages *can* be larger than a + single MTU (UDP packet), but there is no retransmission, so if any piece + of the message is lost, the entire message will be dropped. + + The sending API does have some knowledge of the underlying connection, so + if there is no NAT-traversal accomplished or there is a recognized adjustment + happening on the connection, the packet will be batched until the connection + is open again. + + + + + Disable Nagle's algorithm. + By default, Nagle's algorithm is applied to all outbound messages. This means + that the message will NOT be sent immediately, in case further messages are + sent soon after you send this, which can be grouped together. Any time there + is enough buffered data to fill a packet, the packets will be pushed out immediately, + but partially-full packets not be sent until the Nagle timer expires. + + + + + If the message cannot be sent very soon (because the connection is still doing some initial + handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable + messages. Using this flag on reliable messages is invalid. + + + + Reliable message send. Can send up to 0.5mb in a single message. + Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for + efficient sends of large chunks of data. + + + + Return a NetIdentity that represents LocalHost + + + + + Return true if this identity is localhost + + + + + Convert to a SteamId + + + + + + Set the specified Address + + + + + Automatically convert to a SteamId + + + + + + Returns NULL if we're not a SteamId + + + + + Returns NULL if we're not a NetAddress + + + + + We override tostring to provide a sensible representation + + + + + The Port. This is redundant documentation. + + + + + Any IP, specific port + + + + + Localhost IP, specific port + + + + + Specific IP, specific port + + + + + Specific IP, specific port + + + + + Set everything to zero + + + + + Return true if the IP is ::0. (Doesn't check port.) + + + + + Return true if IP is mapped IPv4 + + + + + Return true if IP is a fake IPv4 for Steam Datagram Relay + + + + + Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1) + + + + + Get the Address section + + + + + Used as a base to create your client connection. This creates a socket + to a single connection. + + You can override all the virtual functions to turn it into what you + want it to do. + + + + + Accept an incoming connection that has been received on a listen socket. + + + + + Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded.. + reasonCode is defined and used by you. + + + + + Get/Set connection user data + + + + + A name for the connection, used mostly for debugging + + + + + This is the best version to use. + + + + + Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and + you're not creating a new one every frame (like using .ToArray()) + + + + + Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and + you're not creating a new one every frame (like using .ToArray()) + + + + + This creates a ton of garbage - so don't do anything with this beyond testing! + + + + + Flush any messages waiting on the Nagle timer and send them at the next transmission + opportunity (often that means right now). + + + + + Returns detailed connection stats in text format. Useful + for dumping to a log, etc. + + Plain text connection info + + + + Returns a small set of information about the real-time state of the connection. + + + + + Configure multiple outbound messages streams ("lanes") on a connection, and + control head-of-line blocking between them. + + + + + Describe the state of a connection + + + + + High level state of the connection + + + + + Remote address. Might be all 0's if we don't know it, or if this is N/A. + + + + + Who is on the other end? Depending on the connection type and phase of the connection, we might not know + + + + + Basic cause of the connection termination or problem. + + + + + Describe the status of a connection + + + + + Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire. + + + + + Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire. + + + + + Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit. + + + + + Describe the status of a connection + + + + + Current ping (ms) + + + + + Outgoing packets per second + + + + + Outgoing bytes per second + + + + + Incoming packets per second + + + + + Incoming bytes per second + + + + + Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order). + + + + + Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order). + + + + + Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire. + + + + + Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire. + + + + + Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit. + + + + + + Object that describes a "location" on the Internet with sufficient + detail that we can reasonably estimate an upper bound on the ping between + the two hosts, even if a direct route between the hosts is not possible, + and the connection must be routed through the Steam Datagram Relay network. + This does not contain any information that identifies the host. Indeed, + if two hosts are in the same building or otherwise have nearly identical + networking characteristics, then it's valid to use the same location + object for both of them. + + NOTE: This object should only be used in the same process! Do not serialize it, + send it over the wire, or persist it in a file or database! If you need + to do that, convert it to a string representation using the methods in + ISteamNetworkingUtils(). + + + + + Estimate the round-trip latency between two arbitrary locations, in + milliseconds. This is a conservative estimate, based on routing through + the relay network. For most basic relayed connections, this ping time + will be pretty accurate, since it will be based on the route likely to + be actually used. + + If a direct IP route is used (perhaps via NAT traversal), then the route + will be different, and the ping time might be better. Or it might actually + be a bit worse! Standard IP routing is frequently suboptimal! + + But even in this case, the estimate obtained using this method is a + reasonable upper bound on the ping time. (Also it has the advantage + of returning immediately and not sending any packets.) + + In a few cases we might not able to estimate the route. In this case + a negative value is returned. k_nSteamNetworkingPing_Failed means + the reason was because of some networking difficulty. (Failure to + ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot + currently answer the question for some other reason. + + Do you need to be able to do this from a backend/matchmaking server? + You are looking for the "ticketgen" library. + + + + Destroy a listen socket. All the connections that were accepting on the listen + socket are closed ungracefully. + + + + + Represents a Steam Achievement. + + + + + Gets whether or not the achievement has been unlocked. + + + + + Gets the identifier of the achievement. This is the "API Name" on Steamworks. + + + + + Gets the display name of the achievement. + + + + + Gets the description of the achievement. + + + + + If is , this value represents the time that the achievement was unlocked. + + + + + Gets the icon of the achievement. This can return a null image even though the image exists if the image + hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded. + + + + + Gets the icon of the achievement, yielding until the icon is received or the is reached. + + The timeout in milliseconds before the request will be canceled. Defaults to 5000. + + + + Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available. + + + + + Unlock this achievement. + + + + + Reset this achievement to be locked. + + + + + Provides information about a DLC. + + + + + The of the DLC. + + + + + The name of the DLC. + + + + + Whether or not the DLC is available. + + + + + Represents download progress. + + + + + Whether or not the download is currently active. + + + + + How many bytes have been downloaded. + + + + + How many bytes in total the download is. + + + + + Gets the amount of bytes left that need to be downloaded. + + + + + Sent for games with enabled anti indulgence / duration control, for enabled users. + Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate. + + + + + appid generating playtime + + + + + is duration control applicable to user + game combination + + + + + playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds + + + + + playtime on current calendar day + + + + + recommended progress + + + + + Represents details of a file. + + + + + The size of the file in bytes. + + + + + Returns the color of the pixel at the specified position. + + X-coordinate + Y-coordinate + The color. + If the X and Y or out of bounds. + + + + Returns "{Width}x{Height} ({length of }bytes)" + + + + + + Represents a color. + + + + + the name of a leaderboard + + + + + Submit your score and replace your old score even if it was better + + + + + Submit your new score, but won't replace your high score if it's lower + + + + + Attaches a piece of user generated content the user's entry on a leaderboard + + + + + Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard. + + + + + Used to query for a sequential range of leaderboard entries by leaderboard Sort. + + + + + Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard + before or after the user's entry, Steam will adjust the range to try to return the number of entries requested. + For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first + 5 entries in the leaderboard. If The current user has no entry, this will return null. + + + + + Used to retrieve all leaderboard entries for friends of the current user + + + + + Represents a Steam lobby. + + + + + Try to join this room. Will return on success, + and anything else is a failure. + + + + + Leave a lobby; this will take effect immediately on the client side + other users in the lobby will be notified by a LobbyChatUpdate_t callback + + + + + Invite another user to the lobby. + Will return if the invite is successfully sent, whether or not the target responds + returns if the local user is not connected to the Steam servers + + + + + Gets the number of users in this lobby. + + + + + Returns current members in the lobby. The current user must be in the lobby in order to see the users. + + + + + Get data associated with this lobby. + + + + + Set data associated with this lobby. + + + + + Removes a metadata key from the lobby. + + + + + Get all data for this lobby. + + + + + Gets per-user metadata for someone in this lobby. + + + + + Sets per-user metadata (for the local user implicitly). + + + + + Sends a string to the chat room. + + + + + Sends bytes to the chat room. + + + + + Sends bytes to the chat room from an unsafe buffer. + + + + + Refreshes metadata for a lobby you're not necessarily in right now. + + You never do this for lobbies you're a member of, only if your + this will send down all the metadata associated with a lobby. + This is an asynchronous call. + Returns if the local user is not connected to the Steam servers. + Results will be returned by a LobbyDataUpdate_t callback. + If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to . + + + + + Max members able to join this lobby. Cannot be over 250. + Can only be set by the owner of the lobby. + + + + + Sets the lobby as public. + + + + + Sets the lobby as private. + + + + + Sets the lobby as invisible. + + + + + Sets the lobby as friends only. + + + + + Set whether or not the lobby can be joined. + + Whether or not the lobby can be joined. + + + + [SteamID variant] + Allows the owner to set the game server associated with the lobby. Triggers the + Steammatchmaking.OnLobbyGameCreated event. + + + + + [IP/Port variant] + Allows the owner to set the game server associated with the lobby. Triggers the + Steammatchmaking.OnLobbyGameCreated event. + + + + + Gets the details of the lobby's game server, if set. Returns true if the lobby is + valid and has a server set, otherwise returns false. + + + + + Gets or sets the owner of the lobby. You must be the lobby owner to set the owner + + + + + Check if the specified SteamId owns the lobby. + + + + + only lobbies in the same immediate region will be returned + + + + + only lobbies in the same immediate region will be returned + + + + + only lobbies in the same immediate region will be returned + + + + + Filter by specified key/value pair; string parameters + + + + + Numerical filter where value is less than the value provided + + + + + Numerical filter where value is greater than the value provided + + + + + Numerical filter where value must be equal to the value provided + + + + + Numerical filter where value must not equal the value provided + + + + + Test key, initialize numerical filter list if necessary, then add new numerical filter + + + + + Order filtered results according to key/values nearest the provided key/value pair. + Can specify multiple near value filters; each successive filter is lower priority than the previous. + + + + + returns only lobbies with the specified number of slots available + + + + + sets how many results to return, the lower the count the faster it is to download the lobby results + + + + + Run the query, get the matching lobbies + + + + + A server query packet. + + + + + Target IP address + + + + + Target port + + + + + This data is pooled. Make a copy if you don't use it immediately. + This buffer is also quite large - so pay attention to Size. + + + + + Size of the data + + + + + Represents a RemotePlaySession from the SteamRemotePlay interface + + + + + Returns true if this session was valid when created. This will stay true even + after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected + + + + + Get the SteamID of the connected user + + + + + Get the name of the session client device + + + + + Get the name of the session client device + + + + + Represents a screenshot that was taken by a user. + + + + + Tags a user as being visible in the screenshot + + + + + Sets the location of the screenshot. + + + + + Gets the individual tags for this server + + + + + Add this server to our history list + If we're already in the history list, weill set the last played time to now + + + + + If this server responds to source engine style queries, we'll be able to get a list of rules here + + + + + Remove this server from our history list + + + + + Add this server to our favourite list + + + + + Remove this server from our favourite list + + + + + An optional interface to use instead of deriving + + + + + The actual connection we're managing + + + + + The last received ConnectionInfo + + + + + We're trying to connect! + + + + + Client is connected. They move from connecting to Connections + + + + + The connection has been closed remotely or disconnected locally. Check data.State for details. + + + + + Sends a message to multiple connections. + + The connections to send the message to. + The number of connections to send the message to, to allow reusing the connections array. + Pointer to the message data. + Size of the message data. + Flags to control delivery of the message. + An optional array to hold the results of sending the messages for each connection. + + + + Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and + you're not creating a new one every frame (like using .ToArray()) + + + + + Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and + you're not creating a new one every frame (like using .ToArray()) + + + + + This creates a ton of garbage - so don't do anything with this beyond testing! + + + + + We started connecting to this guy + + + + + Called when the connection is fully connected and can start being communicated with + + + + + We got disconnected + + + + + Received a message + + + + + Must call Accept or Close on the connection within a second or so + + + + + Called when the connection is fully connected and can start being communicated with + + + + + Called when the connection leaves. Must call Close on the connection + + + + + Received a message from a connection + + + + + Used as a base to create your networking server. This creates a socket + and listens/communicates with multiple queries. + + You can override all the virtual functions to turn it into what you + want it to do. + + + + + Default behaviour is to accept every connection + + + + + Client is connected. They move from connecting to Connections + + + + + The connection has been closed remotely or disconnected locally. Check data.State for details. + + + + + Which app we're querying. Defaults to the current app. + + + + + When a new server is added, this function will get called + + + + + Called for every responsive server + + + + + Called for every unresponsive server + + + + + A list of servers that responded. If you're only interested in servers that responded since you + last updated, then simply clear this list. + + + + + A list of servers that were in the master list but didn't respond. + + + + + Query the server list. Task result will be true when finished + + + + + + Exposes a wide range of information and actions for applications and Downloadable Content (DLC). + + + + + Posted after the user gains ownership of DLC and that DLC is installed. + + + + + Posted after the user gains executes a Steam URL with command line or query parameters + such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc + while the game is already running. The new params can be queried + with GetLaunchQueryParam and GetLaunchCommandLine. + + + + + Gets whether or not the active user is subscribed to the current App ID. + + + + + Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID. + + + + + Gets whether or not the license owned by the user provides low violence depots. + Low violence depots are useful for copies sold in countries that have content restrictions + + + + + Gets whether or not the current App ID license is for Cyber Cafes. + + + + + Gets whether or not the user has a VAC ban on their account. + + + + + Gets the current language that the user has set. + This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title. + + + + + Gets a list of the languages the current app supports. + + + + + Gets whether or not the active user is subscribed to a specified App ID. + Only use this if you need to check ownership of another game related to yours, a demo for example. + + The App ID of the DLC to check. + + + + Gets whether or not the user owns a specific DLC and if the DLC is installed. + + The App ID of the DLC to check. + + + + Returns the time of the purchase of the app. + + The App ID to check the purchase time for. + + + + Checks if the user is subscribed to the current app through a free weekend. + This function will return false for users who have a retail or other type of license. + Before using, please ask your Valve technical contact how to package and secure your free weekened. + + + + + Returns metadata for all available DLC. + + + + + Install control for optional DLC. + + The App ID of the DLC to install. + + + + Uninstall control for optional DLC. + + The App ID of the DLC to uninstall. + + + + Gets the name of the beta branch that is launched, or if the application is not running on a beta branch. + + + + + Force verify game content on next launch. + + If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server), + you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit. + + Whether or not to only verify missing files. + + + + Gets a list of all installed depots for a given App ID in mount order. + + The App ID. + + + + Gets the install folder for a specific App ID. + This works even if the application is not installed, based on where the game would be installed with the default Steam library location. + + The App ID. + + + + Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc. + + The App ID. + + + + Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed. + + + + + Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc. + + Parameter names starting with the character '@' are reserved for internal use and will always return an empty string. + Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game, + but it is advised that you not param names beginning with an underscore for your own features. + + The name of the parameter. + The launch parameter value. + + + + Gets the download progress for optional DLC. + + The App ID to check the progress for. + + + + Gets the Build ID of this app, which can change at any time based on backend updates to the game. + Defaults to 0 if you're not running a build downloaded from steam. + + + + + Asynchronously retrieves metadata details about a specific file in the depot manifest. + + The name of the file. + + + + Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/. + This method of passing a connect string (used when joining via rich presence, accepting an + invite, etc) is preferable to passing the connect string on the operating system command + line, which is a security risk. In order for rich presence joins to go through this + path and not be placed on the OS command line, you must set a value in your app's + configuration on Steam. Ask Valve for help with this. + + + + + Check if game is a timed trial with limited playtime. + + The amount of seconds left on the timed trial. + The amount of seconds played on the timed trial. + + + + Initialize the steam client. + If is false you need to call manually every frame. + + + + + Shuts down the steam client. + + + + + Checks if the current user's Steam client is connected to the Steam servers. + + If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam + client will automatically be trying to recreate the connection as often as possible. When the + connection is restored a SteamServersConnected_t callback will be posted. + You usually don't need to check for this yourself. All of the API calls that rely on this will + check internally. Forcefully disabling stuff when the player loses access is usually not a + very good experience for the player and you could be preventing them from accessing APIs that do not + need a live connection to Steam. + + + + + Gets the Steam ID of the account currently logged into the Steam client. This is + commonly called the 'current user', or 'local user'. + A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat + rooms, and used to differentiate users in all parts of the Steamworks API. + + + + + returns the local players name - guaranteed to not be . + This is the same name as on the user's community profile page. + + + + + Gets the status of the current user. + + + + + Returns the App ID of the current process. + + + + + Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't. + + This returns true then it starts the Steam client if required and launches your game again through it, + and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it + may not relaunch the exact executable that called it, as it will always relaunch from the version + installed in your Steam library folder/ + Note that during development, when not launching via Steam, this might always return true. + + + + + Called in interfaces that rely on this being initialized + + + + + Class for utilizing the Steam Friends API. + + + + + Invoked when a chat message has been received from a friend. You'll need to enable + to recieve this. (friend, msgtype, message) + + + + + Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message) + + + + + Invoked when a friends' status changes. + + + + + Invoked when the user tries to join a game from their friends list. + Rich presence will have been set with the "connect" key which is set here. + + + + + Invoked when game overlay activates or deactivates. + The game can use this to be pause or resume single player games. + + + + + Invoked when the user tries to join a different game server from their friends list. + Game client should attempt to connect to specified server when this is received. + + + + + Invoked when the user tries to join a lobby from their friends list. + Game client should attempt to connect to specified lobby when this is received. + + + + + Invoked when a friend's rich presence data is updated. + + + + + Invoked when an overlay browser instance is navigated to a + protocol/scheme registered by . + + + + + Gets an of friends that the current user has. + + An of friends. + + + + Gets an of blocked users that the current user has. + + An of blocked users. + + + + Gets an of friend requests that the current user has. + + An of friend requests. + + + + Opens a specific overlay window. Valid options are: + "friends", + "community", + "players", + "settings", + "officialgamegroup", + "stats", + "achievements". + + + + + "steamid" - Opens the overlay web browser to the specified user or groups profile. + "chat" - Opens a chat window to the specified user, or joins the group chat. + "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API. + "stats" - Opens the overlay web browser to the specified user's stats. + "achievements" - Opens the overlay web browser to the specified user's achievements. + "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend. + "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend. + "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite. + "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite. + + + + + Activates the Steam Overlay to the Steam store page for the provided app. + + + + + Activates Steam Overlay web browser directly to the specified URL. + + + + + Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby. + + + + + Mark a target user as 'played with'. + NOTE: The current user must be in game with the other player for the association to work. + + + + + Requests the persona name and optionally the avatar of a specified user. + NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them. + returns true if we're fetching the data, false if we already have it + + + + + Returns a small avatar of the user with the given . + + The of the user to get. + A with a value if the image was successfully retrieved. + + + + Returns a medium avatar of the user with the given . + + The of the user to get. + A with a value if the image was successfully retrieved. + + + + Returns a large avatar of the user with the given . + + The of the user to get. + A with a value if the image was successfully retrieved. + + + + Find a rich presence value by key for current user. Will be null if not found. + + + + + Sets a rich presence value by key for current user. + + + + + Clears all of the current user's rich presence data. + + + + + Listens for Steam friends chat messages. + You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2. + After enabling this you will receive callbacks when ever the user receives a chat message. + + + + + Gets whether or not the current user is following the user with the given . + + The to check. + Boolean. + + + + Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations + to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game. + + + + + Class for utilizing Steam Input. + + + + + You shouldn't really need to call this because it gets called by + but Valve think it might be a nice idea if you call it right before you get input info - + just to make sure the info you're getting is 100% up to date. + + + + + Gets a list of connected controllers. + + + + + Return an absolute path to the PNG image glyph for the provided digital action name. The current + action set in use for the controller will be used for the lookup. You should cache the result and + maintain your own list of loaded PNG assets. + + + + + + + + Return an absolute path to the PNG image glyph for the provided digital action name. The current + action set in use for the controller will be used for the lookup. You should cache the result and + maintain your own list of loaded PNG assets. + + + + + Return an absolute path to the SVF image glyph for the provided digital action name. The current + action set in use for the controller will be used for the lookup. You should cache the result and + maintain your own list of loaded PNG assets. + + + + + Class for utilizing the Steam Inventory API. + + + + + Call this if you're going to want to access definition information. You should be able to get + away with calling this once at the start if your game, assuming your items don't change all the time. + This will trigger at which point Definitions should be set. + + + + + Will call and wait until Definitions is not null + + + + + Try to find the definition that matches this definition ID. + Uses a dictionary so should be about as fast as possible. + + + + + We will try to keep this list of your items automatically up to date. + + + + + Update the list of Items[] + + + + + Get all items and return the InventoryResult + + + + + This is used to grant a specific item to the user. This should + only be used for development prototyping, from a trusted server, + or if you don't care about hacked clients granting arbitrary items. + This call can be disabled by a setting on Steamworks. + + + + + Crafting! Uses the passed items to buy the target item. + You need to have set up the appropriate exchange rules in your item + definitions. This assumes all the items passed in aren't stacked. + + + + + Crafting! Uses the passed items to buy the target item. + You need to have set up the appropriate exchange rules in your item + definitions. This assumes all the items passed in aren't stacked. + + + + + Deserializes a result set and verifies the signature bytes. + This call has a potential soft-failure mode where the Result is expired, it will + still succeed in this mode.The "expired" + result could indicate that the data may be out of date - not just due to timed + expiration( one hour ), but also because one of the items in the result set may + have been traded or consumed since the result set was generated.You could compare + the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine + how old the data is. You could simply ignore the "expired" result code and + continue as normal, or you could request the player with expired data to send + an updated result set. + You should call CheckResultSteamID on the result handle when it completes to verify + that a remote player is not pretending to have a different user's inventory. + + + + + Grant all promotional items the user is eligible for. + + + + + Trigger an item drop for this user. This is for timed drops. + + + + + Trigger a promo item drop. You can call this at startup, it won't + give users multiple promo drops. + + + + + Start buying a cart load of items. This will return a positive result is the purchase has + begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success. + + + + + Methods for clients to access matchmaking services, favorites, and to operate on game lobbies + + + + + Maximum number of characters a lobby metadata key can be + + + + + Invoked when the current user is invited to a lobby. + + + + + Invoked when the current user joins a lobby. + + + + + Invoked when the current user creates a lobby. + + + + + Invoked when a game server has been associated with a lobby. + + + + + Invoked when a lobby's metadata is modified. + + + + + Invoked when a member in a lobby's metadata is modified. + + + + + Invoked when a member joins a lobby. + + + + + Invoked when a lobby member leaves the lobby. + + + + + Invoked when a lobby member leaves the lobby. + + + + + Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them. + + + + + Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them. + + + + + Invoked when a chat message is received from a member of the lobby. + + + + + Creates a new invisible lobby. Call to take it online. + + + + + Attempts to directly join the specified lobby. + + + + + Get a list of servers that are on the current user's favorites list. + + + + + Get a list of servers that the current user has added to their history. + + + + + Methods for clients to access matchmaking services, favorites, and to operate on game lobbies + + + + + Functions to control music playback in the steam client. + This gives games the opportunity to do things like pause the music or lower the volume, + when an important cut scene is shown, and start playing afterwards. + Nothing uses Steam Music though so this can probably get fucked + + + + + Invoked when playback status is changed. + + + + + Invoked when the volume of the music player is changed. + + + + + Checks if Steam Music is enabled. + + + + + if a song is currently playing, paused, or queued up to play; otherwise . + + + + + Gets the current status of the Steam Music player + + + + + Plays the music player. + + + + + Pauses the music player. + + + + + Forces the music player to play the previous song. + + + + + Forces the music player to skip to the next song. + + + + + Gets and sets the current volume of the Steam Music player + + + + + Class for utilizing the Steam Network API. + + + + + Invoked when a wants to send the current user a message. You should respond by calling + if you want to recieve their messages. + + + + + Invoked when packets can't get through to the specified user. + All queued packets unsent at this point will be dropped, further attempts + to send will retry making the connection (but will be dropped if we fail again). + + + + + This should be called in response to a . + + + + + Allow or disallow P2P connects to fall back on Steam server relay if direct + connection or NAT traversal can't be established. Applies to connections + created after setting or old connections that need to reconnect. + + + + + This should be called when you're done communicating with a user, as this will + free up all of the resources allocated for the connection under-the-hood. + If the remote user tries to send data to you again, a new + callback will be posted + + + + + Checks if a P2P packet is available to read. + + + + + Checks if a P2P packet is available to read, and gets the size of the message if there is one. + + + + + Reads in a packet that has been sent from another user via SendP2PPacket. + + + + + Reads in a packet that has been sent from another user via SendP2PPacket. + + + + + Reads in a packet that has been sent from another user via SendP2PPacket. + + + + + Sends a P2P packet to the specified user. + This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections. + NOTE: The first packet send may be delayed as the NAT-traversal code runs. + + + + + Sends a P2P packet to the specified user. + This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections. + NOTE: The first packet send may be delayed as the NAT-traversal code runs. + + + + + Get the identity assigned to this interface. + E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned + to the gameserver. Returns false and sets the result to an invalid identity if we don't know + our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID + even if they are not signed into Steam.) + + + + + Creates a "server" socket that listens for clients to connect to by calling + Connect, over ordinary UDP (IPv4 or IPv6) + + To use this derive a class from and override as much as you want. + + + + + + Creates a "server" socket that listens for clients to connect to by calling + Connect, over ordinary UDP (IPv4 or IPv6). + + To use this you should pass a class that inherits . You can use + SocketManager to get connections and send messages, but the ISocketManager class + will received all the appropriate callbacks. + + + + + + Connect to a socket created via CreateListenSocketIP. + + + + + Connect to a socket created via CreateListenSocketIP. + + + + + Creates a server that will be relayed via Valve's network (hiding the IP and improving ping). + + To use this derive a class from and override as much as you want. + + + + + + Creates a server that will be relayed via Valve's network (hiding the IP and improving ping). + + To use this you should pass a class that inherits . You can use + to get connections and send messages, but the class + will received all the appropriate callbacks. + + + + + + Connect to a relay server. + + + + + Connect to a relay server. + + + + + Begin asynchronous process of allocating a fake IPv4 address that other + peers can use to contact us via P2P. IP addresses returned by this + function are globally unique for a given appid. + + For gameservers, you *must* call this after initializing the SDK but before + beginning login. Steam needs to know in advance that FakeIP will be used. + + + + + Return info about the FakeIP and port that we have been assigned, if any. + + + + + + Creates a server that will be relayed via Valve's network (hiding the IP and improving ping). + + To use this derive a class from and override as much as you want. + + + + + + Creates a server that will be relayed via Valve's network (hiding the IP and improving ping). + + To use this you should pass a class that inherits . You can use + to get connections and send messages, but the class + will received all the appropriate callbacks. + + + + + + Provides Steam Networking utilities. + + + + + A function to receive debug network information on. This will do nothing + unless you set to something other than . + + You should set this to an appropriate level instead of setting it to the highest + and then filtering it by hand because a lot of energy is used by creating the strings + and your frame rate will tank and you won't know why. + + + + + The latest available status gathered from the SteamRelayNetworkStatus callback + + + + + If you know that you are going to be using the relay network (for example, + because you anticipate making P2P connections), call this to initialize the + relay network. If you do not call this, the initialization will + be delayed until the first time you use a feature that requires access + to the relay network, which will delay that first access. + + You can also call this to force a retry if the previous attempt has failed. + Performing any action that requires access to the relay network will also + trigger a retry, and so calling this function is never strictly necessary, + but it can be useful to call it a program launch time, if access to the + relay network is anticipated. + + Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t + callbacks to know when initialization has completed. + Typically initialization completes in a few seconds. + + Note: dedicated servers hosted in known data centers do *not* need + to call this, since they do not make routing decisions. However, if + the dedicated server will be using P2P functionality, it will act as + a "client" and this should be called. + + + + + Return location info for the current host. + + It takes a few seconds to initialize access to the relay network. If + you call this very soon after startup the data may not be available yet. + + This always return the most up-to-date information we have available + right now, even if we are in the middle of re-calculating ping times. + + + + + Same as PingLocation.EstimatePingTo, but assumes that one location is the local host. + This is a bit faster, especially if you need to calculate a bunch of + these in a loop to find the fastest one. + + + + + If you need ping information straight away, wait on this. It will return + immediately if you already have up to date ping data. + + + + + [0 - 100] - Randomly discard N pct of packets. + + + + + [0 - 100] - Randomly discard N pct of packets. + + + + + Delay all packets by N ms. + + + + + Delay all packets by N ms. + + + + + Timeout value (in ms) to use when first connecting. + + + + + Timeout value (in ms) to use after connection is established. + + + + + Upper limit of buffered pending bytes to be sent. + If this is reached SendMessage will return LimitExceeded. + Default is 524288 bytes (512k). + + + + + Minimum send rate clamp, 0 is no limit. + This value will control the min allowed sending rate that + bandwidth estimation is allowed to reach. Default is 0 (no-limit) + + + + + Maximum send rate clamp, 0 is no limit. + This value will control the max allowed sending rate that + bandwidth estimation is allowed to reach. Default is 0 (no-limit) + + + + + Nagle time, in microseconds. When SendMessage is called, if + the outgoing message is less than the size of the MTU, it will be + queued for a delay equal to the Nagle timer value. This is to ensure + that if the application sends several small messages rapidly, they are + coalesced into a single packet. + See historical RFC 896. Value is in microseconds. + Default is 5000us (5ms). + + + + + Don't automatically fail IP connections that don't have + strong auth. On clients, this means we will attempt the connection even if + we don't know our identity or can't get a cert. On the server, it means that + we won't automatically reject a connection due to a failure to authenticate. + (You can examine the incoming connection and decide whether to accept it.) + + This is a dev configuration value, and you should not let users modify it in + production. + + + + + Allow unencrypted (and unauthenticated) communication. + 0: Not allowed (the default) + 1: Allowed, but prefer encrypted + 2: Allowed, and preferred + 3: Required. (Fail the connection if the peer requires encryption.) + + This is a dev configuration value, since its purpose is to disable encryption. + You should not let users modify it in production. (But note that it requires + the peer to also modify their value in order for encryption to be disabled.) + + + + + Log RTT calculations for inline pings and replies. + + + + + Log SNP packets send. + + + + + Log each message send/recv. + + + + + Log dropped packets. + + + + + Log P2P rendezvous messages. + + + + + Log ping relays. + + + + + Get Debug Information via event. + + Except when debugging, you should only use + or . For best performance, do NOT + request a high detail level and then filter out messages in the callback. + + This incurs all of the expense of formatting the messages, which are then discarded. + Setting a high priority value (low numeric value) here allows the library to avoid + doing this work. + + + + + So we can remember and provide a Get for DebugLevel. + + + + + We need to keep the delegate around until it's not used anymore. + + + + + This can be called from other threads - so we're going to queue these up and process them in a safe place. + + + + + Called regularly from the Dispatch loop so we can provide a timely + stream of messages. + + + + + Undocumented Parental Settings + + + + + Parental Settings Changed + + + + + + + + + + + + + + + + + + + + + + + This API can be used to selectively advertise your multiplayer game session in a Steam chat room group. + Tell Steam the number of player spots that are available for your party, and a join-game string, and it + will show a beacon in the selected group and allow that many users to “follow” the beacon to your party. + Adjust the number of open slots if other players join through alternate matchmaking methods. + + + + + Invoked when the list of possible Party beacon locations has changed + + + + + Invoked when the list of active beacons may have changed + + + + + Gets the amount of beacons that are active. + + + + + Gets an of active beacons. + + + + + Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware. + + + + + Invoked when a session is connected. + + + + + Invoked when a session becomes disconnected. + + + + + Gets the number of currently connected Steam Remote Play sessions + + + + + Get the currently connected Steam Remote Play session ID at the specified index. + IsValid will return if it's out of bounds + + + + + Invite a friend to Remote Play Together. + This returns if the invite can't be sent + + + + + Class for utilizing the Steam Remote Storage API. + + + + + Creates a new file, writes the bytes to the file, and then closes the file. + If the target file already exists, it is overwritten + + The path of the file. + The bytes of data. + A boolean, detailing whether or not the operation was successful. + + + + Opens a binary file, reads the contents of the file into a byte array, and then closes the file. + + The path of the file. + + + + Checks whether the specified file exists. + + The path of the file. + Whether or not the file exists. + + + + Checks if a specific file is persisted in the steam cloud. + + The path of the file. + Boolean. + + + + Gets the specified file's last modified date/time. + + The path of the file. + A describing when the file was modified last. + + + + Returns the specified files size in bytes, or 0 if the file does not exist. + + The path of the file. + The size of the file in bytes, or 0 if the file doesn't exist. + + + + Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API. + + A boolean, detailing whether or not the operation was successful. + + + + Deletes a file from the local disk, and propagates that delete to the cloud. + + + + + Gets the total number of quota bytes. + + + + + Gets the total number of quota bytes that have been used. + + + + + Number of bytes remaining until the quota is used. + + + + + returns if AND are . + + + + + Checks if the account wide Steam Cloud setting is enabled for this user + or if they disabled it in the Settings->Cloud dialog. + + + + + Checks if the per game Steam Cloud setting is enabled for this user + or if they disabled it in the Game Properties->Update dialog. + + This must only ever be set as the direct result of the user explicitly + requesting that it's enabled or not. This is typically accomplished with + a checkbox within your in-game options + + + + + Gets the total number of local files synchronized by Steam Cloud. + + + + + Gets a list of filenames synchronized by Steam Cloud. + + + + + Class for utilizing the Steam Screenshots API. + + + + + Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey. + This will only be called if is true, in which case Steam + will not take the screenshot itself. + + + + + Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged. + + + + + Invoked when a screenshot attempt failed. + + + + + Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format. + The return value is a handle that is valid for the duration of the game process and can be used to apply tags. + + + + + Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio + as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format. + The return value is a handle that is valid for the duration of the game process and can be used to apply tags. + JPEG, TGA, and PNG formats are supported. + + + + + Causes the Steam overlay to take a screenshot. + If screenshots are being hooked by the game then a + callback is sent back to the game instead. + + + + + Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them. + + Hooking is disabled by default, and only ever enabled if you do so with this function. + If the hooking is enabled, then the callback will be sent if the user presses the hotkey or + when TriggerScreenshot is called, and then the game is expected to call or in response. + + + + + Provides the core of the Steam Game Servers API + + + + + Invoked when aser has been authed or rejected + + + + + Invoked when a connection to the Steam back-end has been established. + This means the server now is logged on and has a working connection to the Steam master server. + + + + + This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying). + + + + + Invoked when the server is disconnected from Steam + + + + + Invoked when authentication status changes, useful for grabbing once availability is current. + + + + + Initialize the steam server. + If is you need to call manually every frame. + + + + + Run the callbacks. This is also called in Async callbacks. + + + + + Sets whether this should be marked as a dedicated server. + If not, it is assumed to be a listen server. + + + + + Gets or sets the current MaxPlayers. + This doesn't enforce any kind of limit, it just updates the master server. + + + + + Gets or sets the current BotCount. + This doesn't enforce any kind of limit, it just updates the master server. + + + + + Gets or sets the current Map Name. + + + + + Gets or sets the current ModDir. + + + + + Gets the current product. + + + + + Gets or sets the current Product. + + + + + Gets or sets the current ServerName. + + + + + Set whether the server should report itself as passworded. + + + + + Gets or sets the current GameTags. This is a comma seperated list of tags for this server. + When querying the server list you can filter by these tags. + + + + + Gets the SteamId of the server. + + + + + Log onto Steam anonymously. + + + + + Log off of Steam. + + + + + Returns true if the server is connected and registered with the Steam master server + You should have called etc on startup. + + + + + To the best of its ability this tries to get the server's + current public IP address. Be aware that this is likely to return + for the first few seconds after initialization. + + + + + Enable or disable heartbeats, which are sent regularly to the master server. + Enabled by default. + + + + + Enable or disable heartbeats, which are sent regularly to the master server. + Enabled by default. + + + + + Force send a heartbeat to the master server instead of waiting + for the next automatic update (if you've left them enabled) + + + + + Update this connected player's information. You should really call this + any time a player's name or score changes. This keeps the information shown + to server queries up to date. + + + + + Sets a Key Value. These can be anything you like, and are accessible + when querying servers from the server list. + + Information describing gamemodes are common here. + + + + + Remove all key values. + + + + + Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnValidateAuthTicketResponse. + + + + + Forget this guy. They're no longer in the game. + + + + + If true, Steam wants to send a packet. You should respond by sending + this packet in an unconnected way to the returned Address and Port. + + Packet to send. The Data passed is pooled - so use it immediately. + True if we want to send a packet + + + + We have received a server query on our game port. Pass it to Steam to handle. + + + + + We have received a server query on our game port. Pass it to Steam to handle. + + + + + Does the user own this app (which could be DLC). + + + + + Downloads stats for the user. + If the user has no stats, this will return . + These stats will only be auto-updated for clients playing on the server. + + The SteamId of the user to get stats for. + A task describing the progress and result of the download. + + + + Set the named stat for this user. Setting stats should follow the rules + you defined in Steamworks. + + The SteamId of the user to set stats for. + The name of the stat. + The value of the stat. + + + + Set the named stat for this user. Setting stats should follow the rules + you defined in Steamworks. + + The SteamId of the user to set stats for. + The name of the stat. + The value of the stat. + + + + Get the named stat for this user. If getting the stat failed, will return + . You should have called for this SteamID - which downloads + the stats from the backend. If you didn't call it this will always return . + + The SteamId of the user to get stats for. + The name of the stat. + The value to return if the stats cannot be received. + + + + Get the named stat for this user. If getting the stat failed, will return + defaultValue. You should have called Refresh for this userid - which downloads + the stats from the backend. If you didn't call it this will always return defaultValue. + + The SteamId of the user to get stats for. + The name of the stat. + The value to return if the stats cannot be received. + + + + Unlocks the specified achievement for the specified user. Must have called on a SteamID first. + Remember to use after use. + + The SteamId of the user to unlock the achievement for. + The ID of the achievement. + + + + Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first. + Remember to use after use. + + The SteamId of the user to clear the achievement for. + The ID of the achievement. + + + + Return if available, exists and unlocked + + + + + Once you've set a stat change on a user you need to commit your changes. + You can do that using this method. The callback will let you know if + your action succeeded, but most of the time you can fire and forget. + + The SteamId of the user to store stats for. + A task describing the progress and result of the commit. + + + + Functions for accessing and manipulating Steam user information. + This is also where the APIs for Steam Voice are exposed. + + + + + Invoked after an item is downloaded. + + + + + Invoked when a new item is subscribed. + + + + + Start downloading this item. You'll get notified of completion via . + + The ID of the file to download. + If this should go straight to the top of the download list. + + if nothing went wrong and the download is started. + + + + Will attempt to download this item asyncronously - allowing you to instantly react to its installation. + + The ID of the file you download. + An optional callback + Allows to send a message to cancel the download anywhere during the process. + How often to call the progress function. + + if downloaded and installed properly. + + + + Utility function to fetch a single item. Internally this uses Ugc.FileQuery - + which you can use to query multiple items if you need to. + + + + + Suspends all workshop downloads. + Downloads will be suspended until you resume them by calling or when the game ends. + + + + + Resumes all workshop downloads. + + + + + Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not. + + + + + Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA. + + + + + Functions for accessing and manipulating Steam user information. + This is also where the APIs for Steam Voice are exposed. + + + + + Invoked when a connections to the Steam back-end has been established. + This means the Steam client now has a working connection to the Steam servers. + Usually this will have occurred before the game has launched, and should only be seen if the + user has dropped connection due to a networking issue or a Steam server update. + + + + + Invoked when a connection attempt has failed. + This will occur periodically if the Steam client is not connected, + and has failed when retrying to establish a connection. + + + + + Invoked when the client has lost connection to the Steam servers. + Real-time services will be disabled until a matching OnSteamServersConnected has been posted. + + + + + Sent by the Steam server to the client telling it to disconnect from the specified game server, + which it may be in the process of or already connected to. + The game client should immediately disconnect upon receiving this message. + This can usually occur if the user doesn't have rights to play on the game server. + + + + + Invoked whenever the users licenses (owned packages) changes. + + + + + Invoked when an auth ticket has been validated. + The first parameter is the of this user + The second is the that owns the game, which will be different from the first + if the game is being borrowed via Steam Family Sharing. + + + + + Used internally for . + + + + + Used internally for . + + + + + Invoked when a user has responded to a microtransaction authorization request. + ( appid, orderid, user authorized ) + + + + + Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a + link in the Steam overlay browser. + You can use this to add support for external site signups where you want to pop back into the browser after some web page + signup sequence, and optionally get back some detail about that. + + + + + Sent for games with enabled anti indulgence / duration control, for enabled users. + Lets the game know whether persistent rewards or XP should be granted at normal rate, + half rate, or zero rate. + + + + + Starts/Stops voice recording. + Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording + when the user has released their push-to-talk hotkey or the game session has completed. + + + + + Returns true if we have voice data waiting to be read. + + + + + Reads the voice data and returns the number of bytes written. + The compressed data can be transmitted by your application and decoded back into raw audio data using + DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly. + This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as + possible. Calling this any less may result in gaps in the returned stream. + + + + + Reads the voice data and returns the bytes. You should obviously ideally be using + ReadVoiceData because it won't be creating a new byte array every call. But this + makes it easier to get it working, so let the babies have their bottle. + + + + + Decodes the compressed voice data returned by GetVoice. + The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000. + + + + + Lazy version + + + + + Advanced and potentially fastest version - incase you know what you're doing + + + + + Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you. + + + + + Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you. + This waits for a positive response from the backend before returning the ticket. This means + the ticket is definitely ready to go as soon as it returns. Will return if the callback + times out or returns negatively. + + + + + Checks if the current users looks like they are behind a NAT device. + This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT. + + + + + Gets the Steam level of the user, as shown on their Steam community profile. + + + + + Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL. + As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page. + NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window. + NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours. + + + + + Checks whether the current user has verified their phone number. + + + + + Checks whether the current user has Steam Guard two factor authentication enabled on their account. + + + + + Checks whether the user's phone number is used to uniquely identify them. + + + + + Checks whether the current user's phone number is awaiting (re)verification. + + + + + Requests an application ticket encrypted with the secret "encrypted app ticket key". + The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app. + There can only be one call pending, and this call is subject to a 60 second rate limit. + If you get a null result from this it's probably because you're calling it too often. + This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/ + + + + + Requests an application ticket encrypted with the secret "encrypted app ticket key". + The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app. + There can only be one call pending, and this call is subject to a 60 second rate limit. + This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/ + + + + + Get anti indulgence / duration control + + + + + Invoked when an achivement icon is loaded. + + + + + Invoked when the latests stats and achievements have been received + from the server. + + + + + Result of a request to store the user stats for a game. + + + + + Result of a request to store the achievements for a game, or an + "indicate progress" call. If both m_nCurProgress and m_nMaxProgress + are zero, that means the achievement has been fully unlocked. + + + + + Callback indicating that a user's stats have been unloaded + + + + + Get all available achievements. + + + + + Show the user a pop-up notification with the current progress toward an achievement. + Will return false if RequestCurrentStats has not completed and successfully returned + its callback, if the achievement doesn't exist/has unpublished changes in the app's + Steamworks Admin page, or if the achievement is unlocked. + + + + + Tries to get the number of players currently playing this game. + Or -1 if failed. + + + + + Send the changed stats and achievements data to the server for permanent storage. + If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful. + This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that. + If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called. + You can find additional debug information written to the %steam_install%\logs\stats_log.txt file. + This function returns true upon success if : + RequestCurrentStats has completed and successfully returned its callback AND + the current game has stats associated with it in the Steamworks Partner backend, and those stats are published. + + + + + Asynchronously request the user's current stats and achievements from the server. + You must always call this first to get the initial status of stats and achievements. + Only after the resulting callback comes back can you start calling the rest of the stats + and achievement functions for the current user. + + + + + Asynchronously fetches global stats data, which is available for stats marked as + "aggregated" in the App Admin panel of the Steamworks website. + You must have called and it needs to return successfully via + its callback prior to calling this. + + How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60. + + indicates success, means you need to call first, means the remote call failed + + + + Gets a leaderboard by name, it will create it if it's not yet created. + Leaderboards created with this function will not automatically show up in the Steam Community. + You must manually set the Community Name field in the App Admin panel of the Steamworks website. + As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on + the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of + dynamically created leaderboards. + + + + + Adds this amount to the named stat. Internally this calls Get() and adds + to that value. Steam doesn't provide a mechanism for atomically increasing + stats like this, this functionality is added here as a convenience. + + + + + Adds this amount to the named stat. Internally this calls Get() and adds + to that value. Steam doesn't provide a mechanism for atomically increasing + stats like this, this functionality is added here as a convenience. + + + + + Set a stat value. This will automatically call after a successful call. + + + + + Set a stat value. This will automatically call after a successful call. + + + + + Get an stat value. + + + + + Get a stat value. + + + + + Practically wipes the slate clean for this user. If is , will also wipe + any achievements too. + + + + + + Interface which provides access to a range of miscellaneous utility functions + + + + + Invoked when the country of the user changed. + + + + + Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute. + The parameter is the number of minutes left. + + + + + Invoked when Steam wants to shutdown. + + + + + Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc. + + + + + Returns the number of seconds since the application was active. + + + + + Returns the number of seconds since the user last moved the mouse and/or provided other input. + + + + + Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time) + + + + + returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database) + e.g "US" or "UK". + + + + + Returns true if the image exists, and the buffer was successfully filled out. + Results are returned in RGBA format. + The destination buffer size should be 4 * height * width * sizeof(char). + + + + + returns the image in RGBA format. + + + + + Returns true if we're using a battery (ie, a laptop not plugged in). + + + + + Returns battery power [0-1]. + + + + + Sets the position where the overlay instance for the currently calling game should show notifications. + This position is per-game and if this function is called from outside of a game context it will do nothing. + + + + + Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to + start and hook the game process, so this function will initially return false while the overlay is loading. + + + + + Normally this call is unneeded if your game has a constantly running frame loop that calls the + D3D Present API, or OGL SwapBuffers API every frame. + + However, if you have a game that only refreshes the screen on an event driven basis then that can break + the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also + need to Present() to the screen any time an even needing a notification happens or when the overlay is + brought up over the game by a user. You can use this API to ask the overlay if it currently need a present + in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you + refresh the screen with Present or SwapBuffers to allow the overlay to do it's work. + + + + + Asynchronous call to check if an executable file has been signed using the public key set on the signing tab + of the partner site, for example to refuse to load modified executable files. + + + + + Activates the Big Picture text input dialog which only supports gamepad input. + + + + + Returns previously entered text. + + + + + Returns the language the steam client is running in. You probably want + instead, this is for very special usage cases. + + + + + Returns if Steam itself is running in VR mode. + + + + + Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition. + + + + + returns if Steam and the Steam Overlay are running in Big Picture mode + Games much be launched through the Steam client to enable the Big Picture overlay. During development, + a game can be added as a non-steam game to the developers library to test this feature. + + + + + Ask Steam UI to create and render its OpenVR dashboard. + + + + + Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming. + + If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed. + If this is set to , then the application window will be streamed instead, and remote input will be allowed. + The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game + (this is useful for games that have asymmetric multiplayer gameplay). + + + + + Gets whether this steam client is a Steam China specific client (), or the global client (). + + + + + Initializes text filtering, loading dictionaries for the language the game is running in. + Users can customize the text filter behavior in their Steam Account preferences. + + + + + Filters the provided input message and places the filtered result into pchOutFilteredText, + using legally required filtering and additional filtering based on the context and user settings. + + + + + Gets whether or not Steam itself is running on the Steam Deck. + + + + + In game launchers that don't have controller support: You can call this to have + Steam Input translate the controller input into mouse/kb to navigate the launcher + + + + + Class for utilizing the Steam Video API. + + + + + Return if currently using Steam's live broadcasting + + + + + Returns the number of viewers that are watching the stream, or 0 if is . + + + + + Represents the ID of a Steam application. + + + + + Is the clan an official game group? + + + + + Asynchronously fetches the officer list for a given clan + + Whether the request was successful or not + + + + Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive') + This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in + our state loops, instead of trying to place it in all of your state transitions. + + + + + Returns the current state of the supplied digital game action + + + + + Returns the current state of these supplied analog game action + + + + + Returns true if this is the local user + + + + + Return true if this is a friend + + + + + Returns true if you have this user blocked + + + + + Return true if this user is playing the game we're running + + + + + Returns true if this friend is online + + + + + Sometimes we don't know the user's name. This will wait until we have + downloaded the information on this user. + + + + + Returns true if this friend is marked as away + + + + + Returns true if this friend is marked as busy + + + + + Returns true if this friend is marked as snoozing + + + + + Invite this friend to the game that we are playing + + + + + Sends a message to a Steam friend. Returns true if success + + + + + Tries to get download the latest user stats + + True if successful, False if failure + + + + Gets a user stat. Must call RequestUserStats first. + + The name of the stat you want to get + Will return this value if not available + The value, or defult if not available + + + + Gets a user stat. Must call RequestUserStats first. + + The name of the stat you want to get + Will return this value if not available + The value, or defult if not available + + + + Gets a user achievement state. Must call RequestUserStats first. + + The name of the achievement you want to get + Will return this value if not available + The value, or defult if not available + + + + Gets a the time this achievement was unlocked. + + The name of the achievement you want to get + The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue + + + + Shortcut to call GetProperty( "name" ) + + + + + Shortcut to call GetProperty( "description" ) + + + + + Shortcut to call GetProperty( "icon_url" ) + + + + + Shortcut to call GetProperty( "icon_url_large" ) + + + + + Shortcut to call GetProperty( "price_category" ) + + + + + Shortcut to call GetProperty( "type" ) + + + + + Returns true if this is an item that generates an item, rather + than something that is actual an item + + + + + Shortcut to call GetProperty( "exchange" ) + + + + + Get a list of exchanges that are available to make this item + + + + + Shortcut to call GetBoolProperty( "marketable" ) + + + + + Shortcut to call GetBoolProperty( "tradable" ) + + + + + Gets the property timestamp + + + + + Gets the property modified + + + + + Get a specific property by name + + + + + Read a raw property from the definition schema + + + + + Read a raw property from the definition schema + + + + + Gets a list of all properties on this item + + + + + Returns the price of this item in the local currency (SteamInventory.Currency) + + + + + If the price has been discounted, LocalPrice will differ from LocalBasePrice + (assumed, this isn't documented) + + + + + Return a list of recepies that contain this item + + + + + Only available if the result set was created with the getproperties + + + + + This item is account-locked and cannot be traded or given away. + This is an item status flag which is permanently attached to specific item instances + + + + + The item has been destroyed, traded away, expired, or otherwise invalidated. + This is an action confirmation flag which is only set one time, as part of a result set. + + + + + The item quantity has been decreased by 1 via ConsumeItem API. + This is an action confirmation flag which is only set one time, as part of a result set. + + + + + Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed. + Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all, + a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully + blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items". + + + + + Split stack into two items + + + + + Add x units of the target item to this item + + + + + Will try to return the date that this item was aquired. You need to have for the items + with their properties for this to work. + + + + + Tries to get the origin property. Need properties for this to work. + Will return a string like "market" + + + + + Small utility class to describe an item with a quantity + + + + + A structured description of an item exchange + + + + + The definition ID of the ingredient. + + + + + If we don't know about this item definition this might be null. + In which case, DefinitionId should still hold the correct id. + + + + + The amount of this item needed. Generally this will be 1. + + + + + The item that this will create. + + + + + The items, with quantity required to create this item. + + + + + Checks whether an inventory result handle belongs to the specified Steam ID. + This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory + + + + + Serialized result sets contain a short signature which can't be forged or replayed across different game sessions. + A result set can be serialized on the local client, transmitted to other players via your game networking, and + deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing + rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized + result depends on the number items which are being serialized.When securely transmitting items to other players, + it is recommended to use GetItemsByID first to create a minimal result set. + Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult + for expiration handling. + + + + + Gets the owner of the beacon. + + + + + Gets metadata related to the beacon. + + + + + Will attempt to join the party. If successful will return a connection string. + If failed, will return + + + + When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback. + When that user joins your party, call this method to notify Steam that the user has joined successfully. + + + + + To cancel a reservation (due to timeout or user input), call this. + Steam will open a new reservation slot. + Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party. + + + + + Turn off the beacon. + + + + + Used to set up the server. + The variables in here are all required to be set, and can't be changed once the server is created. + + + + + The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date. + If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is + less than that latest version then your server won't show. + + + + + This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod". + + + + + The game description. Setting this to the full name of your game is recommended. + + + + + Is a dedicated server + + + + + If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use + "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master + server updater. + + More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket + + + + + Represents the ID of a user or steam lobby. + + + + + Create a Normal Workshop item that can be subscribed to + + + + + Create a Collection + Add items using Item.AddDependency() + + + + + Workshop item that is meant to be voted on for the purpose of selling in-game + + + + + Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser. + + + + + Adds a key-value tag pair to an item. + Keys can map to multiple different values (1-to-many relationship). + Key names are restricted to alpha-numeric characters and the '_' character. + Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only. + To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag. + + + + + Removes a key and all values associated to it. + You can remove up to 100 keys per item update. + If you need remove more tags than that you'll need to make subsequent item updates. + + + + + https://partner.steamgames.com/doc/features/workshop/implementation#Legal + + + + + The actual ID of this file + + + + + The given title of this item + + + + + The description of this item, in your local language if available + + + + + A list of tags for this item, all lowercase + + + + + A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true) + + + + + App Id of the app that created this item + + + + + App Id of the app that will consume this item. + + + + + User who created this content + + + + + The bayesian average for up votes / total votes, between [0,1] + + + + + Time when the published item was created + + + + + Time when the published item was last updated + + + + + The item's visibility, i.e. public, friends-only, unlisted or private + + + + + True if this item has been banned + + + + + Whether the developer of this app has specifically flagged this item as accepted in the Workshop + + + + + The number of upvotes of this item + + + + + The number of downvotes of this item + + + + + Dependencies/children of this item or collection, available only from WithDependencies(true) queries + + + + + Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries + + + + + If we're downloading, how big the total download is + + + + + If we're downloading, how much we've downloaded + + + + + If we're installed, how big is the install + + + + + If installed, the time and date of installation + + + + + File size as returned by Steamworks, + no download/install required + + + + + If we're downloading our current progress as a delta betwen 0-1 + + + + + A case insensitive check for tag + + + + + Allows the user to subscribe to this item + + + + + Allows the user to subscribe to download this item asyncronously + If CancellationToken is default then there is 60 seconds timeout + Progress will be set to 0-1 + + + + + Allows the user to unsubscribe from this item + + + + + Adds item to user favorite list + + + + + Removes item from user favorite list + + + + + Allows the user to rate a workshop item up or down. + + + + + Gets the current users vote on the item + + + + + Return a URL to view this item online + + + + + The URl to view this item's changelog + + + + + The URL to view the comments on this item + + + + + The URL to discuss this item + + + + + The URL to view this items stats online + + + + + The URL to the preview image for this item + + + + + The metadata string for this item, only available from queries WithMetadata(true) + + + + + Edit this item + + + + + Found items must have at least one of the defined tags + + + + + Found items must have all defined tags + + + + + Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod + + + + + Returns the current Unix Epoch + + + + + Convert an epoch to a datetime + + + + + Convert a DateTime to a unix time + + + + + Returns a buffer. This will get returned and reused later on. + We shouldn't really be using this anymore. + + + + + Prevent unity from stripping shit we depend on + https://docs.unity3d.com/Manual/ManagedCodeStripping.html + + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Farseer.NetStandard.dll b/Lua For Barotrauma/Binary/Farseer.NetStandard.dll new file mode 100644 index 0000000..14e0de4 Binary files /dev/null and b/Lua For Barotrauma/Binary/Farseer.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/Farseer.NetStandard.pdb b/Lua For Barotrauma/Binary/Farseer.NetStandard.pdb new file mode 100644 index 0000000..b568a2f Binary files /dev/null and b/Lua For Barotrauma/Binary/Farseer.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.deps.json b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.deps.json new file mode 100644 index 0000000..ee493f4 --- /dev/null +++ b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.deps.json @@ -0,0 +1,75 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.1/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.1": {}, + ".NETStandard,Version=v2.1/win-x64": { + "GameAnalytics.NetStandard/1.0.0": { + "dependencies": { + "NLog": "5.0.4", + "System.Data.SQLite": "1.0.111" + }, + "runtime": { + "GameAnalytics.NetStandard.dll": {} + } + }, + "NLog/5.0.4": { + "runtime": { + "lib/netstandard2.0/NLog.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.4.1331" + } + } + }, + "System.Data.SQLite/1.0.111": { + "dependencies": { + "System.Data.SQLite.Core": "1.0.111" + } + }, + "System.Data.SQLite.Core/1.0.111": { + "runtime": { + "lib/netstandard2.0/System.Data.SQLite.dll": { + "assemblyVersion": "1.0.111.0", + "fileVersion": "1.0.111.0" + } + }, + "native": { + "runtimes/win-x64/native/netstandard2.0/SQLite.Interop.dll": { + "fileVersion": "1.0.111.0" + } + } + } + } + }, + "libraries": { + "GameAnalytics.NetStandard/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "NLog/5.0.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hMyC7jq1m7c339DZXTRz96b+0YsIYSwAUB8sAWMtqXd2uwJjYe+y1k74fbItODPqDuE/krd6A4mxew9gLMS+PQ==", + "path": "nlog/5.0.4", + "hashPath": "nlog.5.0.4.nupkg.sha512" + }, + "System.Data.SQLite/1.0.111": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G6oK5KkT3gHfelwJ9MvBZc9mrO1x1gkpjNfPs1YBWGIQB5reJSmu5lraYC24VRRQpNBH7RIZqPQjqeBGr7CrNw==", + "path": "system.data.sqlite/1.0.111", + "hashPath": "system.data.sqlite.1.0.111.nupkg.sha512" + }, + "System.Data.SQLite.Core/1.0.111": { + "type": "package", + "serviceable": true, + "sha512": "sha512-D7Qo3JWUB6epymTVRNaAXt+Y+eh0juGjXb5q8SEp/LBdKJr6a224Mk0HCOemRsXfPIF8ULblPyCbVixUvfbpiw==", + "path": "system.data.sqlite.core/1.0.111", + "hashPath": "system.data.sqlite.core.1.0.111.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.dll b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.dll new file mode 100644 index 0000000..114ce93 Binary files /dev/null and b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.pdb b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.pdb new file mode 100644 index 0000000..98a5bbd Binary files /dev/null and b/Lua For Barotrauma/Binary/GameAnalytics.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.dll b/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.dll new file mode 100644 index 0000000..d739f7f Binary files /dev/null and b/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.pdb b/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.pdb new file mode 100644 index 0000000..e85f921 Binary files /dev/null and b/Lua For Barotrauma/Binary/Hyper.ComponentModel.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/Icon.ico b/Lua For Barotrauma/Binary/Icon.ico new file mode 100644 index 0000000..1c7b910 Binary files /dev/null and b/Lua For Barotrauma/Binary/Icon.ico differ diff --git a/Lua For Barotrauma/Binary/Lidgren.NetStandard.dll b/Lua For Barotrauma/Binary/Lidgren.NetStandard.dll new file mode 100644 index 0000000..39ed00a Binary files /dev/null and b/Lua For Barotrauma/Binary/Lidgren.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/Lidgren.NetStandard.pdb b/Lua For Barotrauma/Binary/Lidgren.NetStandard.pdb new file mode 100644 index 0000000..7318ecc Binary files /dev/null and b/Lua For Barotrauma/Binary/Lidgren.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/Lua/CompatibilityLib.lua b/Lua For Barotrauma/Binary/Lua/CompatibilityLib.lua new file mode 100644 index 0000000..524818c --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/CompatibilityLib.lua @@ -0,0 +1,97 @@ +-- Contains things to be removed later, they exist only for compatibility reasons. + +local compatibilityLib = {} + +local networking = LuaUserData.RegisterType("Barotrauma.LuaCsNetworking") + +LuaUserData.AddMethod(networking, "RequestGetHTTP", Networking.HttpGet) + +LuaUserData.AddMethod(networking, "RequestPostHTTP", Networking.HttpPost) + +compatibilityLib.CreateVector2 = Vector2.__new +compatibilityLib.CreateVector3 = Vector3.__new +compatibilityLib.CreateVector4 = Vector4.__new + +local luaRandom = {} + +luaRandom.Range = function (min, max) + return math.random(min, max - 1) +end + +luaRandom.RangeFloat = function (min, max) + return math.random() + math.random(min, max) +end + +compatibilityLib["Random"] = luaRandom + +local luaPlayer = {} + +luaPlayer.GetAllCharacters = function () + return Character.CharacterList +end + +luaPlayer.GetAllClients = function () + return Client.ClientList +end + +luaPlayer.SetClientCharacter = function (client, character) + client.SetClientCharacter(character) +end + +luaPlayer.SetCharacterTeam = function (character, team) + character.TeamID = team +end + +luaPlayer.SetClientTeam = function (client, team) + client.TeamID = team +end + +luaPlayer.Kick = function (client, reason) + client.Kick(reason) +end + +luaPlayer.Ban = function (client, reason, range, seconds) + client.Ban(reason, range, seconds) +end + +luaPlayer.UnbanPlayer = function (player, endpoint) + Client.Unban(player, endpoint) +end + +luaPlayer.SetSpectatorPos = function () + +end + +luaPlayer.SetRadioRange = function (character, range) + if (character.Inventory == nil) then return end + + for item in character.Inventory.AllItems do + if item ~= nil and item.Prefab.Identifier == "headset" then + item.GetComponentString("WifiComponent").Range = range; + end + end +end + +luaPlayer.CheckPermission = function (client, permissions) + return client.CheckPermission(permissions) +end + +compatibilityLib["Player"] = luaPlayer + +Hook.Add("character.created", "compatibility.character.created", function (character) + Hook.Call("characterCreated", character) +end) + +Hook.Add("character.death", "compatibility.character.death", function (character, causeOfDeathAffliction) + Hook.Call("characterDeath", character, causeOfDeathAffliction) +end) + +Hook.Add("client.connected", "compatibility.client.connected", function (client) + Hook.Call("clientConnected", client) +end) + +Hook.Add("client.disconnected", "compatibility.client.disconnected", function (client) + Hook.Call("clientDisconnected", client) +end) + +return compatibilityLib \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultHook.lua b/Lua For Barotrauma/Binary/Lua/DefaultHook.lua new file mode 100644 index 0000000..520e884 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultHook.lua @@ -0,0 +1,68 @@ +Hook.Patch("Barotrauma.Item", "TryInteract", +{ + "Barotrauma.Character", + "System.Boolean", + "System.Boolean", + "System.Boolean" +}, +function(instance, p) + if Hook.Call("item.interact", instance, p["user"], p["ignoreRequiredItems"], p["forceSelectKey"], p["forceUseKey"]) == true then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) + +Hook.Patch("Barotrauma.Item", "ApplyTreatment", +{ + "Barotrauma.Character", + "Barotrauma.Character", + "Barotrauma.Limb" +}, +function(instance, p) + if Hook.Call("item.applyTreatment", instance, p["user"], p["character"], p["targetLimb"]) then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) + +Hook.Patch("Barotrauma.Item", "Combine", +{ + "Barotrauma.Item", + "Barotrauma.Character" +}, +function(instance, p) + if Hook.Call("item.combine", instance, p["item"], p["user"]) == true then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) + +Hook.Patch("Barotrauma.Item", "Drop", +function(instance, p) + if Hook.Call("item.drop", instance, p["dropper"]) == true then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) + +Hook.Patch("Barotrauma.Item", "Equip", +{ + "Barotrauma.Character" +}, +function(instance, p) + if Hook.Call("item.equip", instance, p["character"]) == true then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) + +Hook.Patch("Barotrauma.Item", "Unequip", +{ + "Barotrauma.Character" +}, +function(instance, p) + if Hook.Call("item.unequip", instance, p["character"]) == true then + p.PreventExecution = true + return false + end +end, Hook.HookMethodType.Before) \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/LibClient.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibClient.lua new file mode 100644 index 0000000..eb94d18 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibClient.lua @@ -0,0 +1,91 @@ +local defaultLib = {} + +local CreateStatic = LuaSetup.LuaUserData.CreateStatic +local CreateEnum = LuaSetup.LuaUserData.CreateEnumTable +local AddCallMetaTable = LuaSetup.LuaUserData.AddCallMetaTable + +local localizedStrings = { + "LocalizedString", "LimitLString", "WrappedLString", "AddedPunctuationLString", "CapitalizeLString", "ConcatLString", "FallbackLString", "FormattedLString", "InputTypeLString", "JoinLString", "LowerLString", "RawLString", "ReplaceLString", "ServerMsgLString", "SplitLString", "TagLString", "TrimLString", "UpperLString", "StripRichTagsLString", +} + +for key, value in pairs(localizedStrings) do + defaultLib[value] = CreateStatic("Barotrauma." .. value, true) +end + +local sounds = {} +sounds.LowpassFilter = CreateStatic("Barotrauma.Sounds.LowpassFilter") +sounds.HighpassFilter = CreateStatic("Barotrauma.Sounds.HighpassFilter") +sounds.BandpassFilter = CreateStatic("Barotrauma.Sounds.BandpassFilter") +sounds.NotchFilter = CreateStatic("Barotrauma.Sounds.NotchFilter") +sounds.LowShelfFilter = CreateStatic("Barotrauma.Sounds.LowShelfFilter") +sounds.HighShelfFilter = CreateStatic("Barotrauma.Sounds.HighShelfFilter") +sounds.PeakFilter = CreateStatic("Barotrauma.Sounds.PeakFilter") +defaultLib["Sounds"] = sounds + +defaultLib["SpriteEffects"] = CreateStatic("Microsoft.Xna.Framework.Graphics.SpriteEffects") + +defaultLib["SoundPlayer"] = CreateStatic("Barotrauma.SoundPlayer") +defaultLib["SoundPrefab"] = CreateStatic("Barotrauma.SoundPrefab", true) +defaultLib["BackgroundMusic"] = CreateStatic("Barotrauma.BackgroundMusic", true) +defaultLib["GUISound"] = CreateStatic("Barotrauma.GUISound", true) +defaultLib["DamageSound"] = CreateStatic("Barotrauma.DamageSound", true) +defaultLib["WaterRenderer"] = CreateStatic("Barotrauma.WaterRenderer", true) + +defaultLib["TextureLoader"] = CreateStatic("Barotrauma.TextureLoader") +defaultLib["Sprite"] = CreateStatic("Barotrauma.Sprite", true) +defaultLib["PlayerInput"] = CreateStatic("Barotrauma.PlayerInput", true) + +defaultLib["Keys"] = CreateStatic("Microsoft.Xna.Framework.Input.Keys", true) + +defaultLib["GUI"] = { + GUI = CreateStatic("Barotrauma.GUI", true), + Style = CreateStatic("Barotrauma.GUIStyle", true), + Component = CreateStatic("Barotrauma.GUIComponent"), + RectTransform = CreateStatic("Barotrauma.RectTransform", true), + LayoutGroup = CreateStatic("Barotrauma.GUILayoutGroup", true), + Button = CreateStatic("Barotrauma.GUIButton", true), + TextBox = CreateStatic("Barotrauma.GUITextBox", true), + Canvas = CreateStatic("Barotrauma.GUICanvas", true), + Frame = CreateStatic("Barotrauma.GUIFrame", true), + TextBlock = CreateStatic("Barotrauma.GUITextBlock", true), + TickBox = CreateStatic("Barotrauma.GUITickBox", true), + Image = CreateStatic("Barotrauma.GUIImage", true), + ListBox = CreateStatic("Barotrauma.GUIListBox", true), + ScrollBar = CreateStatic("Barotrauma.GUIScrollBar", true), + DropDown = CreateStatic("Barotrauma.GUIDropDown", true), + NumberInput = CreateStatic("Barotrauma.GUINumberInput", true), + MessageBox = CreateStatic("Barotrauma.GUIMessageBox", true), + ColorPicker = CreateStatic("Barotrauma.GUIColorPicker", true), + ProgressBar = CreateStatic("Barotrauma.GUIProgressBar", true), + CustomComponent = CreateStatic("Barotrauma.GUICustomComponent", true), + ScissorComponent = CreateStatic("Barotrauma.GUIScissorComponent", true), + VideoPlayer = CreateStatic("Barotrauma.VideoPlayer", true), + Graph = CreateStatic("Barotrauma.Graph", true), + SerializableEntityEditor = CreateStatic("Barotrauma.SerializableEntityEditor", true), + SlideshowPlayer = CreateStatic("Barotrauma.SlideshowPlayer", true), + CreditsPlayer = CreateStatic("Barotrauma.CreditsPlayer", true), + DragHandle = CreateStatic("Barotrauma.GUIDragHandle", true), + ContextMenu = CreateStatic("Barotrauma.GUIContextMenu", true), + ContextMenuOption = CreateStatic("Barotrauma.ContextMenuOption", true), + + Screen = CreateStatic("Barotrauma.Screen"), + + Anchor = CreateStatic("Barotrauma.Anchor"), + Alignment = CreateStatic("Barotrauma.Alignment"), + Pivot = CreateStatic("Barotrauma.Pivot"), + SoundType = CreateEnum("Barotrauma.GUISoundType"), + CursorState = CreateEnum("Barotrauma.CursorState"), + + GUIStyle = CreateStatic("Barotrauma.GUIStyle", true), +} + +setmetatable(defaultLib["GUI"], { + __index = function (table, key) + return defaultLib["GUI"].GUI[key] + end +}) + +AddCallMetaTable(defaultLib["GUI"].VideoPlayer.VideoSettings) +AddCallMetaTable(defaultLib["GUI"].VideoPlayer.TextSettings) + +return defaultLib \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/LibServer.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibServer.lua new file mode 100644 index 0000000..68bfe97 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibServer.lua @@ -0,0 +1,14 @@ +local defaultLib = {} + +local CreateStatic = LuaSetup.LuaUserData.CreateStatic +local CreateEnum = LuaSetup.LuaUserData.CreateEnumTable + +local localizedStrings = { + "LocalizedString", "AddedPunctuationLString", "CapitalizeLString", "ConcatLString", "FallbackLString", "FormattedLString", "InputTypeLString", "JoinLString", "LowerLString", "RawLString", "ReplaceLString", "ServerMsgLString", "SplitLString", "TagLString", "TrimLString", "UpperLString", "StripRichTagsLString", +} + +for key, value in pairs(localizedStrings) do + defaultLib[value] = CreateStatic("Barotrauma." .. value, true) +end + +return defaultLib \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/LibShared.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibShared.lua new file mode 100644 index 0000000..7f05365 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/LibShared.lua @@ -0,0 +1,194 @@ +local defaultLib = {} + +local AddCallMetaTable = LuaSetup.LuaUserData.AddCallMetaTable +local CreateStatic = LuaSetup.LuaUserData.CreateStatic +local CreateEnum = LuaSetup.LuaUserData.CreateEnumTable + +defaultLib["SByte"] = CreateStatic("Barotrauma.LuaSByte", true) +defaultLib["Byte"] = CreateStatic("Barotrauma.LuaByte", true) +defaultLib["Int16"] = CreateStatic("Barotrauma.LuaInt16", true) +defaultLib["UInt16"] = CreateStatic("Barotrauma.LuaUInt16", true) +defaultLib["Int32"] = CreateStatic("Barotrauma.LuaInt32", true) +defaultLib["UInt32"] = CreateStatic("Barotrauma.LuaUInt32", true) +defaultLib["Int64"] = CreateStatic("Barotrauma.LuaInt64", true) +defaultLib["UInt64"] = CreateStatic("Barotrauma.LuaUInt64", true) +defaultLib["Single"] = CreateStatic("Barotrauma.LuaSingle", true) +defaultLib["Double"] = CreateStatic("Barotrauma.LuaDouble", true) + +-- Backward compatibility +defaultLib["Float"] = CreateStatic("Barotrauma.LuaSingle", true) +defaultLib["Short"] = CreateStatic("Barotrauma.LuaInt16", true) +defaultLib["UShort"] = CreateStatic("Barotrauma.LuaUInt16", true) + +defaultLib["SpawnType"] = CreateEnum("Barotrauma.SpawnType") +defaultLib["ChatMessageType"] = CreateEnum("Barotrauma.Networking.ChatMessageType") +defaultLib["ServerLog_MessageType"] = CreateEnum("Barotrauma.Networking.ServerLog+MessageType") +defaultLib["ServerLogMessageType"] = CreateEnum("Barotrauma.Networking.ServerLog+MessageType") +defaultLib["PositionType"] = CreateEnum("Barotrauma.Level+PositionType") +defaultLib["InvSlotType"] = CreateEnum("Barotrauma.InvSlotType") +defaultLib["LimbType"] = CreateEnum("Barotrauma.LimbType") +defaultLib["ActionType"] = CreateEnum("Barotrauma.ActionType") +defaultLib["AbilityEffectType"] = CreateEnum("Barotrauma.AbilityEffectType") +defaultLib["StatTypes"] = CreateEnum("Barotrauma.StatTypes") +defaultLib["AbilityFlags"] = CreateEnum("Barotrauma.AbilityFlags") +defaultLib["DeliveryMethod"] = CreateEnum("Barotrauma.Networking.DeliveryMethod") +defaultLib["ClientPacketHeader"] = CreateEnum("Barotrauma.Networking.ClientPacketHeader") +defaultLib["ServerPacketHeader"] = CreateEnum("Barotrauma.Networking.ServerPacketHeader") +defaultLib["RandSync"] = CreateEnum("Barotrauma.Rand+RandSync") +defaultLib["DisconnectReason"] = CreateEnum("Barotrauma.Networking.DisconnectReason") +defaultLib["CombatMode"] = CreateEnum("Barotrauma.AIObjectiveCombat+CombatMode") +defaultLib["CauseOfDeathType"] = CreateEnum("Barotrauma.CauseOfDeathType") +defaultLib["CharacterTeamType"] = CreateEnum("Barotrauma.CharacterTeamType") +defaultLib["ClientPermissions"] = CreateEnum("Barotrauma.Networking.ClientPermissions") +defaultLib["OrderCategory"] = CreateEnum("Barotrauma.OrderCategory") +defaultLib["WearableType"] = CreateEnum("Barotrauma.WearableType") +defaultLib["NumberType"] = CreateEnum("Barotrauma.NumberType") +defaultLib["ChatMode"] = CreateEnum("Barotrauma.ChatMode") +defaultLib["CharacterType"] = CreateEnum("Barotrauma.CharacterType") +defaultLib["VoteType"] = CreateEnum("Barotrauma.Networking.VoteType") +defaultLib["CanEnterSubmarine"] = CreateEnum("Barotrauma.CanEnterSubmarine") +defaultLib["InputType"] = CreateStatic("Barotrauma.InputType") + +defaultLib["EventPrefab"] = CreateStatic("Barotrauma.EventPrefab", true) +defaultLib["TraitorEventPrefab"] = CreateStatic("Barotrauma.TraitorEventPrefab", true) +defaultLib["TraitorEvent"] = CreateStatic("Barotrauma.TraitorEvent", true) +defaultLib["EventSet"] = CreateStatic("Barotrauma.EventSet", true) +defaultLib["EventManagerSettings"] = CreateStatic("Barotrauma.EventManagerSettings", true) + +defaultLib["NetConfig"] = CreateStatic("Barotrauma.Networking.NetConfig") +defaultLib["NetworkConnection"] = CreateStatic("Barotrauma.Networking.NetworkConnection") +defaultLib["Inventory"] = CreateStatic("Barotrauma.Inventory", true) +defaultLib["CharacterInventory"] = CreateStatic("Barotrauma.CharacterInventory", true) +defaultLib["ItemInventory"] = CreateStatic("Barotrauma.ItemInventory", true) +defaultLib["ContentPackageManager"] = CreateStatic("Barotrauma.ContentPackageManager") +defaultLib["GameSettings"] = CreateStatic("Barotrauma.GameSettings") +defaultLib["RichString"] = CreateStatic("Barotrauma.RichString", true) +defaultLib["Identifier"] = CreateStatic("Barotrauma.Identifier", true) +defaultLib["LanguageIdentifier"] = CreateStatic("Barotrauma.LanguageIdentifier", true) +defaultLib["ContentPackage"] = CreateStatic("Barotrauma.ContentPackage", true) +defaultLib["WayPoint"] = CreateStatic("Barotrauma.WayPoint", true) +defaultLib["Submarine"] = CreateStatic("Barotrauma.Submarine", true) +defaultLib["Client"] = CreateStatic("Barotrauma.Networking.Client", true) +defaultLib["Character"] = CreateStatic("Barotrauma.Character") +defaultLib["CharacterHealth"] = CreateStatic("Barotrauma.CharacterHealth", true) +defaultLib["CharacterPrefab"] = CreateStatic("Barotrauma.CharacterPrefab", true) +defaultLib["CharacterInfo"] = CreateStatic("Barotrauma.CharacterInfo", true) +AddCallMetaTable(defaultLib["CharacterInfo"].HeadPreset) +AddCallMetaTable(defaultLib["CharacterInfo"].HeadInfo) +defaultLib["CharacterInfoPrefab"] = CreateStatic("Barotrauma.CharacterInfoPrefab") +defaultLib["Item"] = CreateStatic("Barotrauma.Item", true) +AddCallMetaTable(defaultLib["Item"].ChangePropertyEventData) +defaultLib["MapEntityPrefab"] = CreateStatic("Barotrauma.MapEntityPrefab") +defaultLib["ItemPrefab"] = CreateStatic("Barotrauma.ItemPrefab", true) +defaultLib["TalentTree"] = CreateStatic("Barotrauma.TalentTree", true) +defaultLib["TalentPrefab"] = CreateStatic("Barotrauma.TalentPrefab", true) +defaultLib["FactionPrefab"] = CreateStatic("Barotrauma.FactionPrefab", true) +defaultLib["MissionPrefab"] = CreateStatic("Barotrauma.MissionPrefab", true) +defaultLib["Mission"] = CreateStatic("Barotrauma.Mission", true) +defaultLib["Level"] = CreateStatic("Barotrauma.Level") +defaultLib["LevelGenerationParams"] = CreateStatic("Barotrauma.LevelGenerationParams", true) +defaultLib["OutpostGenerationParams"] = CreateStatic("Barotrauma.OutpostGenerationParams", true) +defaultLib["RuinGenerationParams"] = CreateStatic("Barotrauma.RuinGeneration.RuinGenerationParams", true) +defaultLib["Job"] = CreateStatic("Barotrauma.Job", true) +defaultLib["JobPrefab"] = CreateStatic("Barotrauma.JobPrefab", true) +defaultLib["JobVariant"] = CreateStatic("Barotrauma.JobVariant", true) +defaultLib["AfflictionPrefab"] = CreateStatic("Barotrauma.AfflictionPrefab", true) +defaultLib["SkillSettings"] = CreateStatic("Barotrauma.SkillSettings", true) +defaultLib["ChatMessage"] = CreateStatic("Barotrauma.Networking.ChatMessage") +defaultLib["Structure"] = CreateStatic("Barotrauma.Structure", true) +defaultLib["Hull"] = CreateStatic("Barotrauma.Hull", true) +defaultLib["Gap"] = CreateStatic("Barotrauma.Gap", true) +defaultLib["Signal"] = CreateStatic("Barotrauma.Items.Components.Signal", true) +defaultLib["SubmarineInfo"] = CreateStatic("Barotrauma.SubmarineInfo", true) +defaultLib["Entity"] = CreateStatic("Barotrauma.Entity", true) +defaultLib["MapEntity"] = CreateStatic("Barotrauma.MapEntity", true) +defaultLib["Physics"] = CreateStatic("Barotrauma.Physics") +defaultLib["FireSource"] = CreateStatic("Barotrauma.FireSource", true) +defaultLib["TextManager"] = CreateStatic("Barotrauma.TextManager") +defaultLib["NetEntityEvent"] = CreateStatic("Barotrauma.Networking.NetEntityEvent") +defaultLib["Screen"] = CreateStatic("Barotrauma.Screen") +defaultLib["AttackResult"] = CreateStatic("Barotrauma.AttackResult", true) +defaultLib["TempClient"] = CreateStatic("Barotrauma.Networking.TempClient", true) +defaultLib["DecalManager"] = CreateStatic("Barotrauma.DecalManager", true) +defaultLib["AutoItemPlacer"] = CreateStatic("Barotrauma.AutoItemPlacer") +defaultLib["PropertyConditional"] = CreateStatic("Barotrauma.PropertyConditional", true) +defaultLib["StatusEffect"] = CreateStatic("Barotrauma.StatusEffect", true) +defaultLib["OutpostGenerator"] = CreateStatic("Barotrauma.OutpostGenerator") +defaultLib["DamageModifier"] = CreateStatic("Barotrauma.DamageModifier", true) +defaultLib["TraitorManager"] = CreateStatic("Barotrauma.TraitorManager", true) +AddCallMetaTable(defaultLib["TraitorManager"].TraitorResults) + +defaultLib["Md5Hash"] = CreateStatic("Barotrauma.Md5Hash", true) +defaultLib["ContentXElement"] = CreateStatic("Barotrauma.ContentXElement", true) +defaultLib["ContentPath"] = CreateStatic("Barotrauma.ContentPath", true) +defaultLib["XElement"] = CreateStatic("System.Xml.Linq.XElement", true) +defaultLib["XName"] = CreateStatic("System.Xml.Linq.XName", true) +defaultLib["XAttribute"] = CreateStatic("System.Xml.Linq.XAttribute", true) +defaultLib["XContainer"] = CreateStatic("System.Xml.Linq.XContainer", true) +defaultLib["XDocument"] = CreateStatic("System.Xml.Linq.XDocument", true) +defaultLib["XNode"] = CreateStatic("System.Xml.Linq.XNode", true) +defaultLib["SoundsFile"] = CreateStatic("Barotrauma.SoundsFile", true) + +defaultLib["Voting"] = CreateStatic("Barotrauma.Voting") +defaultLib["TimeSpan"] = CreateStatic("System.TimeSpan") +defaultLib["IPAddress"] = CreateStatic("System.Net.IPAddress") +defaultLib["ContentPackageId"] = CreateStatic("Barotrauma.ContentPackageId") +defaultLib["Address"] = CreateStatic("Barotrauma.Networking.Address") +defaultLib["AccountId"] = CreateStatic("Barotrauma.Networking.AccountId") +defaultLib["Endpoint"] = CreateStatic("Barotrauma.Networking.Endpoint") + +defaultLib["Explosion"] = CreateStatic("Barotrauma.Explosion", true) + +defaultLib["ConvertUnits"] = CreateStatic("FarseerPhysics.ConvertUnits") +defaultLib["ToolBox"] = CreateStatic("Barotrauma.ToolBox") + +defaultLib["AIObjective"] = CreateStatic("Barotrauma.AIObjective", true) +defaultLib["AIObjectiveChargeBatteries"] = CreateStatic("Barotrauma.AIObjectiveChargeBatteries", true) +defaultLib["AIObjectiveCleanupItem"] = CreateStatic("Barotrauma.AIObjectiveCleanupItem", true) +defaultLib["AIObjectiveCleanupItems"] = CreateStatic("Barotrauma.AIObjectiveCleanupItems", true) +defaultLib["AIObjectiveCombat"] = CreateStatic("Barotrauma.AIObjectiveCombat", true) +defaultLib["AIObjectiveContainItem"] = CreateStatic("Barotrauma.AIObjectiveContainItem", true) +defaultLib["AIObjectiveDecontainItem"] = CreateStatic("Barotrauma.AIObjectiveDecontainItem", true) +defaultLib["AIObjectiveEscapeHandcuffs"] = CreateStatic("Barotrauma.AIObjectiveEscapeHandcuffs", true) +defaultLib["AIObjectiveExtinguishFire"] = CreateStatic("Barotrauma.AIObjectiveExtinguishFire", true) +defaultLib["AIObjectiveExtinguishFires"] = CreateStatic("Barotrauma.AIObjectiveExtinguishFires", true) +defaultLib["AIObjectiveFightIntruders"] = CreateStatic("Barotrauma.AIObjectiveFightIntruders", true) +defaultLib["AIObjectiveFindDivingGear"] = CreateStatic("Barotrauma.AIObjectiveFindDivingGear", true) +defaultLib["AIObjectiveFindSafety"] = CreateStatic("Barotrauma.AIObjectiveFindSafety", true) +defaultLib["AIObjectiveFixLeak"] = CreateStatic("Barotrauma.AIObjectiveFixLeak", true) +defaultLib["AIObjectiveFixLeaks"] = CreateStatic("Barotrauma.AIObjectiveFixLeaks", true) +defaultLib["AIObjectiveGetItem"] = CreateStatic("Barotrauma.AIObjectiveGetItem", true) +defaultLib["AIObjectiveGoTo"] = CreateStatic("Barotrauma.AIObjectiveGoTo", true) +defaultLib["AIObjectiveIdle"] = CreateStatic("Barotrauma.AIObjectiveIdle", true) +defaultLib["AIObjectiveOperateItem"] = CreateStatic("Barotrauma.AIObjectiveOperateItem", true) +defaultLib["AIObjectiveOperateItem"] = CreateStatic("Barotrauma.AIObjectiveOperateItem", true) +defaultLib["AIObjectivePumpWater"] = CreateStatic("Barotrauma.AIObjectivePumpWater", true) +defaultLib["AIObjectiveRepairItem"] = CreateStatic("Barotrauma.AIObjectiveRepairItem", true) +defaultLib["AIObjectiveRepairItems"] = CreateStatic("Barotrauma.AIObjectiveRepairItems", true) +defaultLib["AIObjectiveRescue"] = CreateStatic("Barotrauma.AIObjectiveRescue", true) +defaultLib["AIObjectiveRescueAll"] = CreateStatic("Barotrauma.AIObjectiveRescueAll", true) +defaultLib["AIObjectiveReturn"] = CreateStatic("Barotrauma.AIObjectiveReturn", true) +defaultLib["AITarget"] = CreateStatic("Barotrauma.AITarget", true) + +defaultLib["Order"] = CreateStatic("Barotrauma.Order", true) +defaultLib["OrderPrefab"] = CreateStatic("Barotrauma.OrderPrefab", true) +defaultLib["OrderTarget"] = CreateStatic("Barotrauma.OrderTarget", true) + +local componentsToReference = { "DockingPort", "Door", "GeneticMaterial", "Growable", "Holdable", "LevelResource", "ItemComponent", "ItemLabel", "LightComponent", "Controller", "Deconstructor", "Engine", "Fabricator", "OutpostTerminal", "Pump", "Reactor", "Steering", "PowerContainer", "Projectile", "Repairable", "Rope", "Scanner", "ButtonTerminal", "ConnectionPanel", "CustomInterface", "MemoryComponent", "Terminal", "WifiComponent", "Wire", "TriggerComponent", "ElectricalDischarger", "EntitySpawnerComponent", "ProducedItem", "VineTile", "GrowthSideExtension", "IdCard", "MeleeWeapon", "Pickable", "Propulsion", "RangedWeapon", "RepairTool", "Sprayer", "Throwable", "ItemContainer", "Ladder", "LimbPos", "MiniMap", "OxygenGenerator", "Sonar", "SonarTransducer", "Vent", "NameTag", "Planter", "Powered", "PowerTransfer", "Quality", "RemoteController", "AdderComponent", "AndComponent", "ArithmeticComponent", "ColorComponent", "ConcatComponent", "Connection", "DelayComponent", "DivideComponent", "EqualsComponent", "ExponentiationComponent", "FunctionComponent", "GreaterComponent", "ModuloComponent", "MotionSensor", "MultiplyComponent", "NotComponent", "OrComponent", "OscillatorComponent", "OxygenDetector", "RegExFindComponent", "RelayComponent", "SignalCheckComponent", "SmokeDetector", "StringComponent", "SubtractComponent", "TrigonometricFunctionComponent", "WaterDetector", "XorComponent", "StatusHUD", "Turret", "Wearable", "CustomInterface" +} + +defaultLib["Components"] = {} + +for key, value in pairs(componentsToReference) do + defaultLib["Components"][value] = CreateStatic("Barotrauma.Items.Components." .. value, true) +end + +defaultLib["Vector2"] = CreateStatic("Microsoft.Xna.Framework.Vector2", true) +defaultLib["Vector3"] = CreateStatic("Microsoft.Xna.Framework.Vector3", true) +defaultLib["Vector4"] = CreateStatic("Microsoft.Xna.Framework.Vector4", true) +defaultLib["Color"] = CreateStatic("Microsoft.Xna.Framework.Color", true) +defaultLib["Point"] = CreateStatic("Microsoft.Xna.Framework.Point", true) +defaultLib["Rectangle"] = CreateStatic("Microsoft.Xna.Framework.Rectangle", true) +defaultLib["Matrix"] = CreateStatic("Microsoft.Xna.Framework.Matrix", true) + +return defaultLib diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Math.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Math.lua new file mode 100644 index 0000000..84698a5 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Math.lua @@ -0,0 +1,40 @@ +math.lerp = function (a, b, t) + if type(a) ~= "number" then error(string.format("bad argument #1 to 'lerp' (number expected, got %s)", type(a)), 2) end + if type(b) ~= "number" then error(string.format("bad argument #2 to 'lerp' (number expected, got %s)", type(b)), 2) end + if type(t) ~= "number" then error(string.format("bad argument #3 to 'lerp' (number expected, got %s)", type(t)), 2) end + + return a * (1 - t) + b * t +end + +math.clamp = function (value, min, max) + if type(value) ~= "number" then error(string.format("bad argument #1 to 'clamp' (number expected, got %s)", type(value)), 2) end + if type(min) ~= "number" then error(string.format("bad argument #2 to 'clamp' (number expected, got %s)", type(min)), 2) end + if type(max) ~= "number" then error(string.format("bad argument #3 to 'clamp' (number expected, got %s)", type(max)), 2) end + + return math.max(min, math.min(max, value)) +end + +math.round = function (value, decimals) + if type(value) ~= "number" then error(string.format("bad argument #1 to 'round' (number expected, got %s)", type(value)), 2) end + if type(decimals) ~= "number" then error(string.format("bad argument #2 to 'round' (number expected, got %s)", type(decimals)), 2) end + + decimals = decimals or 0 + local mult = 10 ^ decimals + return math.floor(value * mult + 0.5) / mult +end + +math.sign = function (value) + if type(value) ~= "number" then error(string.format("bad argument #1 to 'sign' (number expected, got %s)", type(value)), 2) end + + return value >= 0 and 1 or -1 +end + +math.remap = function (value, inMin, inMax, outMin, outMax) + if type(value) ~= "number" then error(string.format("bad argument #1 to 'remap' (number expected, got %s)", type(value)), 2) end + if type(inMin) ~= "number" then error(string.format("bad argument #2 to 'remap' (number expected, got %s)", type(inMin)), 2) end + if type(inMax) ~= "number" then error(string.format("bad argument #3 to 'remap' (number expected, got %s)", type(inMax)), 2) end + if type(outMin) ~= "number" then error(string.format("bad argument #4 to 'remap' (number expected, got %s)", type(outMin)), 2) end + if type(outMax) ~= "number" then error(string.format("bad argument #5 to 'remap' (number expected, got %s)", type(outMax)), 2) end + + return outMin + (outMax - outMin) * ((value - inMin) / (inMax - inMin)) +end \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/SteamApi.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/SteamApi.lua new file mode 100644 index 0000000..4e9608f --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/SteamApi.lua @@ -0,0 +1,26 @@ +local descriptor = LuaUserData.RegisterType("Barotrauma.LuaCsSteam") + +LuaUserData.AddMethod(descriptor, "GetWorkshopCollection", function (id, callback) + id = tostring(id) + + Networking.RequestPostHTTP("https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/", function (result) + local data = json.parse(result) + + if data.response.collectiondetails[1].children == nil then + callback() + return + end + + local workshopItems = {} + + for key, value in pairs(data.response.collectiondetails[1].children) do + table.insert(workshopItems, value.publishedfileid) + end + + if callback then + callback(workshopItems) + end + end, + "collectioncount=1&publishedfileids[0]=" .. id, + "application/x-www-form-urlencoded") +end) \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/String.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/String.lua new file mode 100644 index 0000000..3a79448 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/String.lua @@ -0,0 +1,13 @@ +string.startsWith = function(str, start) + if type(str) ~= "string" then error(string.format("bad argument #1 to 'startsWith' (string expected, got %s)", type(str)), 2) end + if type(start) ~= "string" then error(string.format("bad argument #2 to 'startsWith' (string expected, got %s)", type(start)), 2) end + + return string.sub(str, 1, string.len(start)) == start +end + +string.endsWith = function(str, ending) + if type(str) ~= "string" then error(string.format("bad argument #1 to 'endsWith' (string expected, got %s)", type(str)), 2) end + if type(ending) ~= "string" then error(string.format("bad argument #2 to 'endsWith' (string expected, got %s)", type(ending)), 2) end + + return ending == "" or string.sub(str, -string.len(ending)) == ending +end \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Util.lua b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Util.lua new file mode 100644 index 0000000..d4372ef --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultLib/Utils/Util.lua @@ -0,0 +1,86 @@ +Util = {} + +local itemDictionary = {} +local itemGroups = {} + +local function AddItem(item) + for _, itemGroup in pairs(itemGroups) do + if itemGroup.func(item) then + table.insert(itemGroup.items, item) + end + end + + local id = item.Prefab.Identifier.Value + if itemDictionary[id] == nil then + itemDictionary[id] = {} + end + + table.insert(itemDictionary[id], item) +end + +Hook.Add("item.created", "luaSetup.util.itemDictionary", function (item) + AddItem(item) +end) + +Hook.Add("roundEnd", "luaSetup.util.itemDictionary", function (item) + itemDictionary = {} + for _, itemGroup in pairs(itemGroups) do + itemGroup.items = {} + end +end) + +for _, item in pairs(Item.ItemList) do + AddItem(item) +end + +Util.RegisterItemGroup = function(groupName, func) + if type(groupName) ~= "string" then + error(string.format("bad argument #1 to 'RegisterItemGroup' (string expected, got %s)", type(groupName)), 2) + end + + if type(func) ~= "function" then + error(string.format("bad argument #2 to 'RegisterItemGroup' (function expected, got %s)", type(func)), 2) + end + + local items = {} + for _, item in pairs(Item.ItemList) do + if func(item) then + table.insert(items, item) + end + end + + itemGroups[groupName] = { + func = func, + items = items + } +end + +Util.GetItemGroup = function(groupName) + if type(groupName) ~= "string" then + error(string.format("bad argument #1 to 'GetItemGroup' (string expected, got %s)", type(groupName)), 2) + end + + if not itemGroups[groupName] then + error("bad argument #1 to 'GetItemGroup' couldn't find the specified groupName", 2) + end + + return itemGroups[groupName].items or {} +end + +Util.GetItemsById = function(id) + if id == nil then + error(string.format("bad argument #1 to 'GetItemsById' (string expected, got %s)", type(id)), 2) + end + + return itemDictionary[id] +end + +Util.FindClientCharacter = function(character) + if CLIENT and Game.IsSingleplayer then return nil end + + for _, client in pairs(Client.ClientList) do + if client.Character == character then + return client + end + end +end \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterClient.lua b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterClient.lua new file mode 100644 index 0000000..6f07474 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterClient.lua @@ -0,0 +1,150 @@ +local Register = LuaSetup.LuaUserData.RegisterType +local RegisterBarotrauma = LuaSetup.LuaUserData.RegisterTypeBarotrauma + +local localizedStrings = { + "LocalizedString", "LimitLString", "WrappedLString", "AddedPunctuationLString", "CapitalizeLString", "ConcatLString", "FallbackLString", "FormattedLString", "InputTypeLString", "JoinLString", "LowerLString", "RawLString", "ReplaceLString", "ServerMsgLString", "SplitLString", "TagLString", "TrimLString", "UpperLString", "StripRichTagsLString", +} + +for key, value in pairs(localizedStrings) do + RegisterBarotrauma(value) +end + +RegisterBarotrauma("EditorScreen") +RegisterBarotrauma("SubEditorScreen") +RegisterBarotrauma("EventEditorScreen") +RegisterBarotrauma("CharacterEditor.CharacterEditorScreen") +RegisterBarotrauma("SpriteEditorScreen") +RegisterBarotrauma("LevelEditorScreen") + +RegisterBarotrauma("Networking.ClientPeer") +RegisterBarotrauma("Networking.GameClient") +RegisterBarotrauma("Networking.VoipCapture") + +RegisterBarotrauma("Media.Video") + +RegisterBarotrauma("SoundsFile") +RegisterBarotrauma("SoundPrefab") +RegisterBarotrauma("PrefabCollection`1") +RegisterBarotrauma("PrefabSelector`1") +RegisterBarotrauma("BackgroundMusic") +RegisterBarotrauma("GUISound") +RegisterBarotrauma("DamageSound") + +RegisterBarotrauma("Sounds.SoundManager") +RegisterBarotrauma("Sounds.OggSound") +RegisterBarotrauma("Sounds.VideoSound") +RegisterBarotrauma("Sounds.VoipSound") +RegisterBarotrauma("Sounds.SoundChannel") +RegisterBarotrauma("Sounds.SoundBuffers") +RegisterBarotrauma("RoundSound") +RegisterBarotrauma("CharacterSound") +RegisterBarotrauma("SoundPlayer") +RegisterBarotrauma("Items.Components.ItemSound") + +RegisterBarotrauma("Sounds.LowpassFilter") +RegisterBarotrauma("Sounds.HighpassFilter") +RegisterBarotrauma("Sounds.BandpassFilter") +RegisterBarotrauma("Sounds.NotchFilter") +RegisterBarotrauma("Sounds.LowShelfFilter") +RegisterBarotrauma("Sounds.HighShelfFilter") +RegisterBarotrauma("Sounds.PeakFilter") + +RegisterBarotrauma("Particles.ParticleManager") +RegisterBarotrauma("Particles.Particle") +RegisterBarotrauma("Particles.ParticleEmitterProperties") +RegisterBarotrauma("Particles.ParticleEmitter") +RegisterBarotrauma("Particles.ParticlePrefab") + +RegisterBarotrauma("Lights.LightManager") +RegisterBarotrauma("Lights.LightSource") +RegisterBarotrauma("Lights.LightSourceParams") + +RegisterBarotrauma("LevelWallVertexBuffer") +RegisterBarotrauma("LevelRenderer") +RegisterBarotrauma("WaterRenderer") +RegisterBarotrauma("WaterVertexData") + +RegisterBarotrauma("ChatBox") +RegisterBarotrauma("GUICanvas") +RegisterBarotrauma("Anchor") +RegisterBarotrauma("Alignment") +RegisterBarotrauma("Pivot") +RegisterBarotrauma("Key") +RegisterBarotrauma("PlayerInput") +RegisterBarotrauma("ScalableFont") + +Register("Microsoft.Xna.Framework.Graphics.Effect") +Register("Microsoft.Xna.Framework.Graphics.EffectParameterCollection") +Register("Microsoft.Xna.Framework.Graphics.EffectParameter") + +Register("Microsoft.Xna.Framework.Graphics.SpriteBatch") +Register("Microsoft.Xna.Framework.Graphics.Texture2D") +Register("EventInput.KeyboardDispatcher") +Register("EventInput.KeyEventArgs") +Register("Microsoft.Xna.Framework.Input.Keys") +Register("Microsoft.Xna.Framework.Input.KeyboardState") + +RegisterBarotrauma("TextureLoader") +RegisterBarotrauma("Sprite") +RegisterBarotrauma("GUI") +RegisterBarotrauma("GUIStyle") +RegisterBarotrauma("GUIComponent") +RegisterBarotrauma("GUILayoutGroup") +RegisterBarotrauma("GUITextBox") +RegisterBarotrauma("GUITextBlock") +RegisterBarotrauma("GUIButton") +RegisterBarotrauma("RectTransform") +RegisterBarotrauma("GUIFrame") +RegisterBarotrauma("GUITickBox") +RegisterBarotrauma("GUIImage") +RegisterBarotrauma("GUIListBox") +RegisterBarotrauma("GUIScrollBar") +RegisterBarotrauma("GUIDropDown") +RegisterBarotrauma("GUINumberInput") +RegisterBarotrauma("GUIMessage") +RegisterBarotrauma("GUIMessageBox") +RegisterBarotrauma("GUIColorPicker") +RegisterBarotrauma("GUIProgressBar") +RegisterBarotrauma("GUICustomComponent") +RegisterBarotrauma("GUIScissorComponent") +RegisterBarotrauma("GUIComponentStyle") +RegisterBarotrauma("GUIFontPrefab") +RegisterBarotrauma("GUIFont") +RegisterBarotrauma("GUISpritePrefab") +RegisterBarotrauma("GUISprite") +RegisterBarotrauma("GUISpriteSheetPrefab") +RegisterBarotrauma("GUISpriteSheet") +RegisterBarotrauma("GUICursorPrefab") +RegisterBarotrauma("GUICursor") +RegisterBarotrauma("GUIRadioButtonGroup") +RegisterBarotrauma("GUIDragHandle") +RegisterBarotrauma("GUIContextMenu") +RegisterBarotrauma("ContextMenuOption") +RegisterBarotrauma("VideoPlayer") +RegisterBarotrauma("CreditsPlayer") +RegisterBarotrauma("SlideshowPlayer") +RegisterBarotrauma("SerializableEntityEditor") +RegisterBarotrauma("CircuitBoxWireRenderer") +RegisterBarotrauma("CircuitBoxLabel") +RegisterBarotrauma("CircuitBoxMouseDragSnapshotHandler") +RegisterBarotrauma("CircuitBoxUI") + +RegisterBarotrauma("SettingsMenu") +RegisterBarotrauma("TabMenu") +RegisterBarotrauma("Widget") +RegisterBarotrauma("UpgradeStore") +RegisterBarotrauma("VotingInterface") +RegisterBarotrauma("MedicalClinicUI") +RegisterBarotrauma("LoadingScreen") +RegisterBarotrauma("HUD") +RegisterBarotrauma("HUDLayoutSettings") +RegisterBarotrauma("HUDProgressBar") +RegisterBarotrauma("Graph") +RegisterBarotrauma("HRManagerUI") +RegisterBarotrauma("SubmarineSelection") +RegisterBarotrauma("Store") +RegisterBarotrauma("UISprite") +RegisterBarotrauma("ParamsEditor") + +RegisterBarotrauma("Inventory+SlotReference") +RegisterBarotrauma("VisualSlot") diff --git a/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterServer.lua b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterServer.lua new file mode 100644 index 0000000..0de67a7 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterServer.lua @@ -0,0 +1,20 @@ +local Register = LuaSetup.LuaUserData.RegisterType +local RegisterBarotrauma = LuaSetup.LuaUserData.RegisterTypeBarotrauma + + +local localizedStrings = { + "LocalizedString", "AddedPunctuationLString", "CapitalizeLString", "ConcatLString", "FallbackLString", "FormattedLString", "InputTypeLString", "JoinLString", "LowerLString", "RawLString", "ReplaceLString", "ServerMsgLString", "SplitLString", "TagLString", "TrimLString", "UpperLString", "StripRichTagsLString", +} + +for key, value in pairs(localizedStrings) do + RegisterBarotrauma(value) +end + +Register("Steamworks.SteamServer") + +RegisterBarotrauma("Character+TeamChangeEventData") + +RegisterBarotrauma("Networking.GameServer") + +RegisterBarotrauma("Networking.ServerPeer") +RegisterBarotrauma("Networking.FileSender") diff --git a/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterShared.lua b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterShared.lua new file mode 100644 index 0000000..a3603fe --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/DefaultRegister/RegisterShared.lua @@ -0,0 +1,478 @@ +local Register = LuaSetup.LuaUserData.RegisterType +local RegisterExtension = LuaSetup.LuaUserData.RegisterExtensionType +local RegisterBarotrauma = LuaSetup.LuaUserData.RegisterTypeBarotrauma + +Register("System.TimeSpan") +Register("System.Exception") +Register("System.Console") +Register("System.Exception") + +RegisterBarotrauma("Success`2") +RegisterBarotrauma("Failure`2") + +RegisterBarotrauma("LuaSByte") +RegisterBarotrauma("LuaByte") +RegisterBarotrauma("LuaInt16") +RegisterBarotrauma("LuaUInt16") +RegisterBarotrauma("LuaInt32") +RegisterBarotrauma("LuaUInt32") +RegisterBarotrauma("LuaInt64") +RegisterBarotrauma("LuaUInt64") +RegisterBarotrauma("LuaSingle") +RegisterBarotrauma("LuaDouble") + +RegisterBarotrauma("GameMain") +RegisterBarotrauma("Networking.BanList") +RegisterBarotrauma("Networking.BannedPlayer") + +RegisterBarotrauma("Range`1") + +RegisterBarotrauma("RichString") +RegisterBarotrauma("Identifier") +RegisterBarotrauma("LanguageIdentifier") + +RegisterBarotrauma("Job") +RegisterBarotrauma("JobPrefab") +RegisterBarotrauma("JobVariant") + +Register("Voronoi2.DoubleVector2") +Register("Voronoi2.Site") +Register("Voronoi2.Edge") +Register("Voronoi2.Halfedge") +Register("Voronoi2.VoronoiCell") +Register("Voronoi2.GraphEdge") + +RegisterBarotrauma("WayPoint") +RegisterBarotrauma("Level") +RegisterBarotrauma("LevelData") +RegisterBarotrauma("Level+InterestingPosition") +RegisterBarotrauma("LevelGenerationParams") +RegisterBarotrauma("LevelObjectManager") +RegisterBarotrauma("LevelObject") +RegisterBarotrauma("LevelObjectPrefab") +RegisterBarotrauma("LevelTrigger") +RegisterBarotrauma("CaveGenerationParams") +RegisterBarotrauma("CaveGenerator") +RegisterBarotrauma("OutpostGenerationParams") +RegisterBarotrauma("OutpostGenerator") +RegisterBarotrauma("OutpostModuleInfo") +RegisterBarotrauma("BeaconStationInfo") +RegisterBarotrauma("NPCSet") +RegisterBarotrauma("RuinGeneration.Ruin") +RegisterBarotrauma("RuinGeneration.RuinGenerationParams") +RegisterBarotrauma("LevelWall") +RegisterBarotrauma("DestructibleLevelWall") +RegisterBarotrauma("Biome") +RegisterBarotrauma("Map") +RegisterBarotrauma("Networking.RespawnManager") +RegisterBarotrauma("Networking.RespawnManager+TeamSpecificState") + +RegisterBarotrauma("Character") +RegisterBarotrauma("CharacterPrefab") +RegisterBarotrauma("CharacterInfo") +RegisterBarotrauma("CharacterInfoPrefab") +RegisterBarotrauma("CharacterInfo+HeadPreset") +RegisterBarotrauma("CharacterInfo+HeadInfo") +RegisterBarotrauma("CharacterHealth") +RegisterBarotrauma("CharacterHealth+LimbHealth") +RegisterBarotrauma("DamageModifier") +RegisterBarotrauma("CharacterInventory") +RegisterBarotrauma("CharacterParams") +RegisterBarotrauma("CharacterParams+AIParams") +RegisterBarotrauma("CharacterParams+TargetParams") +RegisterBarotrauma("CharacterParams+InventoryParams") +RegisterBarotrauma("CharacterParams+HealthParams") +RegisterBarotrauma("CharacterParams+ParticleParams") +RegisterBarotrauma("CharacterParams+SoundParams") +RegisterBarotrauma("SteeringManager") +RegisterBarotrauma("IndoorsSteeringManager") +RegisterBarotrauma("SteeringPath") +RegisterBarotrauma("CreatureMetrics") + +RegisterBarotrauma("Item") +RegisterBarotrauma("DeconstructItem") +RegisterBarotrauma("PurchasedItem") +RegisterBarotrauma("PurchasedItemSwap") +RegisterBarotrauma("PurchasedUpgrade") +RegisterBarotrauma("SoldItem") +RegisterBarotrauma("StartItem") +RegisterBarotrauma("StartItemSet") +RegisterBarotrauma("RelatedItem") +RegisterBarotrauma("UpgradeManager") +RegisterBarotrauma("CargoManager") +RegisterBarotrauma("HireManager") +RegisterBarotrauma("FabricationRecipe") +RegisterBarotrauma("PreferredContainer") +RegisterBarotrauma("SwappableItem") +RegisterBarotrauma("FabricationRecipe+RequiredItemByIdentifier") +RegisterBarotrauma("FabricationRecipe+RequiredItemByTag") +RegisterBarotrauma("Submarine") + +RegisterBarotrauma("Networking.AccountInfo") +RegisterBarotrauma("Networking.AccountId") +RegisterBarotrauma("Networking.SteamId") +RegisterBarotrauma("Networking.EpicAccountId") +RegisterBarotrauma("Networking.Address") +RegisterBarotrauma("Networking.UnknownAddress") +RegisterBarotrauma("Networking.P2PAddress") +RegisterBarotrauma("Networking.EosP2PAddress") +RegisterBarotrauma("Networking.SteamP2PAddress") +RegisterBarotrauma("Networking.PipeAddress") +RegisterBarotrauma("Networking.LidgrenAddress") +RegisterBarotrauma("Networking.Endpoint") +RegisterBarotrauma("Networking.SteamP2PEndpoint") +RegisterBarotrauma("Networking.PipeEndpoint") +RegisterBarotrauma("Networking.LidgrenEndpoint") + +RegisterBarotrauma("INetSerializableStruct") +RegisterBarotrauma("Networking.Client") +RegisterBarotrauma("Networking.TempClient") +RegisterBarotrauma("Networking.NetworkConnection") +RegisterBarotrauma("Networking.LidgrenConnection") +RegisterBarotrauma("Networking.SteamP2PConnection") +RegisterBarotrauma("Networking.VoipQueue") +RegisterBarotrauma("Networking.ChatMessage") + +RegisterBarotrauma("AnimController") +RegisterBarotrauma("HumanoidAnimController") +RegisterBarotrauma("FishAnimController") +RegisterBarotrauma("Limb") +RegisterBarotrauma("Ragdoll") +RegisterBarotrauma("RagdollParams") + +RegisterBarotrauma("AfflictionPrefab") +RegisterBarotrauma("Affliction") +RegisterBarotrauma("AttackResult") +RegisterBarotrauma("Attack") +RegisterBarotrauma("Entity") +RegisterBarotrauma("EntityGrid") +RegisterBarotrauma("EntitySpawner") +RegisterBarotrauma("MapEntity") +RegisterBarotrauma("MapEntityPrefab") +RegisterBarotrauma("CauseOfDeath") +RegisterBarotrauma("Hull") +RegisterBarotrauma("WallSection") +RegisterBarotrauma("Structure") +RegisterBarotrauma("Gap") +RegisterBarotrauma("PhysicsBody") +RegisterBarotrauma("AbilityFlags") +RegisterBarotrauma("ItemPrefab") +RegisterBarotrauma("ItemAssemblyPrefab") +RegisterBarotrauma("InputType") + +RegisterBarotrauma("FireSource") +RegisterBarotrauma("SerializableProperty") +LuaUserData.MakeFieldAccessible(RegisterBarotrauma("StatusEffect"), "user") +RegisterBarotrauma("DurationListElement") +RegisterBarotrauma("PropertyConditional") +RegisterBarotrauma("DelayedListElement") +RegisterBarotrauma("DelayedEffect") + + +RegisterBarotrauma("ContentPackageManager") +RegisterBarotrauma("ContentPackageManager+PackageSource") +RegisterBarotrauma("ContentPackageManager+EnabledPackages") +RegisterBarotrauma("ContentPackage") +RegisterBarotrauma("RegularPackage") +RegisterBarotrauma("CorePackage") +RegisterBarotrauma("ContentXElement") +RegisterBarotrauma("ContentPath") +RegisterBarotrauma("ContentPackageId") +RegisterBarotrauma("SteamWorkshopId") +RegisterBarotrauma("Md5Hash") + +RegisterBarotrauma("AfflictionsFile") +RegisterBarotrauma("BackgroundCreaturePrefabsFile") +RegisterBarotrauma("BallastFloraFile") +RegisterBarotrauma("BeaconStationFile") +RegisterBarotrauma("CaveGenerationParametersFile") +RegisterBarotrauma("CharacterFile") +RegisterBarotrauma("ContentFile") +RegisterBarotrauma("CorpsesFile") +RegisterBarotrauma("DecalsFile") +RegisterBarotrauma("EnemySubmarineFile") +RegisterBarotrauma("EventManagerSettingsFile") +RegisterBarotrauma("FactionsFile") +RegisterBarotrauma("ItemAssemblyFile") +RegisterBarotrauma("ItemFile") +RegisterBarotrauma("JobsFile") +RegisterBarotrauma("LevelGenerationParametersFile") +RegisterBarotrauma("LevelObjectPrefabsFile") +RegisterBarotrauma("LocationTypesFile") +RegisterBarotrauma("MapGenerationParametersFile") +RegisterBarotrauma("MissionsFile") +RegisterBarotrauma("NPCConversationsFile") +RegisterBarotrauma("NPCPersonalityTraitsFile") +RegisterBarotrauma("NPCSetsFile") +RegisterBarotrauma("OrdersFile") +RegisterBarotrauma("OtherFile") +RegisterBarotrauma("OutpostConfigFile") +RegisterBarotrauma("OutpostFile") +RegisterBarotrauma("OutpostModuleFile") +RegisterBarotrauma("ParticlesFile") +RegisterBarotrauma("RandomEventsFile") +RegisterBarotrauma("RuinConfigFile") +RegisterBarotrauma("ServerExecutableFile") +RegisterBarotrauma("SkillSettingsFile") +RegisterBarotrauma("SoundsFile") +RegisterBarotrauma("StartItemsFile") +RegisterBarotrauma("StructureFile") +RegisterBarotrauma("SubmarineFile") +RegisterBarotrauma("TalentsFile") +RegisterBarotrauma("TalentTreesFile") +RegisterBarotrauma("TextFile") +RegisterBarotrauma("TutorialsFile") +RegisterBarotrauma("UIStyleFile") +RegisterBarotrauma("UpgradeModulesFile") +RegisterBarotrauma("WreckAIConfigFile") +RegisterBarotrauma("WreckFile") + +Register("System.Xml.Linq.XElement") +Register("System.Xml.Linq.XName") +Register("System.Xml.Linq.XAttribute") +Register("System.Xml.Linq.XContainer") +Register("System.Xml.Linq.XDocument") +Register("System.Xml.Linq.XNode") + + +RegisterBarotrauma("SubmarineBody") +RegisterBarotrauma("Explosion") +RegisterBarotrauma("Networking.ServerSettings") +RegisterBarotrauma("Networking.ServerSettings+SavedClientPermission") +RegisterBarotrauma("Inventory") +RegisterBarotrauma("ItemInventory") +RegisterBarotrauma("Inventory+ItemSlot") +RegisterBarotrauma("FireSource") +RegisterBarotrauma("AutoItemPlacer") +RegisterBarotrauma("CircuitBoxConnection") +RegisterBarotrauma("CircuitBoxComponent") +RegisterBarotrauma("CircuitBoxNode") +RegisterBarotrauma("CircuitBoxWire") +RegisterBarotrauma("CircuitBoxInputOutputNode") +RegisterBarotrauma("CircuitBoxSelectable") +RegisterBarotrauma("CircuitBoxSizes") + +local componentsToRegister = { "DockingPort", "Door", "GeneticMaterial", "Growable", "Holdable", "LevelResource", "ItemComponent", "ItemLabel", "LightComponent", "Controller", "Deconstructor", "Engine", "Fabricator", "OutpostTerminal", "Pump", "Reactor", "Steering", "PowerContainer", "Projectile", "Repairable", "Rope", "Scanner", "ButtonTerminal", "ConnectionPanel", "CustomInterface", "MemoryComponent", "Terminal", "WifiComponent", "Wire", "TriggerComponent", "ElectricalDischarger", "EntitySpawnerComponent", "ProducedItem", "VineTile", "GrowthSideExtension", "IdCard", "MeleeWeapon", "Pickable", "AbilityItemPickingTime", "Propulsion", "RangedWeapon", "AbilityRangedWeapon", "RepairTool", "Sprayer", "Throwable", "ItemContainer", "AbilityItemContainer", "Ladder", "LimbPos", "AbilityDeconstructedItem", "AbilityItemCreationMultiplier", "AbilityItemDeconstructedInventory", "MiniMap", "OxygenGenerator", "Sonar", "SonarTransducer", "Vent", "NameTag", "Planter", "Powered", "PowerTransfer", "Quality", "RemoteController", "AdderComponent", "AndComponent", "ArithmeticComponent", "ColorComponent", "ConcatComponent", "Connection", "CircuitBox", "DelayComponent", "DivideComponent", "EqualsComponent", "ExponentiationComponent", "FunctionComponent", "GreaterComponent", "ModuloComponent", "MotionSensor", "MultiplyComponent", "NotComponent", "OrComponent", "OscillatorComponent", "OxygenDetector", "RegExFindComponent", "RelayComponent", "SignalCheckComponent", "SmokeDetector", "StringComponent", "SubtractComponent", "TrigonometricFunctionComponent", "WaterDetector", "XorComponent", "StatusHUD", "Turret", "Wearable", +"GridInfo", "PowerSourceGroup" +} + +for key, value in pairs(componentsToRegister) do + RegisterBarotrauma("Items.Components." .. value) +end + +LuaUserData.MakeFieldAccessible(RegisterBarotrauma("Items.Components.CustomInterface"), "customInterfaceElementList") +RegisterBarotrauma("Items.Components.CustomInterface+CustomInterfaceElement") + +RegisterBarotrauma("WearableSprite") + +RegisterBarotrauma("AIController") +RegisterBarotrauma("EnemyAIController") +RegisterBarotrauma("HumanAIController") +RegisterBarotrauma("AICharacter") +RegisterBarotrauma("AITarget") +RegisterBarotrauma("AITargetMemory") +RegisterBarotrauma("AIChatMessage") +RegisterBarotrauma("AIObjectiveManager") +RegisterBarotrauma("WreckAI") +RegisterBarotrauma("WreckAIConfig") + +RegisterBarotrauma("AIObjectiveChargeBatteries") +RegisterBarotrauma("AIObjective") +RegisterBarotrauma("AIObjectiveCleanupItem") +RegisterBarotrauma("AIObjectiveCleanupItems") +RegisterBarotrauma("AIObjectiveCombat") +RegisterBarotrauma("AIObjectiveContainItem") +RegisterBarotrauma("AIObjectiveDecontainItem") +RegisterBarotrauma("AIObjectiveEscapeHandcuffs") +RegisterBarotrauma("AIObjectiveExtinguishFire") +RegisterBarotrauma("AIObjectiveExtinguishFires") +RegisterBarotrauma("AIObjectiveFightIntruders") +RegisterBarotrauma("AIObjectiveFindDivingGear") +RegisterBarotrauma("AIObjectiveFindSafety") +RegisterBarotrauma("AIObjectiveFixLeak") +RegisterBarotrauma("AIObjectiveFixLeaks") +RegisterBarotrauma("AIObjectiveGetItem") +RegisterBarotrauma("AIObjectiveGoTo") +RegisterBarotrauma("AIObjectiveIdle") +RegisterBarotrauma("AIObjectiveOperateItem") +RegisterBarotrauma("AIObjectivePumpWater") +RegisterBarotrauma("AIObjectiveRepairItem") +RegisterBarotrauma("AIObjectiveRepairItems") +RegisterBarotrauma("AIObjectiveRescue") +RegisterBarotrauma("AIObjectiveRescueAll") +RegisterBarotrauma("AIObjectiveReturn") + +RegisterBarotrauma("Order") +RegisterBarotrauma("OrderPrefab") +RegisterBarotrauma("OrderTarget") + +RegisterBarotrauma("TalentPrefab") +RegisterBarotrauma("TalentOption") +RegisterBarotrauma("TalentSubTree") +RegisterBarotrauma("TalentTree") +RegisterBarotrauma("CharacterTalent") +RegisterBarotrauma("Upgrade") +RegisterBarotrauma("UpgradeCategory") +RegisterBarotrauma("UpgradePrefab") +RegisterBarotrauma("UpgradeManager") + +RegisterBarotrauma("Screen") +RegisterBarotrauma("GameScreen") +RegisterBarotrauma("GameSession") +RegisterBarotrauma("GameSettings") +RegisterBarotrauma("CrewManager") +RegisterBarotrauma("KarmaManager") + +RegisterBarotrauma("GameMode") +RegisterBarotrauma("MissionMode") +RegisterBarotrauma("PvPMode") +RegisterBarotrauma("Mission") +RegisterBarotrauma("AbandonedOutpostMission") +RegisterBarotrauma("EliminateTargetsMission") +RegisterBarotrauma("EndMission") +RegisterBarotrauma("BeaconMission") +RegisterBarotrauma("CargoMission") +RegisterBarotrauma("CombatMission") +RegisterBarotrauma("EscortMission") +RegisterBarotrauma("GoToMission") +RegisterBarotrauma("MineralMission") +RegisterBarotrauma("MonsterMission") +RegisterBarotrauma("NestMission") +RegisterBarotrauma("PirateMission") +RegisterBarotrauma("SalvageMission") +RegisterBarotrauma("ScanMission") +RegisterBarotrauma("MissionPrefab") +RegisterBarotrauma("CampaignMode") +RegisterBarotrauma("CoOpMode") +RegisterBarotrauma("MultiPlayerCampaign") +RegisterBarotrauma("Radiation") + +RegisterBarotrauma("CampaignMetadata") +RegisterBarotrauma("Wallet") + +RegisterBarotrauma("Faction") +RegisterBarotrauma("FactionPrefab") +RegisterBarotrauma("Reputation") + +RegisterBarotrauma("Location") +RegisterBarotrauma("LocationConnection") +RegisterBarotrauma("LocationType") +RegisterBarotrauma("LocationTypeChange") + +RegisterBarotrauma("DebugConsole") +RegisterBarotrauma("DebugConsole+Command") + +RegisterBarotrauma("TextManager") +RegisterBarotrauma("TextPack") + +local descriptor = RegisterBarotrauma("NetLobbyScreen") + +if SERVER then + LuaUserData.MakeFieldAccessible(descriptor, "subs") +end + +RegisterBarotrauma("EventManager") +RegisterBarotrauma("EventManagerSettings") +RegisterBarotrauma("Event") +RegisterBarotrauma("ArtifactEvent") +RegisterBarotrauma("MonsterEvent") +RegisterBarotrauma("ScriptedEvent") +RegisterBarotrauma("MalfunctionEvent") +RegisterBarotrauma("EventSet") +RegisterBarotrauma("EventPrefab") + +RegisterBarotrauma("Networking.NetConfig") +RegisterBarotrauma("Networking.IWriteMessage") +RegisterBarotrauma("Networking.IReadMessage") +RegisterBarotrauma("Networking.NetEntityEvent") +RegisterBarotrauma("Networking.INetSerializable") +Register("Lidgren.Network.NetIncomingMessage") +Register("Lidgren.Network.NetConnection") +Register("System.Net.IPEndPoint") +Register("System.Net.IPAddress") + +RegisterBarotrauma("Skill") +RegisterBarotrauma("SkillPrefab") +RegisterBarotrauma("SkillSettings") + +RegisterBarotrauma("TraitorManager") +RegisterBarotrauma("TraitorEvent") +RegisterBarotrauma("TraitorEventPrefab") +RegisterBarotrauma("TraitorManager+TraitorResults") + +Register("FarseerPhysics.Dynamics.Body") +Register("FarseerPhysics.Dynamics.World") +Register("FarseerPhysics.Dynamics.Fixture") +Register("FarseerPhysics.ConvertUnits") +Register("FarseerPhysics.Collision.AABB") +Register("FarseerPhysics.Collision.ContactFeature") +Register("FarseerPhysics.Collision.ManifoldPoint") +Register("FarseerPhysics.Collision.ContactID") +Register("FarseerPhysics.Collision.Manifold") +Register("FarseerPhysics.Collision.RayCastInput") +Register("FarseerPhysics.Collision.ClipVertex") +Register("FarseerPhysics.Collision.RayCastOutput") +Register("FarseerPhysics.Collision.EPAxis") +Register("FarseerPhysics.Collision.ReferenceFace") +Register("FarseerPhysics.Collision.Collision") + +RegisterBarotrauma("Physics") + +local toolBox = RegisterBarotrauma("ToolBox") +if CLIENT then + LuaUserData.RemoveMember(toolBox, "OpenFileWithShell") +end + +RegisterBarotrauma("Camera") +RegisterBarotrauma("Key") + +RegisterBarotrauma("PrefabCollection`1") + +RegisterBarotrauma("PrefabSelector`1") + +RegisterBarotrauma("Pair`2") + +RegisterBarotrauma("Items.Components.Signal") +RegisterBarotrauma("SubmarineInfo") + +RegisterBarotrauma("MapCreatures.Behavior.BallastFloraBehavior") +RegisterBarotrauma("MapCreatures.Behavior.BallastFloraBranch") + +RegisterBarotrauma("PetBehavior") +RegisterBarotrauma("SwarmBehavior") +RegisterBarotrauma("LatchOntoAI") + +RegisterBarotrauma("Decal") +RegisterBarotrauma("DecalPrefab") +RegisterBarotrauma("DecalManager") + +RegisterBarotrauma("PriceInfo") + +RegisterBarotrauma("Voting") + +Register("Microsoft.Xna.Framework.Vector2") +Register("Microsoft.Xna.Framework.Vector3") +Register("Microsoft.Xna.Framework.Vector4") +Register("Microsoft.Xna.Framework.Color") +Register("Microsoft.Xna.Framework.Point") +Register("Microsoft.Xna.Framework.Rectangle") +Register("Microsoft.Xna.Framework.Matrix") + +local friend = Register("Steamworks.Friend") + +LuaUserData.RemoveMember(friend, "InviteToGame") +LuaUserData.RemoveMember(friend, "SendMessage") + +local workshopItem = Register("Steamworks.Ugc.Item") + +LuaUserData.RemoveMember(workshopItem, "Subscribe") +LuaUserData.RemoveMember(workshopItem, "DownloadAsync") +LuaUserData.RemoveMember(workshopItem, "Unsubscribe") +LuaUserData.RemoveMember(workshopItem, "AddFavorite") +LuaUserData.RemoveMember(workshopItem, "RemoveFavorite") +LuaUserData.RemoveMember(workshopItem, "Vote") +LuaUserData.RemoveMember(workshopItem, "GetUserVote") +LuaUserData.RemoveMember(workshopItem, "Edit") + +RegisterExtension("Barotrauma.MathUtils") +RegisterExtension("Barotrauma.XMLExtensions") \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/LuaSetup.lua b/Lua For Barotrauma/Binary/Lua/LuaSetup.lua new file mode 100644 index 0000000..05163a0 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/LuaSetup.lua @@ -0,0 +1,50 @@ +LuaSetup = {} + +local path = table.pack(...)[1] + +package.path = {path .. "/?.lua"} + +setmodulepaths(package.path) + +-- Setup Libraries +require("LuaUserData") + +require("DefaultRegister/RegisterShared") + +if SERVER then + require("DefaultRegister/RegisterServer") +else + require("DefaultRegister/RegisterClient") +end + +local function AddTableToGlobal(tbl) + for k, v in pairs(tbl) do + _G[k] = v + end +end + +if SERVER then + AddTableToGlobal(require("DefaultLib/LibServer")) +else + AddTableToGlobal(require("DefaultLib/LibClient")) +end + +AddTableToGlobal(require("DefaultLib/LibShared")) + +AddTableToGlobal(require("CompatibilityLib")) + +require("DefaultHook") + +Descriptors = LuaSetup.LuaUserData.Descriptors +LuaUserData = LuaSetup.LuaUserData + +require("DefaultLib/Utils/Math") +require("DefaultLib/Utils/String") +require("DefaultLib/Utils/Util") +require("DefaultLib/Utils/SteamApi") + +require("PostSetup") + +LuaSetup = nil + +require("ModLoader") \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/LuaUserData.lua b/Lua For Barotrauma/Binary/Lua/LuaUserData.lua new file mode 100644 index 0000000..387fc7f --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/LuaUserData.lua @@ -0,0 +1,97 @@ +local clrLuaUserData = LuaUserData +local luaUserData = {} + +luaUserData.Descriptors = {} + +LuaSetup.LuaUserData = luaUserData + +luaUserData.IsRegistered = clrLuaUserData.IsRegistered +luaUserData.UnregisterType = clrLuaUserData.UnregisterType +luaUserData.RegisterGenericType = clrLuaUserData.RegisterGenericType +luaUserData.RegisterExtensionType = clrLuaUserData.RegisterExtensionType +luaUserData.UnregisterGenericType = clrLuaUserData.UnregisterGenericType +luaUserData.IsTargetType = clrLuaUserData.IsTargetType +luaUserData.TypeOf = clrLuaUserData.TypeOf +luaUserData.GetType = clrLuaUserData.GetType +luaUserData.CreateEnumTable = clrLuaUserData.CreateEnumTable +luaUserData.MakeFieldAccessible = clrLuaUserData.MakeFieldAccessible +luaUserData.MakeMethodAccessible = clrLuaUserData.MakeMethodAccessible +luaUserData.MakePropertyAccessible = clrLuaUserData.MakePropertyAccessible +luaUserData.AddMethod = clrLuaUserData.AddMethod +luaUserData.AddField = clrLuaUserData.AddField +luaUserData.RemoveMember = clrLuaUserData.RemoveMember +luaUserData.CreateUserDataFromDescriptor = clrLuaUserData.CreateUserDataFromDescriptor +luaUserData.CreateUserDataFromType = clrLuaUserData.CreateUserDataFromType +luaUserData.HasMember = clrLuaUserData.HasMember + +luaUserData.RegisterType = function(typeName) + local success, result = pcall(clrLuaUserData.RegisterType, typeName) + + if not success then + error(result, 2) + end + + luaUserData.Descriptors[typeName] = result + + return result +end + +luaUserData.RegisterTypeBarotrauma = function(typeName) + typeName = "Barotrauma." .. typeName + local success, result = pcall(luaUserData.RegisterType, typeName) + + if not success then + error(result, 2) + end + + return result +end + +luaUserData.AddCallMetaTable = function (userdata) + if userdata == nil then + error("Attempted to add a call metatable to a nil value.", 2) + end + + if not LuaUserData.HasMember(userdata, ".ctor") then + error("Attempted to add a call metatable to a userdata that does not have a constructor.", 2) + end + + debug.setmetatable(userdata, { + __call = function(obj, ...) + if userdata == nil then + error("userdata was nil.", 2) + end + + local success, result = pcall(userdata.__new, ...) + + + if not success then + error(result, 2) + end + + return result + end + }) +end + +luaUserData.CreateStatic = function(typeName) + if type(typeName) ~= "string" then + error("Expected a string for typeName, got " .. type(typeName) .. ".", 2) + end + + local success, result = pcall(clrLuaUserData.CreateStatic, typeName) + + if not success then + error(result, 2) + end + + if result == nil then + return + end + + if LuaUserData.HasMember(result, ".ctor") then + luaUserData.AddCallMetaTable(result) + end + + return result +end \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/ModLoader.lua b/Lua For Barotrauma/Binary/Lua/ModLoader.lua new file mode 100644 index 0000000..828b562 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/ModLoader.lua @@ -0,0 +1,193 @@ +local LUA_MOD_REQUIRE_PATH = "/Lua/?.lua" +local LUA_MOD_AUTORUN_PATH = "/Lua/Autorun" +local LUA_MOD_FORCEDAUTORUN_PATH = "/Lua/ForcedAutorun" + +local function EndsWith(str, suffix) + return str:sub(-string.len(suffix)) == suffix +end + +local function GetFileName(file) + return file:match("^.+/(.+)$") +end + +local function ExecuteProtected(s, folder) + loadfile(s)(folder) +end + +local function RunFolder(folder, rootFolder, package) + local search = File.DirSearch(folder) + for i = 1, #search, 1 do + local s = search[i]:gsub("\\", "/") + + if EndsWith(s, ".lua") then + local time = os.clock() + local ok, result = pcall(ExecuteProtected, s, rootFolder) + local diff = os.clock() - time + + print(string.format(" - %s (Took %.5fms)", GetFileName(s), diff)) + if not ok then + printerror(result) + end + end + + end +end + +local function AssertTypes(expectedTypes, ...) + local args = table.pack(...) + assert( + #args == #expectedTypes, + string.format( + "Assertion failed: incorrect number of args\n\texpected = %s\n\tgot = %s", + #expectedTypes, #args + ) + ) + for i = 1, #args do + local arg = args[i] + local expectedType = expectedTypes[i] + assert( + type(arg) == expectedType, + string.format( + "Assertion failed: incorrect argument type (arg #%d)\n\texpected = %s\n\tgot = %s", + i, expectedType, type(arg) + ) + ) + end +end + +local function ExecutionQueue() + local executionQueue = {} + executionQueue.Queue = {} + + executionQueue.Process = function() + while executionQueue.Queue[1] ~= nil do + local folder, rootFolder, package = table.unpack(table.remove(executionQueue.Queue, 1)) + print(string.format("%s %s", package.Name, package.ModVersion)) + RunFolder(folder, rootFolder, package) + end + end + + executionQueue.Add = function(...) + AssertTypes({ 'string', 'string', 'userdata' }, ...) + table.insert(executionQueue.Queue, table.pack(...)) + end + + return executionQueue +end + +local QueueAutorun = ExecutionQueue() +local QueueForcedAutorun = ExecutionQueue() + +local function nocase(s) + s = string.gsub(s, "%a", function(c) + return string.format("[%s%s]", string.lower(c), string.upper(c)) + end) + return s +end + +local function ProcessPackages(packages, fn) + for pkg in packages do + if pkg then + local pkgPath = pkg.Path + :gsub("\\", "/") + :gsub(nocase("/filelist.xml"), "") + fn(pkg, pkgPath) + end + end +end + +ProcessPackages(ContentPackageManager.EnabledPackages.All, function(pkg, pkgPath) + table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH) + local autorunPath = pkgPath .. LUA_MOD_AUTORUN_PATH + if File.DirectoryExists(autorunPath) then + QueueAutorun.Add(autorunPath, pkgPath, pkg) + end +end) + +-- we don't want to execute workshop ForcedAutorun if we have a local Package +local executedLocalPackages = {} + +ProcessPackages(ContentPackageManager.EnabledPackages.All, function(pkg, pkgPath) + table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH) + local forcedAutorunPath = pkgPath .. LUA_MOD_FORCEDAUTORUN_PATH + if File.DirectoryExists(forcedAutorunPath) then + QueueForcedAutorun.Add(forcedAutorunPath, pkgPath, pkg) + executedLocalPackages[pkg.Name] = true + end +end) + +if not LuaCsConfig.TreatForcedModsAsNormal then + ProcessPackages(ContentPackageManager.LocalPackages, function(pkg, pkgPath) + if not executedLocalPackages[pkg.Name] then + table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH) + local forcedAutorunPath = pkgPath .. LUA_MOD_FORCEDAUTORUN_PATH + if File.DirectoryExists(forcedAutorunPath) then + QueueForcedAutorun.Add(forcedAutorunPath, pkgPath, pkg) + executedLocalPackages[pkg.Name] = true + end + end + end) + + ProcessPackages(ContentPackageManager.AllPackages, function(pkg, pkgPath) + if not executedLocalPackages[pkg.Name] then + table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH) + local forcedAutorunPath = pkgPath .. LUA_MOD_FORCEDAUTORUN_PATH + if File.DirectoryExists(forcedAutorunPath) then + QueueForcedAutorun.Add(forcedAutorunPath, pkgPath, pkg) + end + end + end) +end + +setmodulepaths(package.path) +setmodulepaths = nil + +local allExecuted = {} +for key, value in pairs(QueueAutorun.Queue) do table.insert(allExecuted, value[3]) end +for key, value in pairs(QueueForcedAutorun.Queue) do table.insert(allExecuted, value[3]) end + +if SERVER then + Networking.Receive("_luastart", function (message, client) + local num = message.ReadUInt16() + + local packages = {} + + for i = 1, num, 1 do + table.insert(packages, { + Name = message.ReadString(), + Version = message.ReadString(), + Id = message.ReadUInt64(), + Hash = message.ReadString() + }) + end + + Hook.Call("client.packages", client, packages) + end) +elseif Game.IsMultiplayer then + local message = Networking.Start("_luastart") + + message.WriteUInt16(#allExecuted) + + for key, package in pairs(allExecuted) do + local id = package.UgcId + local hash = package.Hash and package.Hash.StringRepresentation or "" + + if id == nil then id = 0 end + + message.WriteString(package.Name) + message.WriteString(package.ModVersion) + message.WriteUInt64(UInt64(id)) + message.WriteString(hash) + end + + Networking.Send(message) +end + +QueueAutorun.Process() +QueueForcedAutorun.Process() + +Hook.Add("stop", "luaSetup.stop", function() + print("Stopping Lua...") +end) + +Hook.Call("loaded") \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Lua/PostSetup.lua b/Lua For Barotrauma/Binary/Lua/PostSetup.lua new file mode 100644 index 0000000..f544172 --- /dev/null +++ b/Lua For Barotrauma/Binary/Lua/PostSetup.lua @@ -0,0 +1,75 @@ +if CSActive then + return +end + +local function IsAllowed(typeName) + if string.startsWith(typeName, "Barotrauma.Lua") or string.startsWith(typeName, "Barotrauma.Cs") or string.startsWith(typeName, "Barotrauma.LuaCs") then + return false + end + + if string.startsWith(typeName, "System.Collections") then return true end + + if string.startsWith(typeName, "Microsoft.Xna") then return true end + + if string.startsWith(typeName, "Barotrauma.IO") then return false end + + if string.startsWith(typeName, "Barotrauma.ToolBox") then return false end + if string.startsWith(typeName, "Barotrauma.SaveUtil") then return false end + + if string.startsWith(typeName, "Barotrauma.") then return true end + + return false +end + +local function CanBeReRegistered(typeName) + if string.startsWith(typeName, "Barotrauma.Lua") or string.startsWith(typeName, "Barotrauma.Cs") or string.startsWith(typeName, "Barotrauma.LuaCs") then + return false + end + + return true +end + +local originalRegisterType = LuaUserData.RegisterType +LuaUserData.RegisterType = function (typeName) + if not (CanBeReRegistered(typeName) and LuaUserData.IsRegistered(typeName)) and not IsAllowed(typeName) then + error("Couldn't register type " .. typeName .. ".", 2) + end + + local success, result = pcall(originalRegisterType, typeName) + + if not success then + error(result, 2) + end + + return result +end + +local originalRegisterGenericType = LuaUserData.RegisterType +LuaUserData.RegisterGenericType = function (typeName, ...) + if not (CanBeReRegistered(typeName) and LuaUserData.IsRegistered(typeName)) and not IsAllowed(typeName) then + error("Couldn't register generic type " .. typeName .. ".", 2) + end + + local success, result = pcall(originalRegisterGenericType, typeName, ...) + + if not success then + error(result, 2) + end + + return result +end + +local originalCreateStatic = LuaUserData.CreateStatic +LuaUserData.CreateStatic = function (typeName, addCallMethod) + if not (CanBeReRegistered(typeName) and LuaUserData.IsRegistered(typeName)) and not IsAllowed(typeName) then + error("Couldn't create static type " .. typeName .. ".", 2) + end + + local success, result = pcall(originalCreateStatic, typeName, addCallMethod) + + if not success then + error(result, 2) + end + + return result +end \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/Microsoft.CSharp.dll b/Lua For Barotrauma/Binary/Microsoft.CSharp.dll new file mode 100644 index 0000000..9d9fbd2 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.CSharp.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.Scripting.dll b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.Scripting.dll new file mode 100644 index 0000000..dcce140 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.Scripting.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.dll b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.dll new file mode 100644 index 0000000..5a19219 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.CSharp.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.Scripting.dll b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.Scripting.dll new file mode 100644 index 0000000..d7f3777 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.Scripting.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.dll b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.dll new file mode 100644 index 0000000..6fbab49 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.CodeAnalysis.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.DiaSymReader.Native.amd64.dll b/Lua For Barotrauma/Binary/Microsoft.DiaSymReader.Native.amd64.dll new file mode 100644 index 0000000..78c90cd Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.DiaSymReader.Native.amd64.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.VisualBasic.Core.dll b/Lua For Barotrauma/Binary/Microsoft.VisualBasic.Core.dll new file mode 100644 index 0000000..62f07e5 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.VisualBasic.Core.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.VisualBasic.dll b/Lua For Barotrauma/Binary/Microsoft.VisualBasic.dll new file mode 100644 index 0000000..80ab6da Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.VisualBasic.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.Win32.Primitives.dll b/Lua For Barotrauma/Binary/Microsoft.Win32.Primitives.dll new file mode 100644 index 0000000..ebdfe8c Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.Win32.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/Microsoft.Win32.Registry.dll b/Lua For Barotrauma/Binary/Microsoft.Win32.Registry.dll new file mode 100644 index 0000000..1df30e0 Binary files /dev/null and b/Lua For Barotrauma/Binary/Microsoft.Win32.Registry.dll differ diff --git a/Lua For Barotrauma/Binary/Mono.Cecil.Mdb.dll b/Lua For Barotrauma/Binary/Mono.Cecil.Mdb.dll new file mode 100644 index 0000000..c22998b Binary files /dev/null and b/Lua For Barotrauma/Binary/Mono.Cecil.Mdb.dll differ diff --git a/Lua For Barotrauma/Binary/Mono.Cecil.Pdb.dll b/Lua For Barotrauma/Binary/Mono.Cecil.Pdb.dll new file mode 100644 index 0000000..0d396b8 Binary files /dev/null and b/Lua For Barotrauma/Binary/Mono.Cecil.Pdb.dll differ diff --git a/Lua For Barotrauma/Binary/Mono.Cecil.Rocks.dll b/Lua For Barotrauma/Binary/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000..785c186 Binary files /dev/null and b/Lua For Barotrauma/Binary/Mono.Cecil.Rocks.dll differ diff --git a/Lua For Barotrauma/Binary/Mono.Cecil.dll b/Lua For Barotrauma/Binary/Mono.Cecil.dll new file mode 100644 index 0000000..9b78a39 Binary files /dev/null and b/Lua For Barotrauma/Binary/Mono.Cecil.dll differ diff --git a/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.dll b/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.dll new file mode 100644 index 0000000..55929c1 Binary files /dev/null and b/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.pdb b/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.pdb new file mode 100644 index 0000000..46f345d Binary files /dev/null and b/Lua For Barotrauma/Binary/MonoGame.Framework.Windows.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/MonoMod.Common.dll b/Lua For Barotrauma/Binary/MonoMod.Common.dll new file mode 100644 index 0000000..678ca7e Binary files /dev/null and b/Lua For Barotrauma/Binary/MonoMod.Common.dll differ diff --git a/Lua For Barotrauma/Binary/MoonSharp.Interpreter.deps.json b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.deps.json new file mode 100644 index 0000000..2a578c4 --- /dev/null +++ b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.deps.json @@ -0,0 +1,24 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.1/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.1": {}, + ".NETStandard,Version=v2.1/": { + "MoonSharp.Interpreter/2.0.0": { + "runtime": { + "MoonSharp.Interpreter.dll": {} + } + } + } + }, + "libraries": { + "MoonSharp.Interpreter/2.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/MoonSharp.Interpreter.dll b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.dll new file mode 100644 index 0000000..6c336b0 Binary files /dev/null and b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.dll differ diff --git a/Lua For Barotrauma/Binary/MoonSharp.Interpreter.pdb b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.pdb new file mode 100644 index 0000000..502dc98 Binary files /dev/null and b/Lua For Barotrauma/Binary/MoonSharp.Interpreter.pdb differ diff --git a/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.dll b/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.dll new file mode 100644 index 0000000..44f1bf9 Binary files /dev/null and b/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.dll differ diff --git a/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.pdb b/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.pdb new file mode 100644 index 0000000..5f0fe37 Binary files /dev/null and b/Lua For Barotrauma/Binary/MoonSharp.VsCodeDebugger.pdb differ diff --git a/Lua For Barotrauma/Binary/NLog.dll b/Lua For Barotrauma/Binary/NLog.dll new file mode 100644 index 0000000..9034c14 Binary files /dev/null and b/Lua For Barotrauma/Binary/NLog.dll differ diff --git a/Lua For Barotrauma/Binary/NVorbis.dll b/Lua For Barotrauma/Binary/NVorbis.dll new file mode 100644 index 0000000..cb7ba20 Binary files /dev/null and b/Lua For Barotrauma/Binary/NVorbis.dll differ diff --git a/Lua For Barotrauma/Binary/OpenALSoft_LICENSE b/Lua For Barotrauma/Binary/OpenALSoft_LICENSE new file mode 100644 index 0000000..8d5d000 --- /dev/null +++ b/Lua For Barotrauma/Binary/OpenALSoft_LICENSE @@ -0,0 +1,437 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/Lua For Barotrauma/Binary/Publicized/Barotrauma.dll b/Lua For Barotrauma/Binary/Publicized/Barotrauma.dll new file mode 100644 index 0000000..78f1cce Binary files /dev/null and b/Lua For Barotrauma/Binary/Publicized/Barotrauma.dll differ diff --git a/Lua For Barotrauma/Binary/Publicized/BarotraumaCore.dll b/Lua For Barotrauma/Binary/Publicized/BarotraumaCore.dll new file mode 100644 index 0000000..0cfd72c Binary files /dev/null and b/Lua For Barotrauma/Binary/Publicized/BarotraumaCore.dll differ diff --git a/Lua For Barotrauma/Binary/Publicized/DedicatedServer.dll b/Lua For Barotrauma/Binary/Publicized/DedicatedServer.dll new file mode 100644 index 0000000..271e4ad Binary files /dev/null and b/Lua For Barotrauma/Binary/Publicized/DedicatedServer.dll differ diff --git a/Lua For Barotrauma/Binary/README.txt b/Lua For Barotrauma/Binary/README.txt new file mode 100644 index 0000000..6ba44b3 --- /dev/null +++ b/Lua For Barotrauma/Binary/README.txt @@ -0,0 +1,38 @@ +BAROTRAUMA + +http://www.barotraumagame.com + +© 2017-2024 FakeFish Ltd. All rights reserved. +© 2019-2024 Daedalic Entertainment GmbH. The Daedalic logo is a trademark of Daedalic Entertainment GmbH, Germany. All rights reserved. +Privacy policy: http://privacypolicy.daedalic.com + +See the wiki for more detailed info and instructions: +http://barotraumagame.com/wiki + +------------------------------------------------------------------------ + +Port forwarding: +You may try to forward ports on your router using UPnP (Universal Plug and +Play) port forwarding by selecting "Attempt UPnP port forwarding" in the +"Host Server" menu. + +However, UPnP isn't supported by all routers, so you may need to setup port +forwards manually. The exact steps for forwarding a port depend on your +router's model, but you may be able to find a port forwarding guide for +your particular router/application on portforward.com or by practicing +your google-fu skills. + +These are the values that you should use when forwarding a port to your +Barotrauma server: + +Game port (used to communicate with clients) + Service/Application: barotrauma + External Port: The port you have selected for your server (27015 by default) + Internal Port: The port you have selected for your server (27015 by default) + Protocol: UDP + +Query port (used to communicate with Steam) + Service/Application: barotrauma + External Port: The port you have selected for your server (27016 by default) + Internal Port: The port you have selected for your server (27016 by default) + Protocol: UDP \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/RestSharp.dll b/Lua For Barotrauma/Binary/RestSharp.dll new file mode 100644 index 0000000..97b8ec5 Binary files /dev/null and b/Lua For Barotrauma/Binary/RestSharp.dll differ diff --git a/Lua For Barotrauma/Binary/SOS_README.md b/Lua For Barotrauma/Binary/SOS_README.md new file mode 100644 index 0000000..298d766 --- /dev/null +++ b/Lua For Barotrauma/Binary/SOS_README.md @@ -0,0 +1,5 @@ +SOS and other diagnostic tools now ship of band and work with any version of the .NET Core runtime. + +SOS has moved to the diagnostics repo here: https://github.com/dotnet/diagnostics.git. + +Instructions to install SOS: https://github.com/dotnet/diagnostics#installing-sos. diff --git a/Lua For Barotrauma/Binary/SQLite.Interop.dll b/Lua For Barotrauma/Binary/SQLite.Interop.dll new file mode 100644 index 0000000..4a3addd Binary files /dev/null and b/Lua For Barotrauma/Binary/SQLite.Interop.dll differ diff --git a/Lua For Barotrauma/Binary/SharpDX.DXGI.dll b/Lua For Barotrauma/Binary/SharpDX.DXGI.dll new file mode 100644 index 0000000..d209e85 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpDX.DXGI.dll differ diff --git a/Lua For Barotrauma/Binary/SharpDX.Direct2D1.dll b/Lua For Barotrauma/Binary/SharpDX.Direct2D1.dll new file mode 100644 index 0000000..a034027 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpDX.Direct2D1.dll differ diff --git a/Lua For Barotrauma/Binary/SharpDX.Direct3D11.dll b/Lua For Barotrauma/Binary/SharpDX.Direct3D11.dll new file mode 100644 index 0000000..29a7201 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpDX.Direct3D11.dll differ diff --git a/Lua For Barotrauma/Binary/SharpDX.XInput.dll b/Lua For Barotrauma/Binary/SharpDX.XInput.dll new file mode 100644 index 0000000..0697304 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpDX.XInput.dll differ diff --git a/Lua For Barotrauma/Binary/SharpDX.dll b/Lua For Barotrauma/Binary/SharpDX.dll new file mode 100644 index 0000000..0344605 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpDX.dll differ diff --git a/Lua For Barotrauma/Binary/SharpFont.NetStandard.dll b/Lua For Barotrauma/Binary/SharpFont.NetStandard.dll new file mode 100644 index 0000000..3b0f63d Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpFont.NetStandard.dll differ diff --git a/Lua For Barotrauma/Binary/SharpFont.NetStandard.pdb b/Lua For Barotrauma/Binary/SharpFont.NetStandard.pdb new file mode 100644 index 0000000..d1a2c68 Binary files /dev/null and b/Lua For Barotrauma/Binary/SharpFont.NetStandard.pdb differ diff --git a/Lua For Barotrauma/Binary/Sigil.dll b/Lua For Barotrauma/Binary/Sigil.dll new file mode 100644 index 0000000..1b459ef Binary files /dev/null and b/Lua For Barotrauma/Binary/Sigil.dll differ diff --git a/Lua For Barotrauma/Binary/System.AppContext.dll b/Lua For Barotrauma/Binary/System.AppContext.dll new file mode 100644 index 0000000..935ccd3 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.AppContext.dll differ diff --git a/Lua For Barotrauma/Binary/System.Buffers.dll b/Lua For Barotrauma/Binary/System.Buffers.dll new file mode 100644 index 0000000..ec89650 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Buffers.dll differ diff --git a/Lua For Barotrauma/Binary/System.Collections.Concurrent.dll b/Lua For Barotrauma/Binary/System.Collections.Concurrent.dll new file mode 100644 index 0000000..9f1c22b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Collections.Concurrent.dll differ diff --git a/Lua For Barotrauma/Binary/System.Collections.Immutable.dll b/Lua For Barotrauma/Binary/System.Collections.Immutable.dll new file mode 100644 index 0000000..35e52fe Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Collections.Immutable.dll differ diff --git a/Lua For Barotrauma/Binary/System.Collections.NonGeneric.dll b/Lua For Barotrauma/Binary/System.Collections.NonGeneric.dll new file mode 100644 index 0000000..6fd2c22 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Collections.NonGeneric.dll differ diff --git a/Lua For Barotrauma/Binary/System.Collections.Specialized.dll b/Lua For Barotrauma/Binary/System.Collections.Specialized.dll new file mode 100644 index 0000000..fa6669e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Collections.Specialized.dll differ diff --git a/Lua For Barotrauma/Binary/System.Collections.dll b/Lua For Barotrauma/Binary/System.Collections.dll new file mode 100644 index 0000000..995fe6c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Collections.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.Annotations.dll b/Lua For Barotrauma/Binary/System.ComponentModel.Annotations.dll new file mode 100644 index 0000000..39dc4fe Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.Annotations.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.DataAnnotations.dll b/Lua For Barotrauma/Binary/System.ComponentModel.DataAnnotations.dll new file mode 100644 index 0000000..f25f4a5 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.DataAnnotations.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.EventBasedAsync.dll b/Lua For Barotrauma/Binary/System.ComponentModel.EventBasedAsync.dll new file mode 100644 index 0000000..4b9afb3 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.EventBasedAsync.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.Primitives.dll b/Lua For Barotrauma/Binary/System.ComponentModel.Primitives.dll new file mode 100644 index 0000000..9e58615 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.TypeConverter.dll b/Lua For Barotrauma/Binary/System.ComponentModel.TypeConverter.dll new file mode 100644 index 0000000..374db5b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.TypeConverter.dll differ diff --git a/Lua For Barotrauma/Binary/System.ComponentModel.dll b/Lua For Barotrauma/Binary/System.ComponentModel.dll new file mode 100644 index 0000000..34a4808 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ComponentModel.dll differ diff --git a/Lua For Barotrauma/Binary/System.Configuration.dll b/Lua For Barotrauma/Binary/System.Configuration.dll new file mode 100644 index 0000000..3f721d0 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Configuration.dll differ diff --git a/Lua For Barotrauma/Binary/System.Console.dll b/Lua For Barotrauma/Binary/System.Console.dll new file mode 100644 index 0000000..a9a8af5 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Console.dll differ diff --git a/Lua For Barotrauma/Binary/System.Core.dll b/Lua For Barotrauma/Binary/System.Core.dll new file mode 100644 index 0000000..0ac77e3 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Core.dll differ diff --git a/Lua For Barotrauma/Binary/System.Data.Common.dll b/Lua For Barotrauma/Binary/System.Data.Common.dll new file mode 100644 index 0000000..78d0d4e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Data.Common.dll differ diff --git a/Lua For Barotrauma/Binary/System.Data.DataSetExtensions.dll b/Lua For Barotrauma/Binary/System.Data.DataSetExtensions.dll new file mode 100644 index 0000000..81c783b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Data.DataSetExtensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Data.SQLite.dll b/Lua For Barotrauma/Binary/System.Data.SQLite.dll new file mode 100644 index 0000000..c2b0b8e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Data.SQLite.dll differ diff --git a/Lua For Barotrauma/Binary/System.Data.dll b/Lua For Barotrauma/Binary/System.Data.dll new file mode 100644 index 0000000..73fbc5d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Data.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.Contracts.dll b/Lua For Barotrauma/Binary/System.Diagnostics.Contracts.dll new file mode 100644 index 0000000..6c24a49 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.Contracts.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.Debug.dll b/Lua For Barotrauma/Binary/System.Diagnostics.Debug.dll new file mode 100644 index 0000000..6a88d24 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.Debug.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.DiagnosticSource.dll b/Lua For Barotrauma/Binary/System.Diagnostics.DiagnosticSource.dll new file mode 100644 index 0000000..0e3daf5 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.DiagnosticSource.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.FileVersionInfo.dll b/Lua For Barotrauma/Binary/System.Diagnostics.FileVersionInfo.dll new file mode 100644 index 0000000..db66a6c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.FileVersionInfo.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.Process.dll b/Lua For Barotrauma/Binary/System.Diagnostics.Process.dll new file mode 100644 index 0000000..32b7f1b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.Process.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.StackTrace.dll b/Lua For Barotrauma/Binary/System.Diagnostics.StackTrace.dll new file mode 100644 index 0000000..1a72865 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.StackTrace.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.TextWriterTraceListener.dll b/Lua For Barotrauma/Binary/System.Diagnostics.TextWriterTraceListener.dll new file mode 100644 index 0000000..bd303cd Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.TextWriterTraceListener.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.Tools.dll b/Lua For Barotrauma/Binary/System.Diagnostics.Tools.dll new file mode 100644 index 0000000..c46ca92 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.Tools.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.TraceSource.dll b/Lua For Barotrauma/Binary/System.Diagnostics.TraceSource.dll new file mode 100644 index 0000000..f182c79 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.TraceSource.dll differ diff --git a/Lua For Barotrauma/Binary/System.Diagnostics.Tracing.dll b/Lua For Barotrauma/Binary/System.Diagnostics.Tracing.dll new file mode 100644 index 0000000..7cd5cb9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Diagnostics.Tracing.dll differ diff --git a/Lua For Barotrauma/Binary/System.Drawing.Primitives.dll b/Lua For Barotrauma/Binary/System.Drawing.Primitives.dll new file mode 100644 index 0000000..6b83e3e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Drawing.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.Drawing.dll b/Lua For Barotrauma/Binary/System.Drawing.dll new file mode 100644 index 0000000..c4cacba Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Drawing.dll differ diff --git a/Lua For Barotrauma/Binary/System.Dynamic.Runtime.dll b/Lua For Barotrauma/Binary/System.Dynamic.Runtime.dll new file mode 100644 index 0000000..e363125 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Dynamic.Runtime.dll differ diff --git a/Lua For Barotrauma/Binary/System.Formats.Asn1.dll b/Lua For Barotrauma/Binary/System.Formats.Asn1.dll new file mode 100644 index 0000000..29c03ae Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Formats.Asn1.dll differ diff --git a/Lua For Barotrauma/Binary/System.Globalization.Calendars.dll b/Lua For Barotrauma/Binary/System.Globalization.Calendars.dll new file mode 100644 index 0000000..16f9fd1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Globalization.Calendars.dll differ diff --git a/Lua For Barotrauma/Binary/System.Globalization.Extensions.dll b/Lua For Barotrauma/Binary/System.Globalization.Extensions.dll new file mode 100644 index 0000000..788d730 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Globalization.Extensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Globalization.dll b/Lua For Barotrauma/Binary/System.Globalization.dll new file mode 100644 index 0000000..a84d84f Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Globalization.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Compression.Brotli.dll b/Lua For Barotrauma/Binary/System.IO.Compression.Brotli.dll new file mode 100644 index 0000000..6d15705 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Compression.Brotli.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Compression.FileSystem.dll b/Lua For Barotrauma/Binary/System.IO.Compression.FileSystem.dll new file mode 100644 index 0000000..51e71a7 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Compression.FileSystem.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Compression.Native.dll b/Lua For Barotrauma/Binary/System.IO.Compression.Native.dll new file mode 100644 index 0000000..4fede45 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Compression.Native.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Compression.ZipFile.dll b/Lua For Barotrauma/Binary/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..d86f301 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Compression.ZipFile.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Compression.dll b/Lua For Barotrauma/Binary/System.IO.Compression.dll new file mode 100644 index 0000000..e5917a6 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Compression.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.FileSystem.AccessControl.dll b/Lua For Barotrauma/Binary/System.IO.FileSystem.AccessControl.dll new file mode 100644 index 0000000..c4d55fc Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.FileSystem.AccessControl.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.FileSystem.DriveInfo.dll b/Lua For Barotrauma/Binary/System.IO.FileSystem.DriveInfo.dll new file mode 100644 index 0000000..3ea2b17 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.FileSystem.DriveInfo.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.FileSystem.Primitives.dll b/Lua For Barotrauma/Binary/System.IO.FileSystem.Primitives.dll new file mode 100644 index 0000000..6400d79 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.FileSystem.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.FileSystem.Watcher.dll b/Lua For Barotrauma/Binary/System.IO.FileSystem.Watcher.dll new file mode 100644 index 0000000..8d56ff9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.FileSystem.Watcher.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.FileSystem.dll b/Lua For Barotrauma/Binary/System.IO.FileSystem.dll new file mode 100644 index 0000000..70debd3 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.FileSystem.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.IsolatedStorage.dll b/Lua For Barotrauma/Binary/System.IO.IsolatedStorage.dll new file mode 100644 index 0000000..be3f979 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.IsolatedStorage.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.MemoryMappedFiles.dll b/Lua For Barotrauma/Binary/System.IO.MemoryMappedFiles.dll new file mode 100644 index 0000000..ba5e636 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.MemoryMappedFiles.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Pipes.AccessControl.dll b/Lua For Barotrauma/Binary/System.IO.Pipes.AccessControl.dll new file mode 100644 index 0000000..dc799db Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Pipes.AccessControl.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.Pipes.dll b/Lua For Barotrauma/Binary/System.IO.Pipes.dll new file mode 100644 index 0000000..9af9300 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.Pipes.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.UnmanagedMemoryStream.dll b/Lua For Barotrauma/Binary/System.IO.UnmanagedMemoryStream.dll new file mode 100644 index 0000000..0307865 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.UnmanagedMemoryStream.dll differ diff --git a/Lua For Barotrauma/Binary/System.IO.dll b/Lua For Barotrauma/Binary/System.IO.dll new file mode 100644 index 0000000..f7fc99a Binary files /dev/null and b/Lua For Barotrauma/Binary/System.IO.dll differ diff --git a/Lua For Barotrauma/Binary/System.Linq.Expressions.dll b/Lua For Barotrauma/Binary/System.Linq.Expressions.dll new file mode 100644 index 0000000..5d21b2a Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Linq.Expressions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Linq.Parallel.dll b/Lua For Barotrauma/Binary/System.Linq.Parallel.dll new file mode 100644 index 0000000..644534f Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Linq.Parallel.dll differ diff --git a/Lua For Barotrauma/Binary/System.Linq.Queryable.dll b/Lua For Barotrauma/Binary/System.Linq.Queryable.dll new file mode 100644 index 0000000..f6df2b1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Linq.Queryable.dll differ diff --git a/Lua For Barotrauma/Binary/System.Linq.dll b/Lua For Barotrauma/Binary/System.Linq.dll new file mode 100644 index 0000000..475c753 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Linq.dll differ diff --git a/Lua For Barotrauma/Binary/System.Memory.dll b/Lua For Barotrauma/Binary/System.Memory.dll new file mode 100644 index 0000000..9d0ac11 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Memory.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Http.Json.dll b/Lua For Barotrauma/Binary/System.Net.Http.Json.dll new file mode 100644 index 0000000..2a09b74 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Http.Json.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Http.dll b/Lua For Barotrauma/Binary/System.Net.Http.dll new file mode 100644 index 0000000..9fff653 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Http.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.HttpListener.dll b/Lua For Barotrauma/Binary/System.Net.HttpListener.dll new file mode 100644 index 0000000..74aad4e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.HttpListener.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Mail.dll b/Lua For Barotrauma/Binary/System.Net.Mail.dll new file mode 100644 index 0000000..0964924 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Mail.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.NameResolution.dll b/Lua For Barotrauma/Binary/System.Net.NameResolution.dll new file mode 100644 index 0000000..df743ec Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.NameResolution.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.NetworkInformation.dll b/Lua For Barotrauma/Binary/System.Net.NetworkInformation.dll new file mode 100644 index 0000000..685aa29 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.NetworkInformation.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Ping.dll b/Lua For Barotrauma/Binary/System.Net.Ping.dll new file mode 100644 index 0000000..7e69a58 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Ping.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Primitives.dll b/Lua For Barotrauma/Binary/System.Net.Primitives.dll new file mode 100644 index 0000000..f2b088d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Quic.dll b/Lua For Barotrauma/Binary/System.Net.Quic.dll new file mode 100644 index 0000000..ad7a450 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Quic.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Requests.dll b/Lua For Barotrauma/Binary/System.Net.Requests.dll new file mode 100644 index 0000000..b79723c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Requests.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Security.dll b/Lua For Barotrauma/Binary/System.Net.Security.dll new file mode 100644 index 0000000..278eb02 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Security.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.ServicePoint.dll b/Lua For Barotrauma/Binary/System.Net.ServicePoint.dll new file mode 100644 index 0000000..e40bc37 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.ServicePoint.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.Sockets.dll b/Lua For Barotrauma/Binary/System.Net.Sockets.dll new file mode 100644 index 0000000..68158d2 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.Sockets.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.WebClient.dll b/Lua For Barotrauma/Binary/System.Net.WebClient.dll new file mode 100644 index 0000000..4821f84 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.WebClient.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.WebHeaderCollection.dll b/Lua For Barotrauma/Binary/System.Net.WebHeaderCollection.dll new file mode 100644 index 0000000..b92823e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.WebHeaderCollection.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.WebProxy.dll b/Lua For Barotrauma/Binary/System.Net.WebProxy.dll new file mode 100644 index 0000000..552984d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.WebProxy.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.WebSockets.Client.dll b/Lua For Barotrauma/Binary/System.Net.WebSockets.Client.dll new file mode 100644 index 0000000..a09b231 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.WebSockets.Client.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.WebSockets.dll b/Lua For Barotrauma/Binary/System.Net.WebSockets.dll new file mode 100644 index 0000000..b918bff Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.WebSockets.dll differ diff --git a/Lua For Barotrauma/Binary/System.Net.dll b/Lua For Barotrauma/Binary/System.Net.dll new file mode 100644 index 0000000..25527f2 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Net.dll differ diff --git a/Lua For Barotrauma/Binary/System.Numerics.Vectors.dll b/Lua For Barotrauma/Binary/System.Numerics.Vectors.dll new file mode 100644 index 0000000..114e66c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Numerics.Vectors.dll differ diff --git a/Lua For Barotrauma/Binary/System.Numerics.dll b/Lua For Barotrauma/Binary/System.Numerics.dll new file mode 100644 index 0000000..d60bd9e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Numerics.dll differ diff --git a/Lua For Barotrauma/Binary/System.ObjectModel.dll b/Lua For Barotrauma/Binary/System.ObjectModel.dll new file mode 100644 index 0000000..7046d29 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ObjectModel.dll differ diff --git a/Lua For Barotrauma/Binary/System.Private.CoreLib.dll b/Lua For Barotrauma/Binary/System.Private.CoreLib.dll new file mode 100644 index 0000000..92af947 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Private.CoreLib.dll differ diff --git a/Lua For Barotrauma/Binary/System.Private.DataContractSerialization.dll b/Lua For Barotrauma/Binary/System.Private.DataContractSerialization.dll new file mode 100644 index 0000000..dad7648 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Private.DataContractSerialization.dll differ diff --git a/Lua For Barotrauma/Binary/System.Private.Uri.dll b/Lua For Barotrauma/Binary/System.Private.Uri.dll new file mode 100644 index 0000000..6843739 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Private.Uri.dll differ diff --git a/Lua For Barotrauma/Binary/System.Private.Xml.Linq.dll b/Lua For Barotrauma/Binary/System.Private.Xml.Linq.dll new file mode 100644 index 0000000..20003fb Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Private.Xml.Linq.dll differ diff --git a/Lua For Barotrauma/Binary/System.Private.Xml.dll b/Lua For Barotrauma/Binary/System.Private.Xml.dll new file mode 100644 index 0000000..c696828 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Private.Xml.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.DispatchProxy.dll b/Lua For Barotrauma/Binary/System.Reflection.DispatchProxy.dll new file mode 100644 index 0000000..16db75a Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.DispatchProxy.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Emit.ILGeneration.dll b/Lua For Barotrauma/Binary/System.Reflection.Emit.ILGeneration.dll new file mode 100644 index 0000000..2a52612 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Emit.ILGeneration.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Emit.Lightweight.dll b/Lua For Barotrauma/Binary/System.Reflection.Emit.Lightweight.dll new file mode 100644 index 0000000..f09c7e9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Emit.Lightweight.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Emit.dll b/Lua For Barotrauma/Binary/System.Reflection.Emit.dll new file mode 100644 index 0000000..491c9ab Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Emit.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Extensions.dll b/Lua For Barotrauma/Binary/System.Reflection.Extensions.dll new file mode 100644 index 0000000..f0670c9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Extensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Metadata.dll b/Lua For Barotrauma/Binary/System.Reflection.Metadata.dll new file mode 100644 index 0000000..c68cd1d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Metadata.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.Primitives.dll b/Lua For Barotrauma/Binary/System.Reflection.Primitives.dll new file mode 100644 index 0000000..61e48a0 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.TypeExtensions.dll b/Lua For Barotrauma/Binary/System.Reflection.TypeExtensions.dll new file mode 100644 index 0000000..e4b7884 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.TypeExtensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Reflection.dll b/Lua For Barotrauma/Binary/System.Reflection.dll new file mode 100644 index 0000000..378118b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Reflection.dll differ diff --git a/Lua For Barotrauma/Binary/System.Resources.Reader.dll b/Lua For Barotrauma/Binary/System.Resources.Reader.dll new file mode 100644 index 0000000..9e6e74e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Resources.Reader.dll differ diff --git a/Lua For Barotrauma/Binary/System.Resources.ResourceManager.dll b/Lua For Barotrauma/Binary/System.Resources.ResourceManager.dll new file mode 100644 index 0000000..6af98aa Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Resources.ResourceManager.dll differ diff --git a/Lua For Barotrauma/Binary/System.Resources.Writer.dll b/Lua For Barotrauma/Binary/System.Resources.Writer.dll new file mode 100644 index 0000000..b844501 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Resources.Writer.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.Unsafe.dll b/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000..8bed706 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.VisualC.dll b/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.VisualC.dll new file mode 100644 index 0000000..c89e39f Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.CompilerServices.VisualC.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Extensions.dll b/Lua For Barotrauma/Binary/System.Runtime.Extensions.dll new file mode 100644 index 0000000..a3c43d1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Extensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Handles.dll b/Lua For Barotrauma/Binary/System.Runtime.Handles.dll new file mode 100644 index 0000000..1549581 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Handles.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.InteropServices.RuntimeInformation.dll b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.RuntimeInformation.dll new file mode 100644 index 0000000..c9419be Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.RuntimeInformation.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.InteropServices.WindowsRuntime.dll b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.WindowsRuntime.dll new file mode 100644 index 0000000..5f59255 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.WindowsRuntime.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.InteropServices.dll b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.dll new file mode 100644 index 0000000..b84749e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.InteropServices.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Intrinsics.dll b/Lua For Barotrauma/Binary/System.Runtime.Intrinsics.dll new file mode 100644 index 0000000..19dfa10 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Intrinsics.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Loader.dll b/Lua For Barotrauma/Binary/System.Runtime.Loader.dll new file mode 100644 index 0000000..54baed8 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Loader.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Numerics.dll b/Lua For Barotrauma/Binary/System.Runtime.Numerics.dll new file mode 100644 index 0000000..c5a16f1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Numerics.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Serialization.Formatters.dll b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Formatters.dll new file mode 100644 index 0000000..6a07fa9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Formatters.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Serialization.Json.dll b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Json.dll new file mode 100644 index 0000000..51067fd Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Json.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Serialization.Primitives.dll b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Primitives.dll new file mode 100644 index 0000000..b70d4e6 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Serialization.Xml.dll b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Xml.dll new file mode 100644 index 0000000..0ed0653 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Serialization.Xml.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.Serialization.dll b/Lua For Barotrauma/Binary/System.Runtime.Serialization.dll new file mode 100644 index 0000000..c39a71d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.Serialization.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.UI.Xaml.dll b/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.UI.Xaml.dll new file mode 100644 index 0000000..1ccfabd Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.UI.Xaml.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.dll b/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.dll new file mode 100644 index 0000000..e6eecf7 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.WindowsRuntime.dll differ diff --git a/Lua For Barotrauma/Binary/System.Runtime.dll b/Lua For Barotrauma/Binary/System.Runtime.dll new file mode 100644 index 0000000..9537460 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Runtime.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.AccessControl.dll b/Lua For Barotrauma/Binary/System.Security.AccessControl.dll new file mode 100644 index 0000000..885dc75 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.AccessControl.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Claims.dll b/Lua For Barotrauma/Binary/System.Security.Claims.dll new file mode 100644 index 0000000..de803d7 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Claims.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.Algorithms.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.Algorithms.dll new file mode 100644 index 0000000..c612199 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.Algorithms.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.Cng.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.Cng.dll new file mode 100644 index 0000000..7c9d791 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.Cng.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.Csp.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.Csp.dll new file mode 100644 index 0000000..9f6f41b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.Csp.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.Encoding.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.Encoding.dll new file mode 100644 index 0000000..5ceb20c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.Encoding.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.OpenSsl.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.OpenSsl.dll new file mode 100644 index 0000000..e573d47 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.OpenSsl.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.Primitives.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.Primitives.dll new file mode 100644 index 0000000..564ae99 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.Primitives.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Cryptography.X509Certificates.dll b/Lua For Barotrauma/Binary/System.Security.Cryptography.X509Certificates.dll new file mode 100644 index 0000000..ccd8cc1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Cryptography.X509Certificates.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Principal.Windows.dll b/Lua For Barotrauma/Binary/System.Security.Principal.Windows.dll new file mode 100644 index 0000000..b0e4f31 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Principal.Windows.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.Principal.dll b/Lua For Barotrauma/Binary/System.Security.Principal.dll new file mode 100644 index 0000000..8ea6dcc Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.Principal.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.SecureString.dll b/Lua For Barotrauma/Binary/System.Security.SecureString.dll new file mode 100644 index 0000000..78ac1c7 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.SecureString.dll differ diff --git a/Lua For Barotrauma/Binary/System.Security.dll b/Lua For Barotrauma/Binary/System.Security.dll new file mode 100644 index 0000000..edf3ec9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Security.dll differ diff --git a/Lua For Barotrauma/Binary/System.ServiceModel.Web.dll b/Lua For Barotrauma/Binary/System.ServiceModel.Web.dll new file mode 100644 index 0000000..6f21709 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ServiceModel.Web.dll differ diff --git a/Lua For Barotrauma/Binary/System.ServiceProcess.dll b/Lua For Barotrauma/Binary/System.ServiceProcess.dll new file mode 100644 index 0000000..883cf11 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ServiceProcess.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.Encoding.CodePages.dll b/Lua For Barotrauma/Binary/System.Text.Encoding.CodePages.dll new file mode 100644 index 0000000..24b7812 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.Encoding.CodePages.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.Encoding.Extensions.dll b/Lua For Barotrauma/Binary/System.Text.Encoding.Extensions.dll new file mode 100644 index 0000000..5cd7d18 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.Encoding.Extensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.Encoding.dll b/Lua For Barotrauma/Binary/System.Text.Encoding.dll new file mode 100644 index 0000000..78d9bd1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.Encoding.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.Encodings.Web.dll b/Lua For Barotrauma/Binary/System.Text.Encodings.Web.dll new file mode 100644 index 0000000..b13a6fe Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.Encodings.Web.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.Json.dll b/Lua For Barotrauma/Binary/System.Text.Json.dll new file mode 100644 index 0000000..a76270d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.Json.dll differ diff --git a/Lua For Barotrauma/Binary/System.Text.RegularExpressions.dll b/Lua For Barotrauma/Binary/System.Text.RegularExpressions.dll new file mode 100644 index 0000000..8f317b1 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Text.RegularExpressions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Channels.dll b/Lua For Barotrauma/Binary/System.Threading.Channels.dll new file mode 100644 index 0000000..6b57ca9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Channels.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Overlapped.dll b/Lua For Barotrauma/Binary/System.Threading.Overlapped.dll new file mode 100644 index 0000000..e96fd03 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Overlapped.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Tasks.Dataflow.dll b/Lua For Barotrauma/Binary/System.Threading.Tasks.Dataflow.dll new file mode 100644 index 0000000..ffd992b Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Tasks.Dataflow.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Tasks.Extensions.dll b/Lua For Barotrauma/Binary/System.Threading.Tasks.Extensions.dll new file mode 100644 index 0000000..1f42746 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Tasks.Extensions.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Tasks.Parallel.dll b/Lua For Barotrauma/Binary/System.Threading.Tasks.Parallel.dll new file mode 100644 index 0000000..e11eeaa Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Tasks.Parallel.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Tasks.dll b/Lua For Barotrauma/Binary/System.Threading.Tasks.dll new file mode 100644 index 0000000..3272dfb Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Tasks.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Thread.dll b/Lua For Barotrauma/Binary/System.Threading.Thread.dll new file mode 100644 index 0000000..610fe26 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Thread.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.ThreadPool.dll b/Lua For Barotrauma/Binary/System.Threading.ThreadPool.dll new file mode 100644 index 0000000..9e38c4d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.ThreadPool.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.Timer.dll b/Lua For Barotrauma/Binary/System.Threading.Timer.dll new file mode 100644 index 0000000..3510ec9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.Timer.dll differ diff --git a/Lua For Barotrauma/Binary/System.Threading.dll b/Lua For Barotrauma/Binary/System.Threading.dll new file mode 100644 index 0000000..bb95616 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Threading.dll differ diff --git a/Lua For Barotrauma/Binary/System.Transactions.Local.dll b/Lua For Barotrauma/Binary/System.Transactions.Local.dll new file mode 100644 index 0000000..e3385d3 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Transactions.Local.dll differ diff --git a/Lua For Barotrauma/Binary/System.Transactions.dll b/Lua For Barotrauma/Binary/System.Transactions.dll new file mode 100644 index 0000000..74b538f Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Transactions.dll differ diff --git a/Lua For Barotrauma/Binary/System.ValueTuple.dll b/Lua For Barotrauma/Binary/System.ValueTuple.dll new file mode 100644 index 0000000..79af4ed Binary files /dev/null and b/Lua For Barotrauma/Binary/System.ValueTuple.dll differ diff --git a/Lua For Barotrauma/Binary/System.Web.HttpUtility.dll b/Lua For Barotrauma/Binary/System.Web.HttpUtility.dll new file mode 100644 index 0000000..b03989f Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Web.HttpUtility.dll differ diff --git a/Lua For Barotrauma/Binary/System.Web.dll b/Lua For Barotrauma/Binary/System.Web.dll new file mode 100644 index 0000000..a5f86ef Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Web.dll differ diff --git a/Lua For Barotrauma/Binary/System.Windows.dll b/Lua For Barotrauma/Binary/System.Windows.dll new file mode 100644 index 0000000..65d2326 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Windows.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.Linq.dll b/Lua For Barotrauma/Binary/System.Xml.Linq.dll new file mode 100644 index 0000000..6ce3c48 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.Linq.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.ReaderWriter.dll b/Lua For Barotrauma/Binary/System.Xml.ReaderWriter.dll new file mode 100644 index 0000000..1ec477e Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.ReaderWriter.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.Serialization.dll b/Lua For Barotrauma/Binary/System.Xml.Serialization.dll new file mode 100644 index 0000000..f4dc46c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.Serialization.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.XDocument.dll b/Lua For Barotrauma/Binary/System.Xml.XDocument.dll new file mode 100644 index 0000000..8d38d7d Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.XDocument.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.XPath.XDocument.dll b/Lua For Barotrauma/Binary/System.Xml.XPath.XDocument.dll new file mode 100644 index 0000000..7d5061c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.XPath.XDocument.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.XPath.dll b/Lua For Barotrauma/Binary/System.Xml.XPath.dll new file mode 100644 index 0000000..07e9d2c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.XPath.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.XmlDocument.dll b/Lua For Barotrauma/Binary/System.Xml.XmlDocument.dll new file mode 100644 index 0000000..9dae020 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.XmlDocument.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.XmlSerializer.dll b/Lua For Barotrauma/Binary/System.Xml.XmlSerializer.dll new file mode 100644 index 0000000..27949a9 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.XmlSerializer.dll differ diff --git a/Lua For Barotrauma/Binary/System.Xml.dll b/Lua For Barotrauma/Binary/System.Xml.dll new file mode 100644 index 0000000..a61f797 Binary files /dev/null and b/Lua For Barotrauma/Binary/System.Xml.dll differ diff --git a/Lua For Barotrauma/Binary/System.dll b/Lua For Barotrauma/Binary/System.dll new file mode 100644 index 0000000..7a4a80c Binary files /dev/null and b/Lua For Barotrauma/Binary/System.dll differ diff --git a/Lua For Barotrauma/Binary/WindowsBase.dll b/Lua For Barotrauma/Binary/WindowsBase.dll new file mode 100644 index 0000000..9556859 Binary files /dev/null and b/Lua For Barotrauma/Binary/WindowsBase.dll differ diff --git a/Lua For Barotrauma/Binary/XNATypes.dll b/Lua For Barotrauma/Binary/XNATypes.dll new file mode 100644 index 0000000..d7270ff Binary files /dev/null and b/Lua For Barotrauma/Binary/XNATypes.dll differ diff --git a/Lua For Barotrauma/Binary/XNATypes.pdb b/Lua For Barotrauma/Binary/XNATypes.pdb new file mode 100644 index 0000000..2099a0a Binary files /dev/null and b/Lua For Barotrauma/Binary/XNATypes.pdb differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-1-0.dll new file mode 100644 index 0000000..726b975 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-2-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-2-0.dll new file mode 100644 index 0000000..b9d1ed4 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-console-l1-2-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-datetime-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-datetime-l1-1-0.dll new file mode 100644 index 0000000..f2ecfa7 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-datetime-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-debug-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-debug-l1-1-0.dll new file mode 100644 index 0000000..7bd075b Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-debug-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-errorhandling-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-errorhandling-l1-1-0.dll new file mode 100644 index 0000000..3bafba9 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-errorhandling-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-fibers-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-fibers-l1-1-0.dll new file mode 100644 index 0000000..651ffe1 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-fibers-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-1-0.dll new file mode 100644 index 0000000..12bf0b6 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-2-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-2-0.dll new file mode 100644 index 0000000..da64db3 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-file-l1-2-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-file-l2-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-file-l2-1-0.dll new file mode 100644 index 0000000..9246b98 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-file-l2-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-handle-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-handle-l1-1-0.dll new file mode 100644 index 0000000..c96e31d Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-handle-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-heap-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-heap-l1-1-0.dll new file mode 100644 index 0000000..baa932f Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-heap-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-interlocked-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-interlocked-l1-1-0.dll new file mode 100644 index 0000000..7aa0639 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-interlocked-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-libraryloader-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-libraryloader-l1-1-0.dll new file mode 100644 index 0000000..ddd5e27 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-libraryloader-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-localization-l1-2-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-localization-l1-2-0.dll new file mode 100644 index 0000000..7b90b7c Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-localization-l1-2-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-memory-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-memory-l1-1-0.dll new file mode 100644 index 0000000..63e54f3 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-memory-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-namedpipe-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-namedpipe-l1-1-0.dll new file mode 100644 index 0000000..37e956e Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-namedpipe-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-processenvironment-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-processenvironment-l1-1-0.dll new file mode 100644 index 0000000..a2f3605 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-processenvironment-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-0.dll new file mode 100644 index 0000000..f4d3a03 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-1.dll b/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-1.dll new file mode 100644 index 0000000..7bc40e0 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-processthreads-l1-1-1.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-profile-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-profile-l1-1-0.dll new file mode 100644 index 0000000..da2b687 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-profile-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-rtlsupport-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-rtlsupport-l1-1-0.dll new file mode 100644 index 0000000..ae6dce5 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-rtlsupport-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-string-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-string-l1-1-0.dll new file mode 100644 index 0000000..32b52be Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-string-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-1-0.dll new file mode 100644 index 0000000..b88f76a Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-2-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-2-0.dll new file mode 100644 index 0000000..a17135a Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-synch-l1-2-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-sysinfo-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-sysinfo-l1-1-0.dll new file mode 100644 index 0000000..527d1a1 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-sysinfo-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-timezone-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-timezone-l1-1-0.dll new file mode 100644 index 0000000..bab2d02 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-timezone-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-core-util-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-core-util-l1-1-0.dll new file mode 100644 index 0000000..080a9c9 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-core-util-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-conio-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-conio-l1-1-0.dll new file mode 100644 index 0000000..2355a62 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-conio-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-convert-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-convert-l1-1-0.dll new file mode 100644 index 0000000..ddd2b4c Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-convert-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-environment-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-environment-l1-1-0.dll new file mode 100644 index 0000000..e2fe9ef Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-environment-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-filesystem-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-filesystem-l1-1-0.dll new file mode 100644 index 0000000..97ea465 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-filesystem-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-heap-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-heap-l1-1-0.dll new file mode 100644 index 0000000..4e3af05 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-heap-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-locale-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-locale-l1-1-0.dll new file mode 100644 index 0000000..5fcd98b Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-locale-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-math-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-math-l1-1-0.dll new file mode 100644 index 0000000..c3f2800 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-math-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-multibyte-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-multibyte-l1-1-0.dll new file mode 100644 index 0000000..e86ce81 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-multibyte-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-private-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-private-l1-1-0.dll new file mode 100644 index 0000000..62c45dd Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-private-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-process-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-process-l1-1-0.dll new file mode 100644 index 0000000..bc346dc Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-process-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-runtime-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-runtime-l1-1-0.dll new file mode 100644 index 0000000..d0a43f8 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-runtime-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-stdio-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-stdio-l1-1-0.dll new file mode 100644 index 0000000..59e68c0 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-stdio-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-string-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-string-l1-1-0.dll new file mode 100644 index 0000000..08015e2 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-string-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-time-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-time-l1-1-0.dll new file mode 100644 index 0000000..6e3ba53 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-time-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/api-ms-win-crt-utility-l1-1-0.dll b/Lua For Barotrauma/Binary/api-ms-win-crt-utility-l1-1-0.dll new file mode 100644 index 0000000..eaa7204 Binary files /dev/null and b/Lua For Barotrauma/Binary/api-ms-win-crt-utility-l1-1-0.dll differ diff --git a/Lua For Barotrauma/Binary/changelog.txt b/Lua For Barotrauma/Binary/changelog.txt new file mode 100644 index 0000000..965237f --- /dev/null +++ b/Lua For Barotrauma/Binary/changelog.txt @@ -0,0 +1,10648 @@ +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.7.7.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed damage modifiers not working on creature variants (meaning that e.g. mudraptor hatchlings and veterans did the same amount of damage as normal mudraptors). +- Fixed crew list appearing empty when freecaming in single player. +- Fixed alien coils blocking the boss at the end of the campaign. +- Fixed a waypoint issue in Camel. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.7.6.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Changes: +- Added a "toggle run" input (so you no longer have to keep holding shift to run). Not bound to anything by default, but can be set in the settings menu. +- Improvements to environment visuals: the inside of level walls fades to black to make the texture tiling less obvious when zoomed far out, improvements to the shapes of the level walls (more natural shapes, less long and straight wall segments). +- Ruin scan missions show a progress bar indicating the status of the scans. +- Made dry or partially dry rooms more common in wrecks. +- Option to change the sound of the alarm sirens to a claxon horn sound (the "traditional" AWOOGA-AWOOGA submarine alarm sound). +- "giveaffliction" console command now auto-completes identifiers as well as names. +- Reworked Berilia (kudos to WJohnston): layout improvements, added a bottom docking port, more windows, replaced cameras with searchlights, simplified battery setup and increased reactor output, minor visual improvements and a lot of miscellaneous tweaks. +- Reworked Kastrull drone (less ugly, a little sturdier, the ballast can be accessed through a hatch). +- New playstyle banners. +- Added an option in the settings to launch the game on a specific display. +- Option to refresh the available audio devices (both playback and input devices) in the game settings. The game should now also automatically attempt switch to another device if the current one is disconnected. However, whether this can be done automatically can depend on the audio device, driver and the operating system, and in some cases it may be necessary to choose a new device manually from the game settings. +- Made electrician's goggles easier to get (spawns as a part of the sub's initial supplies, can be purchased from outposts, doesn't require fulgurium to fabricate). The goggles are intended to help less experienced engineers get a hang of wiring in particular, so it doesn't make sense for them to be so difficult to get. +- "Safe rooms" are no longer indestructible in beacon stations (felt confusing, especially when it wasn't apparent from the look of the walls). +- One new research outpost events to foreshadow the longer ruin event chain. + +Optimization: +- Rendering optimizations that should give a major performance boost to situations in which there's lots of structures visible. +- Changes to the physics engine to improve collision detection performance. In technical terms, the game now disregards potential collisions between things that can never collide (such as two characters and most items) much earlier in the collision detection logic. +- Significant optimizations to memory usage. These will mainly reduce load times and lag spikes as the game needs to do less cleanup to free memory that's no longer needed by the game. +- Optimized character ragdolls (building them out of simpler collision shapes). +- Optimized LevelTriggers (things in the level that can react to objects and apply effects to them, such as water currents). +- Optimized the logic for refreshing the positions of items that are inside a moving inventory (such as a character's inventory). +- Miscellaneous optimizations to things such as explosions, AI logic when a bot is operating a turret, psychosis effects, idling NPCs' AI. +- Text rendering optimizations. +- Optimizations to periscopes, chairs and other items that force the character to a certain pose. +- Optimizations to piezo crystals. +- Optimized lighting in the nightclub module. +- Minor miscellaneous optimizations to the physics logic, such as simplifying math and the way positions of entities are set. + +AI: +- Fixed bandits occasionally failing to power up the beacon station they reside in. +- Fixed non-humans enemies not firing ranged weapons if there's a dropped riot shield (or other "blocking" item) in the way. +- Fixed bots sometimes getting stuck walking towards a door if the button/mechanism for opening the door is somewhere far away the bot can't reach. +- Fixed bots and husks being unable to enter Barsuk, Camel and Remora through the airlock. +- Fixed bots being unable to enter through Camel's bottom hatch. +- Fixed bots spotting characters that should be indetectable by AI (e.g. camouflaged Mantises). +- Fixed some bot dialog using the "technical" names (e.g. Mudraptor_passive) of characters instead of the proper display name. + +Multiplayer/networking fixes: +- Implemented lag compensation for hitscan weapons. Should make cases of shots seemingly landing client-side just for the health to rubberband back shortly after significantly less likely. The issue had to do with the lack of lag compensation by the game: a client might fire exactly at a monster, but when the server found out about that shot some fraction of a second later, the monster might've moved and the server would consider the shot to have missed. Now the server takes the latency into account, and checks if the shot would've hit at the point when the client fired the gun. The maximum amount of lag compensation is currently 150 milliseconds, but this can be changed in the server config with the setting "MaxLagCompensation". +- Improvements to syncing character positions (further reducing issues such as shots missing): fixed a bug that caused minor inaccuraries in character velocities between the server and clients, and made the clients better at extrapolating positions while waiting for the next positional update from the server. +- Fixes to syncing ragdolled characters' positions. Should fix corpses and unconscious characters often getting stuck in a glitchy state around platforms, rubberbanding up and down. +- Fixed inability to disable Steam authentication for LAN play if the server is connected to Steam. +- Fixed clients sometimes choosing an incorrect biome in the sandbox, mission and PvP modes, leading to a "level equality check failed" error at the start of the round. +- Fixed character occasionally teleporting out of the sub for a split-second in multiplayer, particularly when the sub was travelling fast during bad networking conditions. +- Fixed occasional crashes with an error message about "SpamFilter.IsFiltered" after getting disconnected from a server and kicked back to the server list. +- Fixed "herpes threshold" server setting doing nothing (should determine how low a player's karma needs to drop for them to contract space herpes). +- Fixed networking errors when multiple clients have died during a permadeath round, and you attempt to continue to the next level. +- Fixed loot that can only go in specific kinds of inventory slots (e.g. mudraptor shell) failing to spawn in the monsters' inventories if they don't have slots of the correct type. +- Fixed occasional "entity event data exceeds the size of the buffer" errors. These happened when the server failed to write a network event for some item (in which case the server should've just skipped that event), which can be caused by issues in mods for example. +- Fixed other clients not seeing creature attacks if the creature is being controlled by a player. +- Fix to clients often getting stuck behind closing doors in MP despite the character seeming to make it through in time client-side. +- Fixed server lobby sometimes appearing empty/nonfunctional when clients join a server. In technical terms, this happened when the lobby's update ID had reached a very large value, which could happen if the server has run for a very long time or if there's been some issues that have caused the server to create a very large number of lobby updates. +- Fixed PvP outpost setting causing unnecessary server lobby updates (even when the PvP mode was not selected), potentially leading to the lobby becoming unusable due to the issue described above. +- Fixed flipping monsters behaving inconsistently in multiplayer when controlling a monster: other clients saw the monster facing in the position of the cursor, even if it hadn't turned at all at the end of the client controlling it. +- Fixed "ignore" and "unignore" orders not working on stacks of items in multiplayer (just marking the first item in the stack). +- Fixed components inside a circuit box losing their settings when saving the game while the box is in a player's inventory. +- Fixed moving an item UI potentially moving it outside the screen on other clients' screens when using different resolutions. +- Fixed clients syncing the selected outpost PvP setting unnecessarily to the server when a non-PvP mode was changed. When there were no outposts to select from, the clients would think the setting has changed (since the selected value of "nothing" doesn't match the server setting), and send the value. This could potentially have caused the reported issue of multiple admins constantly changing settings and messing up the lobby. +- Fixed clients sending the value of the win condition slider too eagerly (whenever it moves, as opposed to when it's released). Also changed it adjust in steps of 10 for a little nicer values. +- Fixed occasional "Unexpected error" console errors when the game attempts to unlock an achiement on the Epic Store or with EOS crossplay enabled. + +Extra logging for diagnosing networking errors: +- Mention the entity that caused an error to be thrown when reading a network event, and the content package that entity is from (makes it easier to tell when the error is caused by some specific mod). +- Improved logging of the "event count very high" errors: mention the content package the events are from if they're non-vanilla, log the errors client-side too. We are suspecting the occasional "expected old/removed event" disconnects could be due to the server creating so many events the clients can't keep up, and this should give us some more clues for diagnosing the issue. +- Added more info to the "component event creation failed" error messages, the errors are logged into GameAnalytics. + +Balance: +- Each successive use of the Mindwipe item increases the penalty to talent points, making it more costly to use it to "farm talents" by repeatedly unlocking talents that unlock other talents or give extra talent points. +- XP gain balancing: the XP is no longer directly tied to mission rewards, but adjusted based on the difficulty of the mission. +- Lowered cost of high-skilled NPCs to hire. High reputation with Coalition or Separatists results in more cost-effective hires. +- Tweaks to monster nest missions: higher reward (as they're some of the riskiest missions in the game) and less monsters in SP (in MP it's the same amount). +- Campaign setting for adjusting the XP gain rates. +- Higher XP gains in later biomes. +- Concussions wears off faster. +- Beds are a bit more effective for some afflictions like nausea and drunkness. +- Added chem addiction and chem withdrawal reduction to beds/bunks. +- Reduced how fast chem addiction and chem withdrawal build up. +- Reduced the amount of devices you need to repair to get the effects of the "Machine Maniac" talent. +- Health scanners spawn as a part of the sub's initial supplies, not given to every respawning medic (a too easy source of free resources). +- Deconstructing headsets no longer yields materials (a too easy source of free resources). + +Fixes: +- Fixed choosing "retry" in the pause menu after you've started playing from a backup save loading that same backup save instead of the most recent save. +- Fixed relay components not passing power until they've been toggled on and off. +- Fixed ability to sell the 2nd gene of a combined genetic material in stores. +- Fixed combined genes appearing untainted if the 2nd gene is tainted instead of the 1st one. +- Fixed NPCs still offering services (stores, submarine upgrades, etc) despite their faction being hostile to you, leading to weird situations where you could be trading with a merchant who's actively trying to run away from you. +- Fixed Artie Dolittle continuing to follow you if you refuse to hire him. +- Fixed "Miracle Worker" talent keeping husks from dying if you're friendly with husks (e.g. because you're wearing Zealot Robes). +- Fixed alien turrets not working properly in mirrored ruins (they were using circuits with hard-coded turret rotation angles, which broke in mirrored ruins). +- Fixed alien turrets set to auto-operate failing to fire inside hulls. +- Fixed auto-operated turrets trying to fire at monsters inside ruins. +- Fixed signal components being automatically placed inside circuit boxes in your inventory when you purchase them while there's no free slots in your inventory. +- Fixed holes on overlapping walls multiplying flooding rates (a hole was created on all of the walls, and they'd act independently of each other). +- Fixed lights being visible on contained items (e.g. handheld sonars in cabinets) in the sub editor. +- Fixed crashing when attempting to give contextual orders to a defense bot (i.e. when middle-mouse-clicking a defense bot). +- Reactors attempt to rapidly adjust to the load in the first 5 seconds of a round, during which time junction boxes don't take damage from overvoltage. Intended to address overvoltage in cases where the reactor is outputting a lot of power, and the load suddenly drops when a new round starts (e.g. due to the engines powering down). +- Fixed alien devices (or more specifically, items with a static physics body) shifting from their original position when loaded for the first time if they're used in a normal sub. +- Fixed "Crusty Seaman" talent giving characters medical skill as it heals the character's bleeding. +- Fixed certain level resources (e.g. piezo crystals) facing the wrong way on level walls. +- Fixed certain elements in the debugdraw view (submarine borders, damage texts on walls, gaps, water level indicators on hulls, lines pointing to walls enemies are targeting) "twitching" when the sub moves. +- Fixed headsets purchased with immediate item delivery getting assigned to an incorrect team, preventing them from communicating with the headsets of the rest of the crew. +- Fixed headsets whose fabrication was started on the previous round getting assigned to an incorrect team, preventing them from communicating with the headsets of the rest of the crew. +- Fixed pets (including defense bots) spawned in an outpost being assigned to the "friendly NPC" team, which would e.g. mean that they wouldn't attack the enemy team in the PvP mode. +- Fixed PvP outposts sometimes spawning as alien ruins. +- Fixed multi-tools detaching detonators (the multi-tool is not intended to detach any items, because that would conflict with the repair functionality). +- Fixed unopenable hatch at the top of ResidentialModule01_Colony (rarely caused any issues in the vanilla game, because other modules almost never attach on top of that module). +- Fixed Terminal component's Readonly field not working when it's set in the editor (only if the item is by default set to readonly). +- Fixed large hardpoints not having the "set_auto_operate" and "toggle_auto_operate" inputs. +- Fixed components being attachable inside walls/floors in some subs. +- Fixed broken junction boxes sometimes zapping players despite seemingly not being powered. +- Improved thalamus brain spawning to prevent it from ending up in dry rooms, and dying if it does: + - Avoid spawning in rooms with doors, hatches or duct blocks. + - The brain no longer dies in dry rooms. +- Fixed mudraptor beak from mudraptor genes showing through exosuits and other wearable items that should hide the character's head. +- Fixed bandoliers not going in cabinets' "container slots". +- Fixed "man and his raptor" mission failing if you don't speak to the man and spawn the mudraptor. +- Fixed wrecked doors and hatches not being weldable. +- Fixed the hover text saying that you can "open" or "force open" a door when it's already opened. +- Waypoint fixes in Camel. +- Fixed 'Traveling Tradesman' sell bonus not working. +- Fixed chat-linked wifi components sometimes failing to receive messages from the chat (most often in circuit boxes?). Had to do with the order in which the headsets and wifi components are created. +- Fixed conversation prompts not blocking conversations from other events if you've moved past the initial prompt (e.g. answered the first question and gotten a follow-up). +- Fixed treatment suggestions not being shown on some afflictions (e.g opiate addiction). Happened because we used the same thresholds to determine if bots should treat the affliction and to determine if the suggestion should be shown. + +Modding: +- Added AddScoreAction: can be used to make scripted events modify a team's score in the PvP mode, which should open up a lot of new possibilities for custom PvP mission types. +- Added RangedAttackMultiplier stat type. +- Beacon stations are no longer automatically damaged, but instead are only damaged through the DamageBeaconStationAction in ScriptedEvent. Recommended (and default) setting for beacon stations is to enable all three: Allow damaged walls, Allow damaged devices, Allow disconnected wires. +- Fixed ragdolls failing to load when inheriting creatures whose ragdolls are not in the default path ("Ragdolls" folder inside the character's folder), but e.g. defined using a direct path to a ragdoll file in the character's or some other character's folder. +- Added option to set the handle positions (Handle1 and Handle2) of a holdable item using status effects. +- Fixed character variants failing to load the correct texture for limbs that use a different texture than the rest of the ragdoll (e.g. the alien bits on a variant of the Cyborgworm). +- Fixed WaitForItemUsedAction not working if there's multiple instances of the same scripted event active at the same time. +- Fixed characters' damage overlays not being affected by the ragdoll's texture scale. +- Fixed stacking ability resistances past 100% making the resistance negative. +- Fixed texts with color tags not working in some UI elements: fabricator, sub editor, store, speech bubbles. +- Made the game load the vanilla human ragdoll (or in the case of monsters, crawler ragdoll) if loading a modded character's ragdoll fails. Should make it easier to diagnose and address issues in the character configuration. +- Fixed hair and other "wearables" in character portraits (in the bottom-right corner and the health interface) getting misaligned if they use a different origin or sourcerect than the head sprite. +- Fixed health multipliers defined in a HumanPrefab not working. +- Fixed crashes when a PvP outpost contains shuttles or other moving parts. +- If an item variant inherits a sprite without the full texture path from the base item, it uses the texture path of the base item instead of that of the variant. Fixes mods being unable to create variants of things like diving suits without reconfiguring all the sprite paths. +- Fixed character variants overriding the targeting parameters of the parent character incorrectly: just overriding the parameters in the order they're defined in, as opposed to overriding a parameter with a matching tag. +- Status effects can make a character say a line in the chat: used by adding a subelement called forcesay, with the attributes "message" and optionally "sayinradio". +- Fixed OnUse sounds not playing when attaching an item to a wall in MP. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.6.19.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed chat input box getting cleared whenever someone changes their team, or when the game mode or team selection mode changes. +- Fixed stun resistance PvP setting doing nothing. +- Made Crimson Acid less powerful against large monsters. +- Fixed everyone's name tags being shown in red until you spawn when you join a campaign mid-round. +- Fixed stackable items with a non-default quality (e.g. grenades) failing to stack in the fabricator's output slot, instead just falling to the floor. +- Fixed very large PvP outposts often clipping into the level walls. +- Fixed decorative structures such as background walls not showing up on hostile (non-player) subs in multiplayer. +- Fixed "giveitem" command crashing the game when used with no arguments. +- Fixed Gravity Flak Shell's "gravity pull effect" being affected by gravity. +- Fixed Fulgurium Batteries sometimes spawning automatically in tools at the start of a campaign. +- Changed cargo scooter recipe to be more consistent with the normal scooter recipe (Underwater Scooter + x2 Ti-Al Alloy). + +Modding: +- Fixed freezes / lag spikes in multiplayer when a scripted event uses StatusEffectAction when there's lots of mods with custom events enabled. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.6.18.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed several issues when the server rejects a name change due to a client trying to change their name too often: the server would start spamming the "can't change name" message, team and job preference selection would stop working too, and the game would crash when attempting to open the job preferences. +- Fixed equipped genes becoming tainted if you die due to disconnection. +- Fixed kill/death counters not working in the Sub vs. Sub PvP missions. +- Fixed gravity spheres not rotating in the sub editor. +- Fixed current generators not getting properly mirrored in ruins in mirrored levels. +- Fixed spawnpoints for escorted characters and prisoners not working. +- Fixed crashing if an AI character's husk infection is removed when they're using a ranged weapon. +- Fixed psychosis effect persisting if you leave the outpost midway through the "minds unraveled" event. +- Fixed night club merchants spawning in outposts without a night club. +- Fixed night club merchants not selling beer or rum (literally unplayable). +- Fixed bots cleaning up live grenades. +- Fixed server getting stuck in an infinite "restart loop" if autorestart or starting when everyone is ready is enabled and the selected perks are not suitable for the selected sub. The server would just attempt an immediate restart if the players wanted to cancel and reselect the perks. +- Fixed "All" option not working in the server browser's language filter dropdown. +- Fixed Raate Colony pvp map missing hulls near upper turrets. + +Modding: +- Fixed outpost generation parameters that reference non-existent NPC prefabs causing a crash during outpost generation. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.6.17.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed water currents stopping subs entirely (regardless of the size of the sub or the current). + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.6.16.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +PvP and combat: +- Added outpost deathmatch mission type. Teams spawn at different sides of a colony, and need to get x kills to win (configured using a slider in the server lobby). There are periodic weapon/ammo drops around the outpost. The ammo drops spawn more destructive weapons and ammo as the round progresses. +- Added "king of the hull" mission type. The teams must stay in control of a beacon station for x seconds to win (configured using a slider in the server lobby). +- Separatists spawn with different gear in the PvP mode to make it easier to differentiate between the teams. +- New settings for the PvP mode: multiplier for stuns, option to disable monster and wreck spawns. +- Added a perk system that can be used to purchase perks such as extra gear, turrets, submarine upgrades and talents for PvP and mission rounds. +- Added "boarding pod", an item you can go inside and launch through a depth charge tube. The pod penetrates through submarine walls, allowing rapid boarding of enemy subs. +- Added railgun and coilgun harpoons. Can be used to reel enemy subs and other large targets closer to your sub. +- More options for controlling the team assignment logic in the PvP mode: + - Split team choice logic into two modes: Player Preference (the old behavior) and the new Player Choice mode (players are free to choose their team). + - Added a server setting for auto-balance threshold (how big of a difference there can be in team sizes before the server forces them to be rebalanced). +- Option to send chat messages only to your team in the server lobby. Only works when Player Choice mode is enabled (because in the Player Preference mode the teams aren't known in the lobby yet). +- Three new background music tracks for the outpost deathmatch mode. +- Option to select the outpost in the outpost deathmatch mission type (or any modded mission type that supports selecting the outpost). +- Show the opposing team's names as red, even when spectating (previously separatists were always red when you're not controlling a character). +- Name tags are more visible in PvP (they're no longer hidden when the character is in a different room, nor faded out when the cursor is not near the character). +- The team you're on is shown above the crew list. +- Option to choose different submarines for both teams. +- Sonars display the approximate position of the enemy submarine in sub vs sub PvP missions. Can be disabled from the server lobby. +- PvP mode levels are much smaller, making submarine vs submarine matches faster. +- Stun weapons reworked and now cause movement spasms before stunning. +- Flamers can set characters on fire. +- Grenades can be "cooked" (pulling the pin to trigger a timed explosion) by pressing E while holding one. +- Stun grenades blind and deafen the target for a while. +- Incendium grenades no longer set the whole room on fire; instead, they start a more localized fire that can also set characters on fire. +- Acid grenades now spread gas around a bit more. +- Detonators now get damaged by explosions and always have a 0.2 second delay before triggering and made them craftable +- Added a timed detonator variant that can be set to explode with a 0-60 countdown, which doesn’t require wiring to use. + +Alien ruins: +- New modules: shrine, research facility, current generator room and workshop. +- Updated all alien ruin modules: new puzzles and traps, improvements to old puzzles, visual improvements. +- New lore-heavy three-part event chain that takes place in research outposts, and progresses when ruin missions are completed. +- Made walls and doors much harder to destroy to encourage getting past the puzzles and obstacles in other ways. +- Added a weaker version of the ruin walls, to be used in specific spots in the ruins. +- Alien power cells can be charged in alien generators. +- Most alien devices are now destructible. +- Alien terminals have been reworked to send out a signal when there's a trinket inside: can be used for creating puzzles that require keeping the trinket in the terminal, meaning you can't just reuse the same trinket for every terminal but need to think about where to place it at any given time. +- Improvements to alien device sprites. +- New alien containers/storages: alien assembly device, alien storage vat and alien sample display. +- New alien devices: alien current generator and alien toxins generator. +- New decorative alien structures. +- Additional loot spawning to chests and other containers, making exploring ruins more worthwhile and especially expands the ability to pick up (unidentified) genes along the way. +- Fractal guardians were given additional guardian-only pathways and doorways in ruins, so they can navigate through the modules more effortlessly. +- Alien turrets deal significantly more damage. +- Alien generators indicate more clearly when they're enabled or disabled (adjusted the lights). +- Alien current generators show more clearly (with bubbles) that they're enabled, pushing the player back. +- New alien module: workshop. Introduces repair pods where guardians can hide in. + +Husks: +- Three new husk variants: Prowler, Exosuit and Chimera. +- Improved the appendages (ovipositors) coming from the husks’ mouths. +- There's a chance that corpses in wrecks are husks. +- Husks can play dead. +- The amount of husk infection resistance given by e.g. antibiotics stays constant over the duration of the meds. Makes the effects of the meds a lot more intuitive / predictable. +- Significantly buffed calyxanide damage on husks. +- Fixed failed calyxanide injections not doing anything (happens occasionally when the medical skill is low enough). Now applies halved duration instead, like on other poisons/meds. +- Added minor burn reduction on all husks allowing them to (slowly) recover from burn wounds. +- Cultist robes require less reputation to buy, Zealot robes require more. +- Zealot robes no longer block transformation. Full husk transformation immunity was too powerful, which made husk genes and husk symbiosis much less valuable. + +Gene splicing: +- Various changes to gene splicing to make it easier to refine genes, swap between different types of genes at will, and make tainted genes more useful (rather than something that's essentially "permanently ruined"): + - Removing genetic materials from a splicer doesn't destroy the material. + - Combining genes can remove taints if one gene is 100% pure. + - Dying with genetic materials equipped taints the material. + - When refining genes, the lower quality gene's quality now affects how much it will improve the quality of the higher quality gene - meaning that using higher-quality genes for refining is more effective than low-quality genes. +- Changed the husk immunity genes to instead slow down the infection at lower quality to make higher quality husk genes actually worth getting. +- Mudraptor gene quality affects the damage and damage protection of the beak. +- Spineling gene quality affects the damage done by spineling spikes. +- Effects from gene splicing aren't shown on health scanners (which made it difficult to see the relevant afflictions when treating someone). + +Optimizations: +- Optimizations to character creation. Reduces the lag spikes when players respawn. +- Optimized the way afflictions apply overlays to limbs (had an unnecessarily large performance impact when there were lots of characters with a large number of afflictions). +- Minor optimization to the way items in a characters' inventory stick to the position of the character. +- Minor UI optimizations. +- Improved performance when debugdraw is enabled. +- Minor optimizations to level wall rendering. + +Talent changes and fixes: +- Reworked Europabrew to be more of a double-edged sword: it's a cheap cure for any poison, but it also increases ALL types of damage taken (works on monsters too!), not just acid damage. +- Fixed "Extra Powder" talent not affecting depth charges. +- Fixed weapons skill gain and medical skill gain from certain talents working the wrong way around. +- Sulphuric Acid Syringe recipe changed and renamed to Crimson Acid. Now causes a very significant slow and much more damage over a longer duration. +- "Macrodosing" talent had acid burn damage boost removed, but increased the amount of poison applied, making it much easier to poison big enemies. +- "What A Stench" talent had acid burn damage bonuses reduced, to allow acid burn weapons to be stronger even for those without these specific talents. +- Buffed "Modular Repairs" talent: repair pack is now a "multitool", essentially a combination of a screwdriver and wrench which repairs slightly faster, and is no longer consumed when used. The talent also gives one free "Modular Repairs" submarine upgrade. +- Differentiated the "Art of Submarine Warfare" book given by talents from the one you can purchase from outposts (different names and sprites). Previously these looked identical, and it seemed like a bug when they didn't stack and gave a different amount of skill. +- Fixed "War Stories" book seemingly giving no skill increase sometimes. The amount of skill the book gives is proportional to the number of kills the "author" of the book got, and diminishes the higher the reader's skill is. That meant the book sometimes increased the skill by less than 1 (only making it progress toward the next level), which didn't cause a skill increase notification to pop up. +- Fixed "Bounty Hunter" and "Logistics Expert" not showing the additional reward in UI in multiplayer. +- Fixed "Tasty Target" still making characters super loud (and visible on the sonar). +- Fixed "Lightning Wizard" talent description not mentioning it only affects melee attacks. +- Fixed reputation gain bonus from the "Protect and Serve" talent being multiplicative, meaning you could get ridiculous amounts of rep if you have multiple security officers with the talent. +- Fixed "Mule" talent not working with physicorium bars. + +Miscellaneous changes and additions: +- 2 new research modules. +- 3 new medical modules. +- 2 new security modules. +- 6 new admin modules. +- 4 new crew modules. +- 4 new docking modules. +- 4 new engineering modules. +- 4 new clown modules. +- 2 new Church of Husk modules. +- New bath house and nightclub modules. +- 3 new storage modules, with 4 new events (providing extra loot and some potential challenges). +- Added module ‘probability’, meaning some optional modules (such as storage modules) do not always spawn. +- New "gravity shell" ammo types for railgun and flak cannon. Fabricated from dementonite. +- New "mindsense" item that temporarily gives you the ability to sense living characters through walls. Fabricated from dementonite. +- Clown crates can be carried with a character inside. +- Jukeboxes play music, the track can be changed by interacting with the jukebox. Also added new "speaker" items that work the same as jukeboxes. +- 7 new achievements: + - Get Out Alive: get through the entirety of the Cold Caverns without losing your character in permadeath mode. + - The Abyss Beckons: lose a character in the permadeath mode. + - King of the Hull: win a PvP King of the Hull mission. + - Hide And Seek: kill a Cave Mantis. + - Ancient Novelty: destroy an alien terminal using alien curio. + - What Smirks Below: kill a psychoclown on a beacon station. + - Europa's Finest: complete a campaign in ironman mode in multiplayer! +- Added the ability to load saves from back-up save slots, rather than just one save slot per campaign (allows going back further into the past, to avoid getting stuck). +- Disabled portable item finders working outside of the player subs. The intention is that they can't be used as a map of unknown places. Can be adjusted in xml for modding. +- Some new stair variants. +- Made the water ambience sounds inside the sub a little more quiet. +- Adjusted the low pass filter that muffles audio that's coming from far away or from behind obstacles: the sounds are now muffled more heavily. +- Made the ping estimations in the server list more accurate. They are still not perfect, because due to the way SteamP2P works (with the connection potentially getting relayed through Valve's intermediary servers), it can be hard to determine the ping in advance without actually connecting to the server. +- Adjusted railgun shells and depth charges to show the 'explosives' icon. Other items can still be placed into them, but most don't actually do anything. This should help players to understand it's mainly intended for explosives. +- Adjusted the names and descriptions of turret ammunition, to be more clear (and more easily searchable) on what turret they're used with. +- Circuit boxes can be set to require a specific ID card tag to access. +- The docking circuit boxes in vanilla subs require a captain's ID card to access. +- One-handed riot shields (to make them actually useful!). +- Added "surveillance center" item which can be connected to multiple cameras, which can be toggled through with buttons on the UI. There's an example item assembly showing how to connect the center to multiple cameras using the new output selector components. +- Output selector component (the technical term is "demultiplexer"). A component that has one input connection, and multiple output connections, and allows you to choose which of the output to send the input signal to. +- Input selector component (the technical term is "multiplexer"). A component that has multiple input connections, and one output connection, and allows you to choose which of the input signals should be forwarded to the output. +- Made the sound effects and camera shake a lot more noticeable when approaching crush depth. +- Option to make circuit boxes require a specific ID card to access. +- Removed the restriction of 2 security officers and 2 medics per crew in multiplayer. +- Spectators can focus the camera on a character by clicking on one on the crew list. +- Easier testing of outpost modules in the sub editor: when launching the test mode with an outpost module that's suitable for some outpost, the editor generates the whole outpost as opposed to just the single module. +- Higher-res collider indicators (visible in the character editor and when debugdraw is on). +- Adjusting the audio level sliders changes the volume immediately (as opposed to when you click "apply") to make the volume easier to preview. +- Added options for renaming and deleting local mods. +- Added an option to copy a workshop mod to a local mod. +- Fixed the context menu's "unsubscribe" button not working. +- Copying a waypoint while holding Ctrl automatically links it to the original waypoint in the sub editor. +- Option to choose the level difficulty in the level editor. +- Crush depths for different levels of hull upgrades are visualized in the level editor. +- Fixed BrokenSprites not showing up in the sprite editor. +- Ctrl+C copies the sourcerect of the selected sprite or sprites in the sprite editor. +- The total mass of the character is shown in the character editor. Note that the masses don't correspond to any "real units", but they may be of use if you e.g. want to make some status effects affect large monsters. + +AI: +- Fixed an issue in the medic AI that made them often use suboptimal medicine when there were better options available. The issue happened when the medic didn't have the meds readily available: when they started searching for the sub for suitable meds, they would accept any of the 4 most suitable ones even if there were more suitable options available. +- Medic bots no longer use saline to treat infections. Saline has such a minor effect on infections that the bots could end up wasting huge amounts of it. +- Bots are now able to change the fuel rods on exosuits. +- Fixed bots being too eager to use welding tools and plasma cutters as weapons. +- Defense bots are now much better at navigating inside the sub, and they can open doors and use ladders. +- Fixed defense bots always being friendly to all humans, regardless of the team. +- Defense bots can now be told to unfollow by interacting with "E" (play). You can also tell someone else's defense bot to follow you. +- Defense bots show a green light when they are following a target. +- Monsters can now see and target searchlights. +- Fixed escorted NPCs getting turned hostile by the negative side-effects of medicine way too easily. +- Fixed security officers starting to consider everyone in the outpost as "belonging to another crew" after they've been alerted in a jailbreak mission, causing them to do constant security inspections on each other. +- Fixed low amounts of poisoning making bots say the target is mildly injured and doesn't need treatment. +- Fixed bots being unable to heal husk infections. +- Fixed bots recharging fulgurium batteries as soon as they're below 100% condition. +- Fixed bots being unable to defend themselves if they are holding an item that cannot be placed in the inventory, such as a cargo scooter or a box. Now they can put the item on their back or drop it when necessary. +- Fixed bots trying to store items like HMG in cabinets instead of putting it on their back when they don't need it. +- Fixed bots wearing both diving mask and diving suit when the suit has no oxygen left and when a mask would suffice. +- Fixed bots using repair tools in combat from an incorrect distance. +- Fixed bots sometimes getting stuck in a flooding room. Happened in situations where the centers of the nearby safe hulls were far away from the current room, e.g. if the rooms were very large. +- Fixed bots refusing to fix small leaks when there are no diving masks available but there are diving suits that they could use. + +Fixes: +- Fixed "mission equality check failed" error when you join an ongoing campaign in which the players have selected missions in an outpost, but not departed yet. +- Fixed "lock default wiring" server setting locking components in all circuit boxes (even ones placed mid-round). +- Fixed headsets not working on characters spawned via console command. +- Fixed iron man mode staying "partially on" when the checkbox is left ticked, and a respawn mode other than permadeath is enabled, causing e.g. character loss to not get reverted when restarting the round. +- Fixed escort and cargo missions still sometimes leading to locations with no outpost. Now these missions should not be offered if there's no adjacent outposts. +- Fixed the sonar marker sometimes disappearing in one of the levels at the end of the campaign if the player stays too long in the level. +- Fixed dropping a melee weapon mid-swing leaving its hit detection active, causing characters to take damage if they touch it afterwards. +- Fixed monsters being unable to walk/swim backwards in multiplayer, causing the animations to look off in the case of e.g. monsters that back off after attacking. +- Fixed mineral scanners working without power. +- Fixed some faction events getting stuck when you choose the "ignore" option in the dialog. +- Fixed wrecked coilgun loader still using the old sprite (that doesn't look like the normal loader). +- Fixed lower docking port not being connected to the power grid in Camel, Orca 2, R-29 and Remora. +- Fixed chitin being damageable. +- Fixed beacon stations being often positioned in a different spot in mirrored levels (e.g. it might be near the outpost at the end of the level, but if you entered that outpost and returned to the level, it might’ve been near the other end of the level). +- Handheld item finders no longer work in ruins, wrecks and outposts (makes it too easy to locate loot - they were originally intended just for finding items on your own sub). +- Fixed "access denied" console errors when you attempt to open a restricted folder in the file selection dialog (e.g. when selecting a preview image in the sub editor). Now folders you don't have access to open a hidden from the menu. +- Fixed lights sometimes going through doors. +- Fixed dropped items sometimes seemingly disappearing client-side in multiplayer (most often, cargo scooters around ruins). +- Fixed inability to select containers that make you automatically pick up the item inside (e.g. weapon holders and fire extinguisher brackets) in the sub editor. +- Fixed occasional "invalid wallet" errors when finishing the campaign with talents that give extra money at the end of the round. +- Fixed rescuing Jacov Subra still not changing the abandoned outpost back to normal. +- Fixed characters losing skills and items if they die due to a disconnection, and then despawn before the end of the round. +- Fixed loading an autosave in the submarine editor not refreshing the list of layers in the sub. +- Disabled drop item hotkey in editors. It seems this is frequently bound to keys that are used in editors too, leading to e.g. people dropping screwdrivers around the sub when they're trying to toggle the entity list. +- Fixed outdated skill requirements in some weapon tooltips (Autoshotgun, HMG and Machine Pistol). +- Fixed crew list order shuffling around whenever characters are added or removed in MP. +- Fixed smoke from volcanoes and lava vents rendering in front of level walls. +- Fixed "man and his raptor" mission completing even if the mudraptor dies. +- Fixed crashing when trying to join a dedicated server via an IPv6 address. +- Fixed logbooks sometimes spawning in locked cabinets in wreck missions, which may make the mission impossible to complete if there's no corpse with an appropriate ID card in the wreck. +- Fixed deleting a wire with a label behind it from a circuit box also deleting the label. +- Fixed incorrect opium skill requirement tooltip. +- Fixed pulse laser loader's light flashing when it's rewired. +- Fixed certain affliction-specific animations, like the "drunken run" animation increasing movement speed when wearing a diving suit. +- Fixed psychosis artifacts sometimes causing excessive amounts of psychosis when the number of characters inside their area of effect changed. +- Fixed bots being able to start deconstructors from a distance if the item they're trying to deconstruct is already inside the deconstructor. +- Fixed a very rare issue that sometimes caused there to be now path between biomes on certain campaign map seeds. +- Fixed missions never triggering in levels that don't lead to an outpost if there's any paths to outposts available. +- Fixed outpost NPCs being unable to sit in cafeteria chairs (literally unplayable). + +Modding: +- More modder-friendly event set handling. Previously it was very difficult to ensure custom events always trigger without overriding all of the vanilla event sets. We had support for "additive sets", which can trigger in addition to the normal event sets, but no way to guarantee one triggers. Now an attribute called "SelectAlways" can be added to an event set to ensure the game always selects the set when it's suitable for the current level. If the set is additive, it is guaranteed to get chosen regardless of what other sets get selected. If the set is NOT additive, the game will choose the first available non-additive set that is configured to be always selected. +- Made beacon events more modding-friendly: previously which beacon events were allowed to trigger was based on which layers are present in the beacons, but this was not a good idea because it breaks the events in all existing beacon mods (which for the most part don't use layers). Now trigger based on what kind of spawnpoints there are available in the beacon station. +- Added OnInserted and OnRemoved action types, which can be used in Containable definitions to trigger a status effect when something is placed into or removed from a container. +- Option to allow severing monsters' heads without killing them. +- Add an option to trigger motion sensors by species name or group. +- Monster AI: Added support for multiple targeting tags per target (e.g. an item having two different tags that a monster can target with different targeting params: the guardians now use this when targeting traps: they can either hide in them or flee to them for the repairs). +- Monster AI: Added support for multiple targeting params with the same tag. Currently not used in the vanilla game. +- Add support for targeting only items and for specifying multiple target types in the attack definitions. Or in other words, a monster attack can be configured to work against both characters and items. +- Fixed property conditionals targeting item components always requiring a match for all of the components of the same type, instead of any of them. Can be adjusted in the xml. +- Fixed NPCChangeTeamAction crashing the game if the target doesn't have a character info (= it's a monster or a pet). +- Increased the shadow casting light limit to 100 in the sub editor (can still be bypassed by enabling the "debugdraw" command). +- Made hostile abandoned outpost NPCs able to react offensively to the player even if the mission takes places in a friendly outpost (i.e. assassination/rescue missions can take place elsewhere than abandoned outposts without the hostile NPCs fleeing from the players). +- Made it possible for a CustomInterface to periodically refresh the UI to match the properties of the item (e.g. if there's some timer field, to get the value of the timer from the item).Configured with the attribute "GetValueInterval". Previously it was only possible to make the UI control the values of the properties or send signals, but not the other way around. +- Support for defining characters "the normal way" (using human prefabs, as opposed to the "character types") in pirate missions. +- Support for applying status effects on the pirates in pirate missions. +- Fixed toggling layers not working in outpost modules. +- Fixed contained items not getting hidden when the layer the parent item is in gets hidden. +- Fixed Sprite elements in wearables being case-sensitive. +- Fixed SpawnAction sometimes choosing spawnpoints in the abyss, ruins or caves when set to spawn at the MainPath. +- Fixed items not being positioned/rotated correctly when contained inside a "grandparent container" (item inside a container inside a container). +- Added "researchmaterial" tag to items containable in a research station. Doesn't affect any vanilla content, but allows modders to make research stations usable for things other than genetic materials. Also allow putting medium and small items into the output slots. +- Option to make TriggerComponents trigger based on a species name, species group or a conditional. +- "HUDOverlay" element which can be used to show a full-screen overlay on any arbitrary item the view is focused on. Used on cameras. +- Fixed there being no guarantee that there's a suitable start outpost in the first biome, especially when using mods that add a lot of new location types. +- Fixed removing an item with multiple inventories using status effects only removing the items inside its first inventory. +- Fixed MissionStateAction always incrementing the state by 1 when set to "Add", disregarding the value set in XML. +- Fixed delayed effects not filtering the targets properly (ignoring e.g. TargetIdentifiers and TargetItemComponent). +- Fixed character variants overriding the targeting parameters of the parent character incorrectly. +- Mission types are no longer hard-coded.The name of the XML element determines the actual mission class used by the game, but the mission type can be any arbitrary string. Can be used if you for example want to add special types of salvage missions, and categorize them separately in the menus. +- Fixed NPCs losing the reference to the HumanPrefab if they're hired in the crew and a new round has started. Didn't cause any issues in the vanilla game, but made it impossible to refer to the NPC using the human prefab id in events. +- Non-humanoids can now use ladders, if they have both "CanInteract" and "CanClimb" enabled in the character params. +- Fixed making an NPC stop operating an item with NPCOperateItemAction not working. +- Fixed StatusEffectAction not working client-side when it's executed immediately at the start of the round before clients have loaded in. +- Fixed "sprite not found" console errors when the game tries to preload a modded creature with damaged sprites. +- Fixed MeleeWeapon StatusEffects not being synced correctly (the effect didn't specify the MeleeWeapon component as the target client-side). Doesn't seem to have affected any vanilla content. +- Fixed conditional sprites in limbs completely ignoring the texture path defined in the xml and always using the default path. +- Fixed inability to make structure prefabs indestructible (the setting only applied to individual wall instances placed in the sub editor). +- Instead of having to define the pirate sub files in the mission, you can also just leave it out and let the mission choose a random enemy sub. The reward, preferred difficulty, and tags that restrict which mission a sub can be used in, can be configured in the sub editor. +- Fixed specific kinds of item variants causing "sprite not found" errors. Specifically, when a variant in Mod A inherited an item from Mod B, and that item had sprite paths configured using %ModDir%, the game would attempt to find the sprite from Mod A even though it should be looking for it from Mod B. +- Fixed items that take up both the OuterClothes and InnerClothes slots being possible to put in just either of them by swapping them with other items in a specific way. +- Made "RemoveIfLinkedOutpostDoorInUse" affect ladders too (making it possible to remove unused ladders from outpost modules by linking them to doors). +- Fixed inability to set an item's condition or quality using OnSpawn status effects. +- Fixed PowerTransfer.CanTransfer not working. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.9.2 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed an exploit that allowed clients to crash servers when hosting through SteamP2P. +- Fixed crashing when loading a save in which a character has a deconstruct order and an item marked for deconstruction is outside hulls. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.9.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed outpost security being way too eager to arrest characters who attempt to escape a security inspection, to the point that getting inspected while running past a guard would immediately make them arrest you. +- Fixed some thalamus items being hidden for no reason in some wrecks. +- Fixed "assault enemy" order not working in abandoned/enemy outposts. +- Added a configurable multiplier for the cost of hiring a new character to replace a permanently killed one. Makes it possible to host permadeath servers without having to assign hiring or money permissions to clients. +- Players are allowed to rename the character they take over in the permadeath mode. + +Modding: +- Fixed forceOutpostGenerationParamsIdentifier (which can be used to force specific outpost generation params to be used in a location type) only working in single player. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.8.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed crashing when killing a defense bot or a leucocyte. +- Fixed directional flak ammo box still being carried with 2 hands. +- Fixed set_auto_operate and toggle_auto_operate disappearing at the start of the round if AutoOperate is not enabled. Now there's a setting called "Allow Auto Operate With Wiring" which can be enabled in the sub editor to enable the connections. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.7.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed certain modules failing to spawn in colonies. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.6.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed "Junction Junkie"" talent giving an incorrect number of XP. +- Fixed "Machine Maniac" and "Quickfixer" talents not affecting fabricator and duct block repairs. +- Fixed "Better Than New" talent not affecting reactor repairs. +- Reverted the changes to colony module tags introduced in the previous build. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.5.5.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Added a new, optional, permadeath mode in the multiplayer campaign. When your character dies, they stay dead, along with all their XP and talents. You will have to acquire a new character to respawn and continue playing. This can happen in two ways: you can wait to hire a new character for yourself from the next non-hostile outpost, or take control of a bot to resume playing right away. +- Added a new, optional, iron man mode in the multiplayer campaign for those looking for an insane extra challenge. Players who have died in Ironman mode can only spectate, and hope that the rest of the crew will make it. +- Added a new wreck mission: clear Thalamus. +- Added more beacon stations with bandits. +- Added giving items to others by dragging and dropping. It's always enabled when targeting pets and bots (on the same team), but can also be enabled in the server settings for targeting players. +- Added a slider at the bottom of the tab menu that allows you to set the salary of all crew members whose salary has not been manually set, and also determines new characters salary for late joiners. +- Added support for new outputs in item containers: + - "contained_conditions" (sum of the conditions of contained items) + - "contained_conditions_percentage" (sum of the condition percentages of contained items) + - "contained_items" (total number of contained items) +- Turret auto operate settings now transfer to the other turrets that are swapped in place of the original. +- Turret auto operate functionality can now be enabled or disabled with signals. +- Reduced the minimum length of the outpost hallways. Should get rid of the horizontal hallways and reduce the length of some vertical hallways. +- Monsters can now hear when the players are using the text chat and in-game voice chat. +- Changes to carrying turret ammunition: + - Can now be carried with one hand, instead of requiring two. + - Each shell/box now slows the character by 20%. + - Adjusted the hold positions. +- Made small and medium mudraptor eggs glow the same way as the large version. The small version can now spawn in mudraptor nest missions, and they're extremely difficult to find without the glow. +- Improved the hireable husks and clowns. Added titles, made the gear more appropriate, and added high-level versions of the NPCs. +- Optimization: Fixed medical clinic UI refreshing and the server sending updates to clients whenever the number of afflictions on a character changes (which can in extreme cases be several times per frame). +- Pumps and engines now deteriorate faster when being operated at full power for a while. +- Changes to the highlighting to make it easier to interact with items near pets. +- Made combat diving suits and slipsuits reduce visibility less than the other suits. +- Added support for hosting servers in a local network without a connection to Steam or EOS. You need to set requireauthentication="false" in the server config to allow clients to join without Steam/EOS authentication. +- Updated Crawler and Crawler Husk textures to a higher resolution. +- Changed the logic of assigning jobs for the bots in the multiplayer game mode. Previously the jobs were assigned based on the number of spawnpoints for that job in the sub, now the game instead tries to distribute jobs evenly to the bots. +- Changed the logic of generating hireable characters in the outposts: + - All outposts now offer at least one hireable for a given job, if that job is missing from the crew. + - Added medics, security and captains as hireables in mines. + +Balance: +- HMG has less severance chance and always applies a slow to characters, rather than just when carried in hands. +- Assault Rifle magazine size is now 30, up from 20. +- Flamer and Prototype Steam Cannons are better as weapons when used with Incendium Fuel Tank. +- Lead and Uranium can now be launched with the Scrap Cannon too, increased the Scrap Cannon damage with some materials. +- Auto-Shotgun is now less accurate than the Riot Shotgun. +- Grenade Launcher can now hold 6 grenades, and fires faster. +- Bandolier is now held in the bag slot, replacing the Toolbelt/Backpack but only accepting munition-type items (includes grenades). +- Reduced bonuses given by money-related talents of the Captain's "Politician" tree. Stacking all bonuses was too effective. +- Adjusted Captain's "Politician" talent tree. +- Fixed the talent "Your reputation..." not giving double money for cities. +- Minor speed buffs to Combat Diving Suit, PUCS, Slipsuit (only when swimming). +- Added a bit more level generation variation to later biomes. +- Changed the Great Sea a tiny bit in appearance (tweaking the chunks available). +- Fixed some XML oversights, some plants had 0 commonness in all biomes and thus never appeared (for seemingly no reason). + +AI: +- Outpost NPCs now blame the character who equipped a diving mask with welding fuel inside it for the deaths caused by it. +- Security bots don't inspect characters for stolen items in the first 30 seconds of a round. Prevents "unfair" inspections you have no chance to react to if you happen to spawn right next to a security NPC with stolen items on you. +- Outpost guards will now hold fire for a while, give two warnings, and after that attack the target, unless it complies (e.g. by ragdolling). They still prefer stun weapons while trying to arrest, but can also use lethal weapons, unless the target is on the same team. +- Targets that have escaped, resisted being arrested, or acted aggressively, will now be considered as criminals. Criminals will be immediately arrested with no warnings, if they do something illegal. The criminal status persists only for one round. +- The outpost guards should now also always confiscate all weapons and stolen items when they arrest a target. Previously this happened inconsistently. +- Fixed outpost security guards only attacking thieves when they can stun the target. +- Fixed outpost guards not letting go of the target they’re inspecting for stolen items when their objective changes (e.g. when someone is attacked). +- Fixed inconsistent guard reactions on interacting with handcuffs. They are now always considered illegal items, unless equipped (handcuffed). +- Fixed/changed: guards can now follow the player to the player sub. They will now wait for a while, after which they'll return back to the outpost, if able to. +- Fixed bots sometimes yelling incorrectly that they can't find a path when following/holding a position. +- Human enemies and outpost guards can now react to noises (ai targets that have the tag "ProvocativeToHumanAI"). +- Fixed automatically created hulls in the docking ports not being marked as wet rooms, allowing the bots to drop the suits there. +- Bots no longer automatically take diving suits off in shuttles. +- Bots no longer take off diving suits while climbing. They should now drop the suits in the next platform instead. +- Bots no longer cancel (looping) orders outside of the submarine. Some orders are still cancelled. +- Added a separate job for outpost managers. Fixes outpost managers trying to operate the navigation panels in the outposts. +- Fixed bots getting stuck in some outpost stairs. +- Fixed bots sometimes stopping in the stairs while idling around. +- Bots don't take items from magnetic suspension crates or the crates recovered from a wreck in the "lost cargo" missions. +- Fixed bots "cleaning up" items from magnetic suspension crates and crates salvaged from a wreck. + +Submarine layers (previously "groups"): +- Added CheckDifficultyAction. Can be used to check the difficulty of the current level. +- Option to require a specific layer to be present for an event or event set to be triggered. +- Stop updating items that are in a hidden layer (previously e.g. reactors and other devices would work fine despite being hidden) +- Hide wires that are connected to a hidden item. These are still visible in the connection panel though (just locked). +- Added DamageBeaconStationAction. Can be used to disconnect wires and break devices and walls in beacon stations. +- Fixed the "layers visible by default" sometimes showing the layers incorrectly. +- Fixed entities getting hidden when loading a sub with some hidden-by-default layers in the sub editor. +- Disabling a layer with spawnpoints in it now also disables the spawnpoints. + +Circuit box UX: +- Fixed selecting wires causing you to also select components if they overlapped. +- Added character count indicator to circuit box labels and turn the text red if it goes over. +- Show a prefab icon on the cursor of the wire that is being dragged when you start dragging a wire. +- Input and output connections can be renamed by right clicking. +- Labels can be renamed by double-clicking. + +Tools: +- Fixed editing water or fires using the console commands not working while on the freecam mode. +- Water edit mode: you can now double click with the primary mouse button to set a room flooding with water instantly. Double click with the secondary mouse button to completely drain the room. +- Fire edit mode: you can now use the secondary mouse button to gradually extinguish the flames in a room. Double click with the secondary mouse button to put off the flames instantly. +- Copy-pasting multiple commands into the console executes all of them in order. +- Added a parameter for specifying a location in the "teleportcharacter" console command. +- The auto-completions in the console can now be browsed backward by holding left shift. +- Added some subcategories shown in the value inspector views. Not yet used extensively. +- Fixed turret rotation limits seemingly inverting when the angle wraps around at 360 or -360 degrees. + +Modding: +- Fixed "holdpos" attribute no longer working on throwable item components. +- Added "PropulsionSpeed" StatValue and use it instead of "PropulsionSpeedMultiplier" in status effects. The latter doesn't stack, meaning if you wear multiple items that affect the propulsion speed, the last one would take priority. +- Added a new attribute "ShouldBeOpen" to doors. Can be used by status effects to tell the door to open/close. +- The game now prefers English texts when a localized text isn't found. This means that if your mod is only translated to English, e.g. mission and item names use the English text if someone is playing the game in another language, as opposed to displaying the text configured in the xml directly (e.g. missionname.mycustommission). +- Fixed "TransferAfflictions" setting of StatusEffect (which can be used to transfer afflictions from the character executing the effect to a new one spawned by the effect) not working correctly if the characters have a different amount of vitality. +- Changed how outpost modules are configured for abandoned outposts: Special outpost module types are now used: "AbandonedAirlock", "AbandonedAdminModule", etc. Previously these special modules used the same module types as normal outposts, but were restricted to only spawn in outposts of the appropriate type. That meant a mod could not add a new module that's used in all types of “normal” outposts by setting the location type to "Any", because it would also be used in abandoned outposts. +- Made vision obstruction effect adjustable: instead of being just on/off, there's a ObstructVisionAmount value that can be set to a value between 0 and 1. A value of 0.5 roughly corresponds to the old obstruction effect, and setting the obstruction using the old ObstructVision boolean sets it to that value. +- Better support for including non-human characters in the crew: CharacterInfo (which defines a characters job, skills and such, and is required for characters in the crew) can be enabled on any type of character by adding HasCharacterInfo="true" to the character config. +- Fixed crashing when you try to spawn a character defined to use human AI but doesn't have CharacterInfo or a job. +- Added an option to supply "addtocrew" argument to the "spawncharacter" console command. Makes it easier to test the above changes, and allows spawning "nonhuman crewmates" using console commands. +- Added a new parameter for upscaling character textures: SourceRectScale. It's intentionally not exposed in the character editor, but can be used together with the existing TextureScale to adjust the scaling of the textures. E.g. TextureScale 0.5 and SourceRectScale 2.0 doubles the resolution without having to adjust the other values of the ragdoll. +- Fixed DamagedByRepairTools not working if the item doesn't also take damage from projectiles or melee weapons. +- Fixed artifact events causing a crash if the item the event is supposed to spawn can't be found. + +Fixes: +- Fixed the game sometimes crashing on welding a leak. +- Fixed store stocks of most items increasing constantly, all the way up to 100. +- Fixed ID cards not getting assigned the appropriate tags when you choose to get them delivered immediately. +- Fixed antibiotics not applying "drunkweakness" as intended. +- Fixed characters holding throwables, like grenades, weirdly in an unintentional pose. +- Fixed "exhibitionism" event failing if clothes or a diving suit are held in the hand slots. +- Fixed outposts giving an endless supply of missions if you keep taking up the missions, and then saving the game and reloading it again. +- Fixed flipping of the item not being taken into account when launching a projectile (making left-facing projectiles launch backwards). +- Fixed inability to hire/fire/rename/heal "twin bots" (bots with the same name, appearance and job). +- Fixed characters moving faster on underwater scooters while wearing a backpack and an exosuit than when wearing other equipment or none at all. Also affected the movement speed of the characters while wearing/holding other items. +- Fixed some CJK characters, for example ㅎ and A not drawing in the game properly. +- Fixed item container sorting behaving inconsistently when there's instances/stacks of the same item in multiple slots (randomly shuffling the items around). +- Fixed label tags sent via Wi-Fi components not using the localized text in the chat interface. +- Fixed "minleveldifficulty" and "maxleveldifficulty" attributes being ignored in the single mission mode. +- Fixed vertical gaps not emitting particles if the top of the gap is not above the top of the hull the water is flowing to. +- Fixed some draw order issues on alien hatches and doors. +- Fixed decorative items on held items glowing for no reason. +- Fixed a potential softlock if you accidentally start a round in a level that's too deep for the sub. The crush depth warnings on the campaign map now take the start/end position of the level into account, and the sub doesn't take depth damage in the first minute of the round, giving you a chance to return if you end up in a level that's too deep. +- Fixed BeaconStation and Wreck info (e.g. place on the ceiling and the difficulty settings) resetting when you enter the sub editor's test mode. +- Fixed skin tint (both the normal skin color and tints applied by afflictions) affecting the color of the damage overlay (i.e. darker-skinned characters seemed to have darker blood). +- Fixed melee weapons losing collision with platforms and level walls after being swung. +- Moved the alien terminals a bit farther from the guardian pods, so that the player operating the terminal won't get damaged by the exploding pod. +- Fixed inability to open some item interfaces in the sub editor (more specifically, items without an item container). +- Fixed attempting to flip items that cannot be flipped on the X axis, for example crate shelves, not doing anything and looking broken when the submarine is flipped on the X axis (for example in PvP). +- Fixed sprite bleeding on some structures and items. +- Fixed clients sometimes displaying missions as having failed even though they succeeded server-side. +- Fixed fabricating getting interrupted if you start fabricating an item whose recipe is unlocked by a talent on some bot, and then switch to that bot. +- Fixed items that are marked for "relocation" (automatically moved to the main sub) after a bot drops them in the outpost disappearing if you save and quit. Now we also handle the relocation when saving and quitting mid-round, not just when starting a new round. +- AutoInteractWithContained fixes: + - Ignore AutoInteractWithContained in editors (e.g. don't force picking up an item from an artifact container when trying to rewire it in the editor). + - Enabled AutoInteractWithContained on fire extinguisher brackets and weapon holders (interacting with one automatically picks up the item). +- Fixed all walls taking double damage. +- Fixed portable pump UI flickering on and off when picked up in MP. +- Adjusted Camel airlock layout: removed the inner horizontal wall and moved the wires and components. +- Fixed the oxygen generator not being wired on KopraKoht beacon station. +- Fixed respawn shuttle spawning when a respawn triggers, even if all the characters spawned directly in the main sub (e.g. because they had an existing character who was previously on the sub). +- Fixed docking ports and hatches being very difficult to interact with when they overlap with a door or a hatch. +- Fixed flak cannon shrapnel not damaging the character who fired the cannon. +- Fixed campaign map sometimes auto-opening at the beginning of the round (more specifically, when traversing backwards to certain kinds of levels). +- Fixed crashing when the game doesn't have access to certain folders or files (e.g. if the folder the saves are stored in is set to be read-only). Should now throw a console error instead. +- Fixed selected container staying open if you lose access to it by e.g. putting the ID card that's required for access into another item in your inventory. +- Fixed characters teleporting outside when they pass from hull to another, and there's a tiny sliver of "outside space" between the hulls. +- Fixed hanging end disappearing from a wire when you connect the other end. +- Fixed marking a stack for deconstruction only marking the first item for deconstruction server-side, even though the deconstruct icon is displayed on all client-side. +- Fixed an issue that caused duplicate characters in the HR manager menu. Happened when you moved a hire to the pending list, closed the menu and then reopened it. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.4.6.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed monsters sometimes spawning immediately after the round starts (often happened between levels, when there was no outpost between them). +- The 'Art of Submarine Warfare' book granted by the 'War Stories' talent is now a separate item and the original book has been reverted to its original state. +- Fixed Thalamus' fleshgun ropes not being able to stick to a submarine anymore. +- Fixed Thalamus' flesh spike crashing the game in the multiplayer game mode. +- Added a scrollbar to the submarine warning list. Fixes the list not fitting on the screen, when there were multiple, long errors. +- Fixed server list filters not saving properly. +- Fixed marking a stack of items to be ignored or deconstructed only taking into account the first item of the stack, instead applying to all items of the stack. +- Removed duplicate localization lines that caused old versions of text to show up in some places. +- Fixes to the Chinese localization. +- Fixed the inability to edit tags that contained the same word as one of the predefined tags. +- Fixed a crash on opening the contextual order menu for an item of another character's inventory while the health interface is open. +- Fixed a crash when editing and resizing the circuit box label texts. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.4.5.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed crew remaining dead, mission remaining completed/failed, etc when you return to the lobby an restart the round. The issue was that the server did not properly load the previous save when opting to continue the ongoing campaign. +- Added a button to the server lobby which opens the server description in a popup to make it easier for players to find. We are still thinking of the best way to handle the description/MOTD, this is more of a quick band-aid solution for the description being too easy to miss / difficult to find at the moment. +- Fixed descriptions being outdated on some of the modified XP talents. Currently only fixed in English, the descriptions in other languages are still outdated. +- Fixed "command not found" error when trying to use the new "converttowreck" console command. +- Fixed items in a container in the submarine not being counted in the "owned items" count in the store interface. +- Fixed bots being unable to properly clean up some items, just taking them into their inventory and leaving them there. +- Fixed drinkable items (such as ethanol) giving the full effect with just a tiny sip. +- Fixed effect from the "revenge squad" talent only lasting 60 seconds. +- Fixed combat diving suit being slower than intended when using an underwater scooter. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.4.4.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed welding objective completing automatically in the basic tutorial due to the reduced flooding rates. +- Small fixes to localization issues. +- Bots don't consider opiates valid treatments for burns, because the amount of burns they heal now is so low it just leads to wasting meds. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.4.4.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Updated localizations. +- "Lock default wiring" server setting locks components in circuit boxes too. +- Fixed circuit box labels being resizeable to a negative size, making them impossible to select afterwards. +- Fixed inability to remove circuit box labels in multiplayer. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.4.3.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Added new lost cargo missions, in which you must recover cargo from a sunken sub. +- Added six new beacon stations, and updated existing beacon stations. +- Added seven new wrecks. +- Chat messages and NPC dialog is shown in speech bubbles above the character's head. Can be disabled in the game settings. +- Improved the particle effects when the sub hits a level wall, and when cutting/destroying level walls. +- Certain afflictions and talents change the character's walking/running animations (e.g. drunkenness, the "musical talents", vigor, hyperactivity, concussion). +- Removed the randomization of quality from fabricated stackable items. The randomization made them annoying to fabricate, because the items of different quality couldn't be stacked in the fabricator's output slot. +- Motion sensor ranges are visualized when wearing engineer's goggles. +- Made fabricators and deconstructors faster in outposts (it's not fun to force everyone to wait while someone is working a fabricator in an outpost). +- Fire no longer damages husk eggs, fruit and explosives over time. Allowing them to be partially damaged made them really difficult to handle when they happened to be in a stack. Now husk eggs are immune to fire, and the rest get destroyed completely after being in fire for a moment. +- Improvements to the visual effects of lava vents and hydrothermal vents. +- Pets leave behind a corpse when they die. Having them just "pop" often meant you couldn't be sure if the pet had gone missing or died. +- Added a hotkey for dropping the held item. Not bound to any key by default. +- Added a hotkey (by default Alt) that displays a label on all nearby interactable items. The label can be clicked on to interact with the item. Should make it easier to e.g. find loose items on the floor or pick up a specific item when there's many close to each other. +- Tons of changes and improvements to outpost events: the main goal has been to make the things described by the event popups "actually happen", as opposed to just describing them in text. There's now more visual and audio effects in the events, and the things described by the texts tend to actually exist in the game world. There's also been lots of changes to the outcomes of the events: the choices you make should now generally be more meaningful. +- Most outpost events can now be started by another player if the first player who encounters them chooses to ignore them. +- Made the bilge pump circuits non-interactable and the bilge pumps non-wireable in outposts. It was too easy to abuse them to drown the outpost. +- All the pathways from the location you start at in the campaign lead to an outpost. Choosing a new destination at an uninhabited location seems confusing to new players, who haven't yet seen how transitions between levels work. +- Improvements and fixes to harpoons and ropes: the user can now pull towards the target by pressing space (but only when diving), added sounds to reeling and the rope snapping, adjusted the forces and changed how the forces were applied to both the user and the target. +- Added ON_DOCK and ON_UNDOCK outputs to docking ports. +- New automatic docking hatch assembly (much simpler than the old one, now built using a circuit box with labels that explain how it works). +- Added an option to add labels inside circuit boxes (can be used to e.g. explain parts of the circuit). +- Added a menu to the submarine editor that lists all the container tags used in the submarine, explains which tags are available and how they're used, and allows adding them to containers more easily. There's also now a warning on saving if the submarine is missing any common/recommended tags. +- Clown crates now have pressure immunity, making them potentially useful for more than just fooling around. + +Monsters: +- Added Viperling, a venomous variant of Spinelings. +- Reintroduced the legacy monster Mantis. Keep an eye out for anything unusual on the walls when exploring caves! +- Changes to make big monsters more of a threat to characters inside the sub, not just the submarine itself: + - Charybdis can poke its head inside the sub, bite and pull characters out. + - Made monsters better at targeting positions on the hull with a character on the other side (meaning they're more likely to be able to cause shrapnel damage). + - Made the shrapnel particles more noticeable. + - Endworm can poke its mandibles inside the sub and damage characters inside. + - Heavy impacts can launch off very high-velocity shrapnel that can penetrate a couple of inner walls, similar to spineling spikes. + - Added some weaknesses to abyss monsters: Endworm has a weak spot in its mouth, Charybdis flees for a moment if it takes heavy damage to the head or mouth (a feature that initially was there but had been bugged for a while). +- Updated husk's ragdoll, textures and animations. +- Husks can now go unconscious and eventually get back up if not "properly" killed, the same way as huskified humans. +- Adjustments to the loot dropped by Latcher and Charybdis. + +Diving suit changes: +- Several changes to to make it less obvious choice to wear diving suits indoors all the time: + - Hull breaches flood the sub more slowly now, giving you more time to find a suit. + - Reduced walking speed when wearing a suit (with adjustments to the animation to make the suits feel more "tanky", as opposed to just making the character look like it's walking in slow-motion). + - Reduced the damage protection of suits - it was previously so high it encouraged wearing the suits in all situations just for the damage protection they offer. + - Wearing a suit obstructs your vision more now. + - Reduced the crush depths of diving suits to make them match the maximum crush depth of a fully upgraded sub. Allowing players to survive below the sub's crush depth didn't make that much sense: it was practically impossible to recover the sub, so it's better to treat as a "game over" state and kill the players, as opposed to leaving the game in an unrecoverable "soft-locked" state. +- Decreased the armor ratings (damage modifiers) of the (early-game) diving suits. +- Added Explosion Damage resistance to diving suits and protective gear (and clown outfits, ka-honk). +- Made the exosuit more powerful by giving it more damage resistance, a chance to ignore stuns and increasing its speed + +Balance: +- Minor adjustments to the turret balance (most noticeably, made explosive ammo less OP, armor piercing ammo more effective against structures). +- Removed threshers from Cold Caverns. Thresher bites can now cause infected wounds, which can be treated with antibiotic glue, broad-spectrum antibiotics or by applying ethanol or rum to the wound. +- Acid grenades have a slightly longer duration. +- Increased the amount of hyperactivity given by energy drinks. It's still pretty weak, but the previous effect was practically meaningless (making the item more harmful than useful due to the nausea it can cause). +- Dual-wielding ranged weapons reduces reload times and accuracy. + +Medical system: +- Made opiates less of a "solution for everything": they have a much higher risk of causing addiction and overdoses, and morphine heals much more slowly, making it less viable for combat-heavy situations. +- Added "infection" affliction type to add some variety to afflictions. Thresher bites and, on high world hostility campaigns, bleeding wounds and untreated burns have a chance of becoming infected. +- Added "alcohol sensitivity" as a side-effect of antibiotics. This causes drunkenness to build up much faster, so avoid using antibiotics and alcohol together! +- Stabilozine's effects no longer stack: it stops the progress of poisons, but doesn't cure poisonings. +- Added "adrenaline rush" as an effect for adrenaline. "Adrenaline rush" keeps the patient conscious for its duration, removes all active stun when inflicted and applies short-term stun resistance. +- Husk infections can be treated with sufforin and cyanide (but you must be careful to have a cure at hand!). +- Antibiotic glue can be used multiple times. +- Ethanol and rum can be poured on limbs to treat infections and burns. +- Removed skill requirements from tonic liquid. +- Alien blood causes organ damage, making it less viable as a risk-free cheap alternative for blood packs. +- Saline can be used to treat infections. +- Resting in bunks heals injuries a little faster now. +- Europabrew can now act as a universal poison cure, but also speeds up husk infection in addition to vulnerability to acid burns. +- Rum can now also be made from pomegrenade. + +Submarines: +- Fixed Azimuth's periscope being too high up, causing the characters to float when using it. +- Fixed hulls being set up strangely in Camel's humps (not extending all the way up to the ceiling, making it possible for there to be holes in the walls without water getting in). +- Various fixes and improvements to the shuttles. +- Fixed too low oxygen output in Typhon's brig, causing characters inside to eventually suffocate without an additional oxygen supply. +- Fixed Azimuth's cargo and engine rooms not draining full due to the hulls extending below the floor and the bilge pumps. +- Fixed sloped wall piece making it difficult to move from Remora to its drone. +- Fixed grenades sometimes going through certain walls (one common spot was Camel's bow). +- Adjusted the hulls in Orca's lower airlock. The small in-between hull with the pump prevented the sub from flooding, because water couldn't flow out from that small hull fast enough to counter the rate of the pump. + +Additional campaign difficulty settings: +- Oxygen tank duration. +- Reactor fuel duration. +- Crew vitality. +- Non-crew NPC vitality. +- Shop purchase prices. +- Shipyard purchase prices (buying new subs and upgrades). +- Severity of injuries from failed repairs. +- Mission income. +- Option to disable the husk infection warning messages. +- Renamed the generic "difficulty" setting as "world hostility", since it only affects things such as monster spawns and environmental hazards. + +Wrecks: +- Added wrecked variants of chaingun, pulse laser, flak cannon, double coilgun and their loaders. +- New wrecks: Barsuk, Camel, Humpback, Typhon 2, Remora, R-29 and Venture. +- Fixes to the wreck spawning logic: linked submarines and non-hulled spaces are taken into account in the placement, preventing them from ending up inside walls. +- Various improvements and fixes to the existing wrecks. +- Added new, higher-res wrecked versions of the shuttle sprites. Marked the old ones as legacy structures. +- Fixed wrecked hatches' broken sprite rendering in front of characters. +- Added console command ‘converttowreck’ to convert submarines to wrecks more easily. + +AI: +- Bots can now be ordered to deconstruct items. There's a separate contextual order for marking items to be deconstructed and a regular order that makes the bots start deconstructing those marked items. +- Improvements to medic AI: they're now better at taking the negative effects of drugs into account, meaning they should be less eager to cause opiate overdoses. +- Made bots better at choosing suits adequate for the current depth. +- Fixed escaped prisoners being unable to seek for weapons in the prisoner transport missions. +- Fixed inability to order bots to turrets that are connected to the periscope via wifi components inside circuit boxes. +- Fixed bots cleaning up active glow sticks and flares. +- Fixed bots sometimes deciding to idle inside docking ports. +- Fixed bots being unable to put two-handed items on their back when trying to use an underwater scooter. +- Fixed medic bots sometimes taking meds from inside their autoinjector headset even if they have suitable meds in a toolbelt or some other container in their inventory. +- Fixed escorted characters (e.g. separatists) attacking you if you steal items from bandits. + +Multiplayer: +- Added player-specific voice chat volume sliders (i.e. if a specific player is very loud in the voice chat, you can reduce their volume or vice versa). +- Fixed inability to remove invisible symbols (= special symbols not included in the fonts the game uses) from your name using the name text box in the server lobby. This seemed to be the cause for the mysterious "name contains symbols disallowed by the server host" errors: if your Steam name contained special symbols the game can't render, you couldn't remove them by editing the name in the server lobby. +- Fixed an exploit that allowed getting free items from stores. +- Replaced Reaper's Tax with optional extra skill loss when respawning mid-round. +- Fixed clients' wallets appearing empty when spawning mid-round. +- Reworked the server lobby layout. The goal was to reorganize the UI to group things in a more logical way and to make things easier to find. +- Adjusted the local voice chat range significantly shorter (comparable to the range of the local text chat now). +- Fixed VOIP breaking after changing the resolution. +- Fixed characters sometimes getting assigned different personality traits between clients and the server. +- Fixed inability to hire more crew if you've reached the maximum crew size, and then fire some to make room for more characters. +- Fixed clients not getting notified in any way when a server has disabled downloading mods directly from the server, causing them to just get stuck in the mod download screen. +- Fixed servers without an active host or anyone else managing the rounds getting stuck if the settings were configured in a specific way: if the respawn transport time was set to infinite (shuttle will spawn once, but will never leave the level and allow a 2nd respawn), the shuttle had spawned and all the players left, and someone new joined the server, they wouldn't be able to end the round because they've never spawned, and could also never respawn. + +Talents: +- Reworked most of the XP-giving talents to make them more meaningful and balanced. +- Fixed "Fireman's Carry" talent not working on stunned characters. +- Fixed tinkerer talent (which allows repairing items above 100%) causing some oddities with repair thresholds: the item would show up as repairable when the condition percentage (relative to the above-normal maximum condition) was below the threshold, but the repair UI wouldn't show up until it was "actually" below the condition where it should become repairable. +- Fixed talent options displaying as locked (gray frame and a lock icon in the corner) even if you've unlocked them if another sub tree is incomplete. +- “Residual Waste" can no longer be exploited for duplicating FPGA circuits. + +Improvements to sub editor's grouping: +- Groups are now called "layers", which reflects their common uses better than "groups". +- Layer options are more easily available in the right-click context menus. +- When a layer is selected, all new entities you place are automatically placed into that layer, so you don't need to manually move every new item you place. +- Added LayerAction as a way for ScriptedEvents to enable or disable layers, useful for modders. + +Fixes: +- Fixed some items sometimes falling through holes on the submarine's floor (and sometimes also getting stuck partially inside the floor). +- Fixed campaign saves getting bricked if you save the game during the brief moment when your crew has died, but the "game over" popup hasn't appeared yet. +- Fixed campaign saves getting bricked if you save the game after you've fired some of your crewmates through the HR manager and the remaining characters have died (or vice versa). +- Fixed (traitor) events that require you to fabricate a specific item complete regardless of what you fabricated. +- Fixed being able to fabricate items from just one ingredient, when the one ingredient matches multiple 'variable' ingredients (ingredients where multiple materials are valid, such as assault rifle magazines which require a munition tip, core and jacket). +- Fixed thalamus organs sometimes spawning in dry hulls, making them die without the player having to do anything. +- Fixed diving suits emitting light when placed in cabinets in the sub editor. +- Fixed waytoascension2 event getting stuck if you choose the "I'll need to think about this" dialog option, end the round, and start a new one. +- Fixed being able to switch submarines using the submarine switch terminals in abandoned outposts or the "dummy outposts" inside normal levels. +- Fixed piezo crystals sometimes spawning close enough to wrecks and beacon stations to zap them. +- Fixed character hover texts (e.g. "[G] grab") not refreshing when you change keybinds. +- Fixed CPR pump animation often causing impact damage to the patient. +- Fixed sonar sometimes not showing parts of the mountain on the ocean floor. +- Fixed beacon stations you've restored during the round not displaying as active on the campaign map until you start a new round. +- Fixed inability to pick up dropped stun batons. +- Wire nodes are placed at the center of the grid cells instead of the corners to get them to align with signal components placed on walls. +- Fixed being able to quickly swap the suit you are currently wearing with a broken suit, by just clicking the broken suit. +- Fixed status effects on certain monster's limbs not working: Charybdis had one that should've made it retreat when it takes heavy damage to the head or mouth, and Fractal Guardian, Moloch and Latcher should've emitted special particles when hit on the weak spots. +- Fixed genetic materials not getting destroyed when a gene splicer gets moved to a duffel bag when a character despawns. +- Fixed language of the units (km/h, m) not changing on the nav terminal when you change the language mid-round. +- Fixed crosshair being mispositioned for a split-second when the character turns around while aiming. +- Fixed leaks sometimes being impossible to repair on "Tail Fin E P2". +- Fixed freezing when you press tab in the sub editor's wiring mode. +- Fixed duct blocks sometimes casting shadows strangely (leaving a see-through gap between the duct block and the adjacent walls). +- Fixed deconstructing a nuclear depth decoy fabricated with the cheap recipe outputting incendium (even though it's not included in the recipe). +- Characters that have thresher genes or who don't need oxygen for some reason (husk infection/symbiosis) don't consume oxygen from tanks. +- Fixed a rare level generation issue that sometimes prevented certain levels from loading, kicking the game back to the main menu or server lobby with the error message "maximum amount of entities exceeded". +- Fixed door's sound muffling effect behaving inconsistently in MP (sometimes muffling sounds even though the door open). +- Fixed certain keys on an AZERTY keyboard not being recognized as keybinds. +- Fixed steep but short wall pieces launching characters downwards too aggressively. +- Fixed buoyancy still affecting docked subs differently than other subs. A sub with docked subs/shuttles would ascend and descend slightly slower than one where the hulls are all part of the same sub. +- Fixed gaps' and waypoints' groups resetting in the sub editor when saving and loading. +- Fixed monsters in the idle (or observing) state moving at too slow speed and changing the direction in which they were heading too rapidly when they wander around. +- Fixed enemy subs' and respawn shuttle's crush depths not being set correctly, sometimes causing them to get crushed in late-campaign levels. +- Fixed items in a character's inventory, who's in the main sub, being counted twice in the "owned item" count displayed in the store interface. +- Fixed purchased items spawning attached to a wall if there's no room in your inventory. +- Fixed characters spawned using console commands not getting ID card tags for the sub they spawn in. + +Modding: +- Fixed inability to publish mods when the language is set to Japanese. +- Added support for defining the ragdoll by a content path, instead of having to define it by a folder. Allows decoupling a ragdoll from a character. +- Added support for (temporarily) overriding character animations using status effects. Allows, for example, wearable items and afflictions to change the character's walking and running animations (see divinggear.xml and afflictions.xml for usage examples). Note that the vanilla animations are configured using the file name, which makes the game search for the animation file from the folder the rest of the character's animations are in. If you want to make your mod add a custom animation to a vanilla character, you need to configure the animation using a file path instead (e.g. path="%ModDir%/CustomWalkAnimation.xml"). +- Fixed variants of character variants not working. +- Added an option to force location types to be owned by a specific faction by adding faction="somefaction" or secondaryfaction="somefaction" to the location type config. +- Fixed inability to drag and drop items into hidden inventories. That can't be done with any vanilla items, but turns out some mods had functionality that relied on this behavior, and we broke it in the latest update. +- Sub editor now warns about rooms with insufficient oxygen output (= if the vents output too little oxygen to support one character). +- Made the joint limit widgets in the character editor (hopefully) a bit more intuitive and easy to use. There's now a gray line that indicates the angle of the limb, and that gray line is what gets clamped between the joint limits. +- Fixed widgets and indicators jittering in the character editor when the character moves. +- The "pitch slide" of turret and ranged weapon charge sounds (used in the vanilla chaingun and rapid fissile accelerator) is now editable using the “ChargeSoundWindupPitchSlide” attribute. +- The deattach speed of repair tools can be edited ("DeattachSpeed" attribute). +- Fixed events that are not allowed at start not triggering if you're in the abyss (or somewhere else a long way away from the destination). +- Fixed PerCave/PerRuin/PerWreck event settings not working correctly in event child sets (the game created the correct number of events, e.g. 3 if there's 3 caves, but each event happened in a random cave). +- Added an option to make TagAction require the target to be in a module with specific tags +- Fixed NPCOperateItemAction being hard-coded to select Controller components, meaning you could only use it to make the character interact with an item that has a Controller component. +- EventManager now works also in the editor test modes. +- Fixed the “interval” attribute of status effects not working when the effect was defined in limbs. +- Added an option to select a specific wreck and a beacon station in the level editor (simplifying testing when you want to test a specific one). +- Fixed room name selection (accessible in the sub editor when editing a hull) being empty if any text file in a mod includes overrides. +- Fixed reputation bars always showing -100 and 100 as the minimum and maximum, even if a custom faction has a different min/max value. +- Fixed crashing when spawning a humanoid character that doesn't have any head sprite configured for it. +- Fixed crashing when placing a door item that's set to be open by default. +- Fixed OnOpen and OnClose action types only working for playing sounds when a door opens or closes, but not for actual status effects. +- Fixed "custom skills" the character's gained during the round (skills levels the character/job originally doesn't have) disappearing between rounds, and only reappearing when the character gains some skill level. +- Fixed MissionActions that are set to choose from a pool of missions always choosing the same mission. +- Fixed inability to take specific kinds of items from a container that requires holding some item. For example, if you needed to hold a crowbar to access a cabinet, and took an item from the cabinet in a way that forces that crowbar item to be unequipped. +- Fixed WeldedSprites not appearing in the sprite editor. +- Fixed connection panel interface's borders overlapping with the connector sprites on certain resolutions if the panel is very tall. +- Fixed OnImpact effects not working on broken items even if AllowWhenBroken is set true. +- Fixed TriggerComponents no longer applying forces or other effects to characters when they ragdoll. +- Made OnSuccess and OnUse effects usable in Repairables (previously only OnFailure effects worked). +- Fixed event editor crashing if you tried to load an event that had action with attributes set to incorrect types of values (e.g. with a CheckMoneyAction with amount set to a string). +- Fixed "Collider" spawn rotation type when spawning items via a status effect not taking the flipping of the parent item into account, causing e.g. projectiles to launch to the right when aiming to the left. +- Fixed tracer particles not showing up when a projectile is spawned using a status effect indoors. +- Fixed crash if a non-attachable item is made attachable mid-round (e.g. via status effects or console commands) and the submarine then saved. +- Fixed monsters always aiming ranged attacks at the position of the target character regardless of which limb they're targeting. Was not noticeable in the vanilla game, because none of the vanilla enemies tried to aim at a specific limb. +- RequireAimToUse is no longer forcibly enabled on ranged weapons (i.e. it's possible to create a ranged weapon you can fire just by left clicking). + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.3.0.4 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed another exploit that allowed crashing servers by sending them specifically crafted malformed data. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.3.0.3 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed an exploit that allowed crashing servers by sending them specifically crafted malformed data. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.3.0.2 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed inability to download missing mods from the Steam Workshop when you're joining a server. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.3.0.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed character face selection not working in the singleplayer campaign setup menu. +- Made the "connection lost" error messages when connecting to a server fails more descriptive. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.3.0.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Epic Games Store release. +- Steam players have the option to enable crossplay between Steam and the Epic Store. When you launch Barotrauma for the first time following our EGS release, you will see a prompt asking whether you want to enable crossplay. If you do not wish to do so, you can decline, and that will be all. You can also update your preferences at any time in the game settings. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.2.8.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Changes: +- Allow scaling most items below 0.1 in the submarine editor again. We set 0.1 as a hard limit because smaller scales caused issues with tiling items (such as labels), without realizing some sub builders have found some creative uses for heavily downscaled items (such as tiny turrets used as "dials"). + +Fixes: +- Fixed escorted characters trying to leave the sub if they can't find a safe hull to get to (e.g. when the sub is flooded). +- Fixed rotated structures not appearing rotated on the status monitor. +- Fixed wires getting misaligned when saving them in an item assembly. +- Fixed security NPCs being unable to swap batteries in stun batons. +- Fixed inability to edit the false output of a switch in multiplayer. +- (Finally) fixed texture offsets on tiled sprites such as background walls behaving erratically on non-default texture scales and mirrored entities. + +Modding: +- Fixed crashing if an affliction prefab contains stat values with a duplicate type, or multiple stat values whose type can't be parsed. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.2.7.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed an issue that sometimes caused the game to crash without generating a crash report (which would lead to a "pipe was broken" error if the issue happened server-side). The issue had to do with a stack overflow when throwing specific kinds of console errors: one common case was when the game failed to connect to our server to check the GameAnalytics consent, which lead to a crash on startup. +- Fixed piezo crystals sometimes spawning right at the start of the level. +- Fixed assistants not being able to pick all tier 1 and 2 talents. +- Fixed location names disappearing when locations change their type in saves started in pre-1.2 versions. +- Fixed selection rectangle disappearing from items when zoomed in by more than x2 in the sub editor. +- Fixed "killcrawlerswarmlarge2" mission not having a description. +- Fixed bots sometimes choosing to wear broken diving suits. +- Fixed currently visible particles freezing when lowering the particle limit. +- Fixed dragged characters always colliding with stairs, making it impossible to drag them past the stairs. +- Fixed "drunken sailor" talent not nullifying the negative effects of drunkenness. +- Fixed stun from the "lightning wizard" talent activating if you cause damage to yourself (e.g. by breaking a wall and taking damage from the shrapnel). +- Fixed escorted security officers sometimes inspecting the crew for stolen items during escort missions. +- Fixed basics tutorial sometimes getting stuck in the "weld leak" objective. +- Fixed ancient weapon not flipping horizontally when aiming it to the left. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.2.6.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Added some more logging to diagnose the mysterious "pipe was broken" crashes. These seem to happen when the server crashes in some way that prevents it from generating a crash report or communicating the reason of the crash to the clients. Now the "pipe is broken" crash report should include the exit code of the server process, giving us more clues for diagnosing the issue, and the server should create simplified crash report if there's some kind of an issue with creating the normal crash report. + +Changes: +- Structures can now be rotated in the sub editor! +- Outpost security is now better at catching thieves: they can do random inspections to check for stolen items (more frequently if your reputation is low or if they've caught someone in your crew stealing), and notice if you're visibly carrying or wearing any stolen items. +- Option to get the items you're buying from an outpost store in your inventory immediately, as opposed to them being delivered to the sub at the start of the round. There's also now an anti-griefing setting for disabling this, in case you want to make sure a griefer can't easily gain access to dangerous items in the outposts. Players with campaign management permissions aren't affected by the setting. +- Added new variants of the Monsters Nearby and Submarine Flooded tracks. +- Minor adjustments to level layouts: all the levels now slope down a bit to give the impression you're actually heading deeper. +- Clicking on a door that's set to not toggle when clicked (= door that just send out an activate_out signal when clicked) doesn't activate the door's "toggle cooldown". +- Bots operating turrets can now lead targets (i.e. aim ahead of a moving target). Bots with a higher weapon skill are better at estimating the future position of the target. +- Minor balance change to sub vs sub combat. AI-controlled subs get at least 2 security instead of 1, so more turrets will be manned. +- Bots can see through windowed walls (also making it easier for them to spot stealing). +- Added bilge pumps and duct blocks throughout outposts. Otherwise the outposts can never drain if the player causes a flood. +- Removed karma restrictions from jobs. This feature wasn't communicated anywhere, and it often just seemed like a bug when someone didn't get assign the job they wanted due to their karma being too low. +- Added bullet casing particles to firearms. +- Adjusted default throwing pose a bit: characters don't extend their arm as high up, because it could cause the throwable item to hit the ceiling in roughly door-height rooms. +- Most message boxes can be closed by pressing enter (more specifically, all boxes that are created with just the "ok" button). +- ID cards left in a duffel bag are automatically removed at the end of the round. +- Added a light to handheld sonar to indicate when it's on + made the ping a bit higher in pitch to differentiate it from the sub's sonar. +- Reduced the forces applied on characters by fractal guardian's melee attacks. The previous values were so high they often lead to characters getting stunlocked when the attacks threw them against the walls of the ruin. + +Traitors: +- Three new Danger Level 1 traitor events: Exhibitionism, Firing Blanks, The Original Honkero. +- Five new multi-traitor events: Gnawing Cold, The Clobbery Robbery, Husk Roulette, Duck Side of the Moon, Powered by Faith. +- Fixed "Insurgency" achievement not unlocking when completing a traitor event. +- Fixed traitor-specific items sometimes being requested by stores. +- Fixed visibility checks in some traitor events having infinite range. +- Don't allow the victim's body to despawn in the "dead or alive" event because it'd interfere with completing the event (others finding the body). + +Optimization: +- Significant optimization to situations where a bot is idling and has trouble finding a path to another hull. Caused performance issues in colonies in particular. +- Fixed a memory leak that caused the memory usage to increase every round. +- Fixed firing turrets (or doing any other action that spawns lots of new entities) causing an enormous performance drop in some situations. Had to do with specific scripted events re-checking their targets whenever a new entity spawned, which was needlessly heavy and was done unnecessarily often. +- Miscellaneous small optimizations. +- Optimized labels (large labels with a scaled down texture in particular were unnecessarily heavy). +- Optimized Watcher's status effects. + +Multiplayer: +- Option to hide servers from the server list. +- Option to report inappropriate servers on the server list. +- Added "MinimumMidRoundSyncTimeout" server setting. Determines how long the server waits for a mid-round joining client to get in sync before disconnecting them. +- Fixed workshop item downloads sometimes getting stuck when opting to install server mods from the workshop. Happened if the mod had already been installed, was in the process of being installed, or if it couldn't be installed for some reason. +- Fixed dedicated servers with lots of mods enabled not showing up in the server browser. +- Fixed Text and NPCConversation files being required to be in sync between clients and the server, meaning if you were using a mod that changes the game to a different language, it'd get disabled when you joined a server that's not using the mod. +- Fixed lack of unban option in the "manage client" menu and the client context menu. + +Talents: +- Five new assistant talents: Starter Quest, Mule, Jenga Master, Indentured Servitude, Tasty Target. +- Fixed "junction junkie" not working on sonar monitors. +- Fixed a couple of inaccurate talent and mission descriptions in Russian. + +Skill gain balancing: +- Now takes longer to reach max skill level, the Helm skill especially was leveling way too fast. +- Helm skill levels up based on the submarine's speed. +- Added an exponent factor to the skill increases for diminishing returns at higher skill level. +- Increased skill gains at lower levels to compensate. +- Welding gives more skill. +- Fabricating items gives less skill. + +Fixes: +- Fixed "camera zoom effect" taking a very long time to appear when pressure is increasing inside the sub, giving you very little time to react when the pressure gets to a lethal level. +- Fixed turret lights always being forced on at the start of the round. +- Fixed lighting artifacts that looked like thin slivers of light and strange jagged lighting that sometimes occurred in corners of rooms or places where multiple walls meet. +- Fixed lights shining through obstacles in some very specific situations (one common spot was the windowed door at the left side of Dugong's command room). +- Fixed turret lights sometimes disappearing from view when you're far from the turret (but still close enough to see the light). +- Fixed "bad vibrations 2" event getting stuck if you choose the option to sleep. +- Fixed components disappearing from a circuit box if you delete one in the sub editor and undo the deletion. +- Fixed a rare crash when you'd selected text in a textbox and changed the language of the game to one where the word in the textbox is shorter than in the previous language. +- Fixed handcuffs appearing to continuously drop from characters in certain situations in multiplayer (more specifically, if the character has been disabled and re-enabled during the round). +- Workaround to a rare mystery issue that seems to sometimes cause save files to get corrupted. It seems in some situations the submarine doesn't get included in the save: now the game checks whether the submarine is included before attempting to save the file, and refuses to save if it isn't. This does not solve the underlying issue, but should make it easier for us to diagnose why the submarine gets left out, and prevent corrupting the save when it occurs. +- Fixed "operate turret" orders showing the order marker on the turret instead of the periscope. +- Fixed respawn shuttle lights shining through the top of the level. +- Fixed flares (or other "provocative" items) not attracting monsters when you're wearing a diving suit, because the diving suit was also considered a "provocative" item. +- Fixed ability to put items into circuit boxes by dragging and dropping and with the inventory hotkeys. This caused the components to end up in an invalid state, leading to errors when loading the next round. +- Fixed custom ID card tags not getting applied to ID cards when switching subs. +- Fixed subinventories constantly opening and closing when you're hovering the cursor over the inventory slot with 2 different containers equipped (e.g. 2 storage containers). +- Fixed bots being able to take ammo out from non-interactable items or items whose inventory is set to be inaccessible. +- Fixed progress bars being visible through walls when someone uses a repair tool, damages an item with a projectile or a melee weapon, or crowbars a door open. +- Fixed crashing if you're in an outpost level with no outpost. Should normally never happen, but can occur with e.g. outdated save files or mods. +- Fixed ballast flora spores (or any other level object with no actual sprite) not being visible. +- Fixed bots "cleaning up" items from inside artifact transport cases. +- Fixed ability to sell components from inside circuit boxes in outposts. +- Fixed outpost NPCs not caring about the players starting fires. +- Fixed purchased items sometimes spawning in the cargo crates when you've got a cargo mission active, making them potentially very hard to find. +- Fixed inability to select a component you've just placed in the circuit box until you move the component for the first time. +- Fixed health scanner HUD texts overlapping on high resolutions. +- Fixed "maintain position" marker being misplaced on the navigation terminal on some resolutions. +- Fixed chance of tainting the genetic material when refining sometimes being displayed incorrectly on research stations. +- Disable the health interface of the patient in the "good samaritan" event. Prevents being able to heal the opiate overdose "normally" before triggering the event. +- Fixed item hover texts (e.g. "[E] Repair") not refreshing when changing keybinds. +- Fixed fabricator listbox scroll always resetting to the top when someone selects the fabricator. +- Fixed bandoliers not affecting pulse laser fire rate. + +Modding: +- When running an outdated executable (i.e. a mod that overrides the game executable, but hasn't been updated yet after a new vanilla update has been released), there's a notification in the main menu and the "host server" menu warning you about the potential issues caused by running an outdated executable with the other up-to-date vanilla files. +- Console errors and warnings caused by modded content include the name of the mod to make it easier to diagnose which mod is causing some issue or whether it's an issue in the vanilla game. +- Support for overriding texts. Works using elements, the same way as overriding any other content. +- Fixed decorative sprites not being visible on items placed in a container. Did not affect any vanilla content (there were no decorative sprites on any item that can be visible in a container). +- Fixed characters with no AI defined causing crashes. +- Fixed inability to make StatusEffectAction modify the properties of an ItemComponent (only worked on the actual Item). +- Option to have multiple conditionals in CheckConditionalAction. +- Option to limit how many times a GoTo action can be executed (i.e. to create loops that only repeat a given number of times). +- TutorialHighlightAction can now be used in multiplayer too, renamed it as HighlightAction. +- Fixed first matching Containable definition of an ItemContainer determining the hiding, position and rotation of a contained item, disregarding which subcontainer the item is actually in. E.g. if a weapon had 2 subcontainers for magazines, both with a different ItemPos, the ItemPos defined in the first subcontainer would be used for both magazines. +- Fixed stun batons not accepting modded batteries because the RequiredItem s were configured using identifiers instead of tags. +- Fixed Character.CameraShake setting the camera shake regardless if the character the effect is being applied on is the controlled one or not. +- Location names can now be translated. In the vanilla game the names are only translated if you're playing in Chinese. +- Fixed some ConversationAction options going outside the bounds of the dialog if there's a very large number of them. +- Fixed inability to use %ModDir% in LevelGenerationParams.ForceBeaconStation. +- Fixed status effects configured to spawn an item in ContainedInventory not spawning the item if it can't go inside the first item in the contained inventory. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.19.3 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed shrapnel from flak cannon ammo always launching upwards. +- Fixed wall damage shrapnel going through walls and being a little excessive overall. +- Fixes to pressure distribution logic: fixes pressure sometimes being lethal in breached rooms that weren't full of water. +- Fixed clients not regaining control of their braindead character after rejoining if the character's taken any amount of damage while braindead. +- Fixes to inconsistent stack sizes (e.g. certain ammo types stacking up to 12 in character inventories, but only 8 holdable/wearable items like backpacks and toolbelts. +- Fixed console errors when switching subs with circuit boxes on board. +- Fixed items that are inside a container that doesn't get transferred getting duplicated during item transfer when switching subs. +- Fixed bots not cleaning up circuit boxes from the floor. +- Fixed stack size being displayed incorrectly in the tooltip when dragging a stack of items to an already-occupied slot. +- Fixed nav terminal's docking button not working if the signal is routed from the terminal to the docking port through a circuit box. +- Fixed double-clicking a component while a circuit box is equipped making the component vanish inside the circuit box. +- Fixed chat messages sent when accusing someone as a traitor not triggering the spam filter. +- Fixed connection names not being translated in circuit boxes (always showed up in English). +- Fixed right-side crew panel overlapping with the mission panel in the PvP mode round summary. +- Fixed depleted and fulgurium fuel rods stacking up to 32 (should be 8 like all other fuel rods). + +Modding: +- Added "UseHumanAI" property to characters (can be used to enable the human AI on characters other than humans). While using the human AI on non-humans isn't a fully supported or tested feature, it was previously possible to do that by creating a human prefab using a different species than human, but that no longer worked as of the Treacherous Tides update. +- Attachable holdable items don't count as "HoldableOrWearableInventories". Fixes e.g. tanks only stacking up to 1 in things like movable cabinets and shelves. Does not affect any vanilla content. +- Fixed fabricator reducing the condition of all the available ingredients if the crafting recipe reduces condition instead of consuming the whole item. +- Fixed TagAction continuing in some situations when it can't find targets, even if it's been configured not to with the "ContinueIfNoTargetsFound" attribute. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.18.1 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed opening the "load game" menu crashing the game if you have any corrupted/unloadable saves in the save folder. In multiplayer, this would just prevent opening the campaign setup menu without any error messages. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.18.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Updated translations. +- Modding: Added ContinueIfNoTargetsFound property to TagAction. Can be used to allow the event to continue even if the TagAction can't find any valid targets (by default the event wont continue until at least one target is found). + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.17.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Changed traitor event selection logic a bit: most of the more dangerous events can trigger as long as a less dangerous event has been selected previously, even if that event wasn't completed successfully. Previously many of the dangerous events were extremely rare, because they required 1. completing an easier event first 2. a specific mission to be selected on the following round. +- Adjusted traitor event probabilities a bit to make some of the rarer ones more common. +- Fixes to some oddities and inconsistencies in containers: backpacks can't go in crates, duffel bags or outpost cabinets, fixed storage containers going in outpost cabinets. +- Fixed searchlights appearing as turrets in the "operate weapon" order (and the bots would complain about not being able to load ammo into them if you ordered them to operate one). +- Fixed security fleeing from the player during jailbreak missions. +- Fixed security not spawning in jailbreak missions in the mission mode. +- Fixed morphine not being shown as a suitable treatment for the concussion in the medic tutorial. +- Fixed abandoned outpost you're supposed to rescue Jacov Subra from sometimes turning into a normal outpost and cancelling the mission. +- Fixed some scripted events throwing unnecessary "no conditionals defined" console errors. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.16.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed several issues when editing traitor events in the event editor (console errors, some actions not loading properly, inability to set a new event as a traitor event). +- Backpacks can't be put in cargo scooters. +- Fixed some traitor events being impossible to complete (harbringer of honks, faulty robes, handcuff shortage). + +- Fixed latcher's tongue failing to attach to submarines. +- Fixed crashing when deleting a circuit box in the submarine editor. Undoing the deletion still does not work unfortunately, but we are looking into fixing that. +- Fixed errors when modifying any properties of an ItemLabel or Turret component in multiplayer. +- Fixed flashlights in guns (or other contained items) not getting flipped in the same direction as the container when put inside the container. +- Monsters don't get damaged by the hull shrapnel when they break a wall themselves. +- Fixed "can't create an entity event" error when ending a multiplayer round when there's dropped stacks around. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.15.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Fixed console errors when there are swarm feeders (or other monsters that immediately despawn when killed) in an irradiated level. +- Fixed occasional crashes when firing a turret makes a supercapacitor drop to 0% charge. +- Fixed circuit box only outputting to one pin when wired directly from input to multiple output pins. +- Fixed tutorial reactor starting already powered up, making the first engineer tutorial objectives complete immediately. +- Miscellaneous tutorial fixes. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.1.14.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Traitor overhaul: +- Completely redesigned traitor system, which also now works in the campaign mode. +- The traitor missions (now called "events") have been implemented using the scripted event system, and can be created in the event editor. We unfortunately had to drop support for the old system; even though we aim to not do any backwards-compatibility breaking changes now that we're past 1.0, after evaluating the number of mods that include custom traitor missions and seeing how few there are, we felt that it's better to depreciate the old system instead of maintaining two separate systems. We're sorry for the inconvenience, but we're hopeful the move to the scripted event system will allow modders to create more complex traitor events much more easily! +- A total of 27 completely new traitor events. +- Multi-traitor events and code words are back! +- Instead of the yes/no/maybe traitor setting, you can choose the probability of a traitor event per round (e.g. 50% = a traitor event happens on half the rounds on average). +- Each event has a "danger level" that describes how destructive/dangerous the event is. You can choose how dangerous events can get chosen in the server lobby, for example if you don't want very destructive traitor objectives in the campaign mode. +- If a traitor completes their objective successfully, they may get assigned a more dangerous objective on future rounds (up until the maximum defined danger level is reached). +- Players who haven't been traitors before/recently have a higher chance of getting selected as traitors. +- In the campaign mode, completing a traitor objective gives the traitors rewards such as getting to "steal" a portion of the mission experience. +- The players can vote which player they suspect as the traitor. At the end of the round, if at least half of the players have voted for the same player, that player will be accused as a traitor. If the accusation is correct, the traitor's objective will fail and they will receive no rewards. If the accusation is incorrect, the crew will receive a monetary penalty. +- Added various new traitor items, perhaps most notably the Radio Jammer, a handheld battery-powered device that temporarily disables radio communications (both text and voice chat). + +Stacking and storage changes: +- Added Backpack, essentially a larger variant of the toolbelt with a small speed debuff. Can be obtained through the new assistant talent "Bag It Up", and purchased in stores around mid-way through the campaign. +- Oxygen and fuel tanks no longer stack in player inventories, but their capacity has been increased to compensate. A stack of oxygen tanks would last nearly 45 minutes (and that's not even accounting for high-quality tanks), which meant you could easily carry so much oxygen that running out is practically never a risk. +- Increased stack sizes of most items (such as materials, ammo, meds) to 32. +- Increased cabinet capacities. +- Storage containers can no longer be put in normal cabinet slots. The intention is to prevent being able to use storage containers as a way to significantly increase cabinet capacity (all the way up to 2880!). The larger stack sizes and increased cabinet capacities still allow storing a very large number of items, without having to resort to storage containers which make managing the items in the cabinet more inconvenient. +- Cabinets now have a handful of special "extra slots" specifically for storage containers. Storage containers have other uses besides just increasing storage capacity, and these extra slots are intended to keep them a viable option for those other uses. +- Added buttons for merging stacks and alphabetical sorting to all cabinets. +- Dropped stacks of items behave as one physical object and can be picked up by clicking once, instead of the stack becoming a bunch of individual items that need to be picked up one-by-one. +- Restricted the maximum stack sizes of character inventories and holdable/wearable containers to 8. Meaning you can carry 8 items per slot, but cabinets and crates can fit the "full" x32 stacks. + +Talents: +- Fixed "By the Book" giving you the bonuses regardless if you complete a mission or not. +- Changed how Scavenger talent works: previously it had a chance of doubling the loot in a container, which often led to excessive amounts of loot (and other times, no extra loot at all). Now the chance works per-item instead. +- Fixed nuclear shells and depth charges fabricated with the "Nuclear Option" talent providing incendium when deconstructed, even though it's not used in the fabrication recipe. +- Fixed having one captain with the "Leading by Example" talent and another with "Family" messing up the afflictions applied by them (one trying to apply "Excellent Morale" and the other trying to remove it). + +Misc changes and additions: +- Added Circuit Box, an item that allows creating circuits without having to fabricate and place each component individually on the sub's walls. +- Added lights that indicate the ammo status to turret loaders. +- Characters "grab" the device/item they're interacting with, making it easier to see e.g. whether a character is taking something from a cabinet or just standing next to it. +- Allowed any type of ammo box to be used in the turret ammo box recycling recipes. +- Improved explosion particle effects. +- Added a new abandoned outpost mission variant (relating to one of the shadier factions). +- Pets become unhappy faster. Previously the happiness decrease rate was so low the pets were more likely to starve to death than to become unhappy. +- Pets no longer regenerate health when they're well-fed. This was a leftover from the 1st implementation of the pets, and is no longer necessary, because they now regenerate health while eating. +- Repositioned item interfaces retain their positions between rounds. +- Killing/handcuffing the terrorists during escort missions is no longer required to complete the mission. Fixes other means of detaining them (such as brigging, stunning or paralyzing) not being considered valid before. +- It's now possible to access the gene splicer slot of dead/incapacitated characters. +- Increased fruits' impact tolerances to prevent them from breaking when falling. +- Tweaks to the sound effects when under high pressure. +- Underwater scooter's light turns on when aiming (not just when actually using the scooter). +- Captain's pipe and cigar are used by holding RMB (not LMB+RMB) to make their usage consistent with other "consumables". +- Added broken state sprites for Thalamus' fleshspike and fleshgun. Adjusted the fleshgun particle effect. +- Made characters only flip from one side of a ladder to another when aiming. Makes it easier to interact with things next to the ladder, when the character doesn't automatically flip to the "wrong side" when you try to highlight something. +- Beacon station and cave markers are removed from the sonar once the beacon/cave mission is completed. +- The Output and FalseOutput of switches and periscopes are editable. +- Added a "disable_output" pin to supercapacitors and batteries. Particularly useful for auto-operated turrets, as it can be used to power them down. +- Made auto-operated turrets much better at using pulse lasers, chainguns and other turrets that need to wind up before firing. Previously the AI was too eager to switch between targets, as opposed to waiting for the turret to wind up and actually fire. +- Added "activate_out" output to doors (outputs a signal when someone toggles the door) + an option to make the door NOT open/close when someone tries to toggle it. Can be used to run a signal through some external circuit when someone tries to open a door with integrated buttons. + +Balance: +- Adjusted ammo fabrication recipes to fix lead being too scarce (considering it's needed for almost all ammo types). Now ammunition can be fabricated from different materials, not just lead. +- Revisited the contents, the difficulty, and the rewards of monster missions. +- Balanced reputation gains from missions: it should now be less easy to maintain a positive reputation with all factions. +- Slightly increased character impact damage (i.e. damage taken when you fall or get thrown against something). +- Being under high pressure causes organ damage. Without this, it's possible to basically ignore high pressure as long as you're quick (e.g. you can briefly go outside or to a breached ballast to fix walls). +- Made gravity sphere, guardiansteamcannon and guardianbeamweapon cause a bit of radiation sickness. Afflictions that can't be treated with morphine + bandages should be more common, so here's some! +- Piezo crystals cause a bit of stun and burns on characters. +- Nerfed fractalguardian_emp a bit: longer attack cooldown, shorted EMP range. The previous values made it too easy to get softlocked. +- Added 50% flow resistance to makeshift armor to make it more effective in indoors combat. +- Revisited the effects of liquid oxygenite and the oxygen related effects of deusizine to keep them balanced. Reduced the required skill for applying liquid oxygenite to compensate for the failure effects. +- Reduced Mudraptor's priority of eating dead bodies with the intention of making it not as easy to distract them killing one in a pack. +- Improved the monster nest mission progression by introducing harder variants of all the missions. Adjusted the existing nest missions a bit. +- Buffed the ancient weapon: increase the burn damage from 40 to 50, make them ignore 50% of armor protection, allow them to cut off limbs and break (some) armor. Add stun for stopping power. +- Defined fire damage (on ballast flora) and AI combat priority for the ancient weapon. +- Set the treatmentthreshold for oxygen loss to 100, so that the bots won't try to treat patients so eagerly. Now they should react only slightly before the target faints. Note that this also affects when the suitable treatments are shown in the health interface. + +Optimization: +- Optimizations to situations when there's lots of NPCs nearby. Particularly noticeable in very crowded outposts. +- Optimized the Load Game menu in both singleplayer and multiplayer, dramatically reducing the time the game freezes when opening it. +- Optimized flashlights and other directional lights. +- Loading optimizations (loading screens should now be noticeably quicker). +- Thalamus: spawn the initial cells when the AI is loaded (at the round start) instead of doing that when the player is close by. Gets rid of the notable lag spike when approaching a Thalamus infested wreck. +- Miscellaneous smaller optimizations. + +Submarines: +- Reworked Berilia. +- Reworked R-29. +- Linked fabricators to the cabinets next to them in all vanilla subs. +- Various fixes and improvements to Orca. +- Fixed waypoints outside the submarine not being disabled as obstructed when the connection doesn't overlap a wall. +- Waypoint fixes to most player subs. +- Fixes to transferring items between subs: some items that didn't fit into cabinets weren't put into crates even if they could've been, and some items spawned unnecessary crates because they were configured to spawn in a crate despite being too big to put in one. +- Fixed incorrect "low on fuel" warning when switching to a new sub with no fuel, even if you have fuel in your current sub and opted to transfer them to the new one. + +Multiplayer: +- The skill loss on death can be adjusted in the server settings. Defaults to 50% (previously 75%). +- Fixed characters keeping all the injuries they've received while being "braindead" (killed due to disconnecting), meaning if you for example hack the character to pieces while braindead, and the character respawns next round, they'll spawn dead. +- If a client joins when their character is "braindead" (killed due to disconnection), the character is now revived and the client immediately regains control of it. But only if the character's vitality is above 0 - if they have received other lethal injuries or despawned, they'll have to wait for a "normal" respawn. +- Fixed icon in server details panel in the server list saying that every server is modded. +- Fixed clients spawning as characters even if they've opted to spectate if the game mode is switched from campaign to some other mode and back. +- Fixed fabricator sometimes starting to fabricate an incorrect amount if you click the "start" button quickly after adjusting the amount. +- Fixed occasional "received invalid SetAttackTarget message" errors in multiplayer. Happened when some attack caused the target to be killed and despawned immediately (e.g. when a pet was instakilled by a monster). +- Fixed inability to attach items to walls outside the sub in MP. +- The outpost manager is always killable in the Tormsdale report event even if the killing outpost NPCs is disallowed on the server. +- Fixed certain kinds of network messages being sent using an unreliable delivery method (potentially causing occasional issues with file transfers and traitor messages). +- Fixed inability to choose or vote for a sub if you don't have all the content packages required for the sub. +- Fixed clients not seeing the votes of anyone who voted before them on the ready check. +- Fixed dropping off ladders when you open your own health interface in multiplayer. +- Fixed changing character appearance triggering the "wait X seconds until you can rename again" warning. +- Fixed replaced shuttles not getting repaired client-side when you purchase the replacement, making it look like you can't repair them (because they're already repaired server-side). +- Fixed handheld sonar beacon's textbox becoming empty when you enter something in it in multiplayer. +- Fixed "Attempted to create a network event for an item That hasn't been fully initialized yet" console error when spawning a sonar beacon mid-round. +- Fixed characters getting removed at the end of the round if they've died and then been revived with the "revive" console command. + +AI: +- Fixed bots "cleaning up" (or stealing) batteries from portable pumps. +- Fixed bots never cleaning up detached wires. +- Fixed bots sometimes ignoring the leaks right next to doors/hatches. +- Fixed bots cleaning up items that are being eaten by a pet. +- Monsters not ignore provocative items in the inventories of characters they're configured to ignore (with the targeting state "Idle"). Fixes husks attacking characters that are wearing cultist robes with a diving suit. +- Autopilot now avoids the floating ice chunks using the same logic it uses to avoid ice spires. +- Defined AI combat priority for the alien pistol. +- Adjusted the combat priorities of flamer and steam prototype gun. +- Fixed bots sometimes drowning in the ballast because they didn't think they'd need diving gear if the ballast is not full (but still has enough water to drown). +- Fixed bots sometimes preferring to get a new weapon instead of reloading their current one, even if they had easy access to more ammo. +- Fixed bots accepting orders but not doing anything while handcuffed. The bots will now refuse to do things that they need hands when they are handcuffed. +- Fixed bots still sometimes getting stuck on corners around staircases. +- Bots don't attempt to repair or fix leaks in non-friendly subs (e.g. wrecks or ruins). +- Bots don't attempt to clean items in the main sub in outpost levels. +- Fixed bots sometimes just swimming around when they should be able to get back to the sub. +- Fixed orders persisting even if the target no longer exists after a sub switch (e.g. a bot might attempt to operate a turret that doesn't exist, resulting in them doing nothing). +- Fixed "follow" order not always persisting between rounds. +- Bots don't try to use stabilozine to treat deliriumine poisoning. It only slows down the progress of the poisoning, which is kind of pointless in the case of the non-lethal deliriumine poisoning. + +Alien ruins and artifacts: +- The ruins now start smaller and grow bigger gradually, depending on the difficulty level. +- Ruins start to appear a little later in the campaign (in the second biome). +- Initially only "scan ruin" missions are given, "ruin salvage" and "clear ruin" missions don't appear until later. +- Adjusted the loot distribution in the ruins. +- Fixed guardians and defensebot(?) spawning the blood decal when they get dismembered. +- Fixed guardian pod damage sounds sometimes being inaudible. +- Artifact transport cases require batteries to nullify the effects of the artifacts. The batteries last a little over 8 minutes. Also added some animations and lights to the case when powered. +- Made Faraday Artifact's EMP effect a little stronger, and added a discharge coil effect out of water. +- Thermal Artifact now emits steam in water that burns and damages walls. +- Nasonov Artifact now also disrupts the sonar. Added particle effects. +- Psychosis Artifact now generates watcher's gaze periodically, causing psychosis/nausea and strengthening nearby monsters. +- Sky Artifact now drains water on top of draining oxygen, making them a little more tricky to deal with. +- Doubled the price of all artifacts. +- Fixed artifacts never spawning as random loot in ruins. + +Fixes: +- Fixed 2nd end level being impossible to complete if you've already completed the campaign once, because the logbooks didn't respawn on the 2nd loop. +- Fixed inability to equip one-handed items when you're holding a one-handed container that item can go inside (e.g. trying to equip a revolver while holding a storage container would just put it in the container). +- Fixed an exploit that allowed giving your ID card access to places it shouldn't have access to (by placing it in the inventory of e.g. a bot captain and saving and reloading). +- Fixed mollusk and skitter genes giving much less vigor/hyperactivity than intended, making them practically useless. +- Fixed crashing if you change the language when there's scrolling texts (such as "your skills might be insufficient...") visible on the screen. +- Fixed an exploit that allowed using beds/chairs and crouching to trigger a sort of "noclip". +- Fixed particle "z-fighting" (particles flickering in front of each other). Was particularly noticeable with smoke particles. +- Fixed lighting and LOS behaving strangely on very long walls (not extruding far enough to cover the whole screen, allowing you to see through the wall). +- Fixed rifle reload sounds sometimes not playing if you fire in very rapid succession. +- Fixed files listed in file dialogs (such as when choosing a thumbnail for a mod) being in an inconsistent order on Linux. +- Fixed gaps generating strangely on "Shuttle Shell A Glass A". +- Fixed autoturrets being unable to fire inside hulls. +- Fixed “badvibrations3” event (last part of the event chain where you're assigned to salvage a psychosis artifact) never triggering. +- Fixed "sleight of hand" event not giving you the trinket if you choose the 1st dialog option. +- Fixed husk symbiosis getting removed from characters after finishing the campaign. +- Fixed heavy wrench not stunning unskilled users like it should. +- Fixed Jovian radiation no longer causing any noticeable radiation sickness, because it healed faster than the Jovian radiation causes it. +- Fixed chaingun's "winding up" sound not following the sub. +- Only allow putting syringes in autoinjectors (autoinjecting bandages doesn't make much sense, and doesn't work properly). +- Fixed submarines getting stopped by the collider of the acid mist emitted by acid grenades. +- Fixed connection panel layout not working properly on very large resolutions (pins being excessively large and/or going below the borders of the panel's frame). +- Fixed an issue in the "toy hammer" task given by the Jestmaster. The event would never complete, and instead just endlessly increase your reputation when hitting the monster with the hammer. +- Fixed occasional "no suitable return target found" console errors when leaving a location. +- Fixed explosive slugs exploding in the barrel when shot into the void in the sub editor's test mode. +- Fixed attaching items in-game not aligning them with the grid the same way as in the sub editor (offsetting them by half the size of the grid). +- Fixed event trigger icon (the yellow exclamation mark) hiding the conversation icon when an event targets the outpost manager. +- Fixed husks sometimes moving at an unintendedly slow speed on land, making the walking animation look strange (sort of sliding while barely moving their feet). +- Fixed text display's light turning off when copying one in the sub editor. +- Fixed 40mm grenades not exploding in nuclear shells. +- Fixed bringing the cursor over the inventory interrupting using tools and weapons. +- Minerals can't be grabbed before they've been detached with a plasma cutter (it was confusing to be able to grab the item and have the "detaching" progress bar appear, despite it doing nothing). +- Fixed sonar not displaying markers for other subs in the sub editor test mode. +- Fixed fabricator UI not refreshing the skill/time requirements when selecting a linked cabinet instead of the fabricator itself. +- Fixed fabricator not being able to pull materials from the user's inventory if the user selected a linked cabinet instead of the fabricator itself. +- Fixed submarine preview highlighting hulls that have the same name even if they're not linked or near each other. +- Fixed rope pull force originating from the item's origin instead of the barrel. +- Improved how electrical discharge coils determine which walls are outer walls: use the actual position of the structure's body, and check if there's hulls at either side of it. +- Fixed submarine wall "shell a combo 1 1" being incorrectly configured as a horizontal wall. Caused EDC to behave strangely on these walls. +- Fixed monsters sometimes spawning within the player's sight in wrecks (or ruins). +- Fixed corpses carried to the sub from a wreck just disappearing at the end of the round along with the items in their inventory. +- Fixed infinite loop in Character.CanInteractWith if the target item is in a container it's linked to, and has been configured to be displayed side-by-side. For example, if you place a cabinet linked to a fabricator inside the fabricator. +- Fixed incorrect type of airlock module being sometimes used in levels between outposts (e.g. a colony airlock module even though the outpost is a normal one). +- Fixed 40mm acid grenades sometimes appearing to explode in the grenade launcher client-side. +- Fixed nuclear reactor's explosion effects sometimes not being visible client-side. +- Fixed holdable item's sprite origin not getting mirrored on the x-axis. There was a previous attempt at fixing this, but it didn't work correctly: it adjusted the position where the item is held, in a way that made the sprite appear at the correct position. The sprite origin shouldn't affect the position of the item's body though, just where the sprite is drawn relative to the body. The previous fix also didn't take flipping into account, causing the body to be "the wrong way around" when facing left. +- Turn the reactor auto temp on at round end, if the reactor is actively managed by a bot. Fixes reactor sometimes generating too much power at the beginning of the rounds. Only happens later in the game when the bot operating the reactor is skilled enough to manually manage the reactor. +- Fixed thalamus being allowed to load the cheap nuclear shells (talent item) when it loads the railgun. +- Fixed a rounding error making some hairs/attachments in mods impossible to select. +- Fixed some properties of wearable InheritLimbDepth, InheritScale, InheritSourceRect, InheritOrigin being forced to true, and ObscureOtherWearables being forced to None on all wearable sprites except items regardless of what's set in XML. +- Fixed repair tools hitting severed (or hidden) limbs, which sometimes caused the target to not take damage. +- Fixed ancient weapons not being able to cut minerals. +- Fixed "hidden in game" entities + propeller's damage area indicator being visible in images generated with "wikiimage_sub". +- Fixed gaps that aren't linked to anything (e.g. gaps fully inside a hull) counting as hull breaches on the status monitor. +- Fixed contained items in a held item (e.g. flashlight in a rifle, harpoons in a harpoon gun) rotating "choppily". +- Fixed particle "z-fighting" (flickering in front of each other). Was particularly noticeable with alpha-blended particles like smoke. +- Fixed damage from structure damage "shrapnel explosions" being very inconsistent. The explosion didn't ignore obstacles, meaning any structures between the explosion and the character (including the wall the shrapnel comes from) would drastically reduce the damage. This meant the damage was usually very low, but with specific kinds of wall configurations could be enough to instakill a character. +- Fixed characters letting go of the character they're dragging when moving out from or into a sub. +- Changed the formula that converts the rectangular steering vector on the nav terminal to circular. The previous formula caused the "steering arrow" to point at a slightly different direction than where the submarine was actually trying to head to. Most noticeable when controlling turrets using the nav terminal. +- Fixed diving masks reducing movement speed. +- Fixed water in docked shuttles/drones not affecting the buoyancy of the main submarine as much as it should. +- Fixed sub editor sometimes deleting previously selected entities when deleting something using the right-click context menu. +- Fixed monsters sometimes spawning inside the sub after you restore a beacon station. +- Fixed trying to return back from a "deadend location" with no outpost sometimes not working. +- Fixed fractal guardians damaging themselves with their steam cannons. +- Fixed a rare crash caused by an exception in Explosion.RangedStructureDamage. Happened when structure damage triggered an explosion, and said explosion caused another explosion that caused more structure damage. Could happen e.g. when the shrapnel from a breach kills a terminal cell, which explodes and causes more structure damage. +- Fixed auto-operated turrets being able to function without power. +- Fixed it being possible for the last location before the end levels to turn into an outpost if you manage to spread habitation all the way there. +- Changed sonar flora sprite depths to prevent them from being obscured by the edge chunk objects. +- Fixed some headgear (such as separatist captain hats) clipping through PUCS's helmet. +- Fixed lights shining through items characters are holding. +- Fixed ability to clip your turrets through enemy subs' hulls and launch projectiles inside the sub. +- Fixed "heal [H]" hint being visible when focusing on other characters while climbing ladders, and the health interface opening for one frame if you attempt to heal. +- Fixed inability to damage doors with melee weapons from outside the sub. +- Fixed riot shield rotating in a really strange way when swimming (in the wrong direction relative to the character's rotation). +- Fixed Electrical Discharge Coil behaving strangely (drawing huge amounts of power, but never discharging) when there's not enough power and power flowback through EDCs. +- Fixed "show hidden afflictions" button not scaling correctly when switching the resolution. +- Fixed the abandoned outpost you rescue Subra from never turning to a normal outpost. +- Fixed flashlight not being turned off when swapping the item to the belt slot, if there's something else in the slot (like a toolbelt). +- Fixed incorrect draw order of the diving suit's arms (the "shoulder pad" rendered behing the upper arm). +- Fixed "chem withdrawal" and "drunknodebuffs" (variant of drunkenness if you have a talent that nullifies the negative effects) not healing by itself, meaning it was impossible for them to fully heal except by using the medical clinic. +- Fixed captains spawning without tobacco in the pipe (literally unplayable). + +Modding: +- Added "AllowAsBiomeGate" property to location types to make it possible to prevent specific location types from being used as the biome gate locations. Previously this was hard-coded: any location with an outpost was allowed, excluding the vanilla "abandoned" location type. +- The equipment slot icons are now defined in the style xml, making them moddable. +- Fixed crashing when the particle a particle emitter is configured to emit can't be found. +- Fixed bots trying to sit in chairs someone is carrying (not possible in the vanilla game). +- Fixed crashing if a mod contains a wearable that alphaclips other wearables (e.g. diving helmet) and its texture can't be found. +- Fixed linked shuttles getting disconnected from ruins and beacon stations when moving them into place. +- Fixed shuttles attached to ruins, beacon stations and outposts having default crush depth. Now it's forced to at least the depth at the bottom of the level + 1000 m. +- Fabricators can now be made equippable without crashing the game. +- Added "TargetItemComponent" property to statuseffects. Can be used to restrict which components of an item the effect targets. +- Fixed inheriting ragdoll texture not working correctly if you have monster A which is a variant of monster B, and monster B is overridden by a mod (e.g. large crawler when the base crawler is overridden by a mod). +- Fixed StatusEffects that target the parent (= the container an item is inside) not being able to access the properties of the container's components, just the properties of the Item class. +- Fixed crashing if a bot tries to repair with a repair tool that doesn't need any kind of fuel. +- Fixed outpost generator being too eager to use modules meant for a different type of outpost (e.g. abandoned outpost modules in normal outposts) if it can't fit the correct kind of module in the current outpost layout. Now the generator instead tries to change the layout to accommodate for the correct kind of module. +- Fixed MatchOnEmpty and RequireEmpty requiring the whole inventory to be empty even if targeting a specific slot. +- Fixed contained items in contained items being positioned incorrectly when the "middle" container has been flipped from right to left (e.g. railgun shell whose tip is a separate contained item). +- Added IsFlipped property to limbs and characters. +- Conditionals that target limbs can check the character's SpeciesName/SpeciesGroup. +- Always and OnActive effects can be used on limbs. +- Fixed items that are set to display the state of a contained item on the inventory slot (like a gun showing how full the magazine is) always displaying the condition of the contained item, not how full it is. This wasn't a problem in the vanilla game because all vanilla magazines use the condition to simulate the amount of ammo left, but made it impossible to display the state of a magazine that actually contains the bullets as individual items. +- Throwable components can be used in conjunction with Projectile components to create throwable items that can hit and damage characters. +- Fixed bots detaching repairable items from walls when they're trying to repair. Doesn't affect any vanilla content because there's no detachable repairable items. +- Fixed projectiles not sticking to level walls in multiplayer. Does not affect any vanilla content, because there are no projectiles that stick to level walls. +- Fixed ParticleEmitter's DrawOnTop attribute being ignored, causing the DrawOnTop attribute of the particle prefab to always take priority. +- Fixed items deactivating themselves if they have OnContained/OnNotContained effects but nothing else that needs to update (i.e. OnContained/OnNotContained effects not working on items that don't do anything except executing those effects). +- Fixed "packet size exceeded" errors when there's a very large number of items in an inventory (previously only possible in mods, but with the larger stack sizes, also affected the vanilla game). +- Hidden files and directories (ones starting with a dot, e.g. source control folders) aren't uploaded when publishing a mod on the Workshop. +- Fixed penetration defined in RangedWeapon not doing anything. +- Improvements to decorative level object culling. Fixes level objects disappearing from the screen too eagerly when there's lots of objects visible. Rarely occurred in the vanilla game, but was a common problem with mods that significantly increase the amount of level objects. +- Motion sensors set to detect monsters ignore creatures in the "human" group (i.e. you can have friendly non-human characters that are technically monsters, but not have them trigger motion sensors set to only detect monsters). +- Fixed bots ignoring ItemContainer's ContainableRestrictions when reloading ammo (e.g. if you'd set only certain types of ammo to be contained in a loader, bots wouldn't care). +- Fixed only properties that are editable in the editor getting copied to cloned entities in the sub editor. E.g. if you'd edited something like a door's welding state in an item assembly, copypasting the door would make it unwelded. +- New actions for scripted events: CheckVisibilityAction, CountTargetsAction, WaitForItemUsedAction, WaitForItemFabricatedAction, OnRoundEndAction, EventLogAction. +- Made the tutorial objective list non-tutorial-specific and usable in multiplayer, and renamed TutorialSegmentAction as EventObjectiveAction. + +--------------------------------------------------------------------------------------------------------- +v1.0.21.0 +--------------------------------------------------------------------------------------------------------- + +Fixes: +- Fixed LOS effect sometimes "lagging behind" when the sub is moving fast. +- Fixed some minor visual issues (occasional jitter/flickering) on the LOS effect. +- Fixed some issues in the bot AI that we're causing a large performance hit particularly in situations when there's lots of bots in a sub with leaks. +- Fixed bots abandoning their orders (such as operating a turret) if the room is unsafe (e.g. flooded). +- Fixed an issue in character syncing that occasionally caused disconnects with the error message "Exception thrown while reading segment EntityPosition, tried to read too much data from segment". +- Fixed wires set to be hidden in-game (e.g. invisible circuits built outside the sub) being visible on the Electrician's Goggles. +- Fixed an issue with level resources that caused crashes with certain mods (e.g. ones that include subs with piezo crystals). +- Fixed NPCs waiting on some outpost modules never reaching their targets, causing peculiar behavior. +- Fixed waypoints sometimes not getting connected between outpost modules if there's a very short hallway between them. Addresses some cities missing connections between waypoints, causing AI to be unable to navigate through the modules. +- Fixed some UI layout issues (most noticeably, ultra-wide crew list) on certain resolutions like 3440x1440. +- Fixed campaign saves occasionally failing to load with the error "an item with the same key has already been added". Seemed to only occur when using certain mods. +- Fixed crashing when you e.g. use a pet from some mod in the campaign, disable the mod and reload the save. +- Waypoint adjustments to most submarines, outposts, wrecks, and beacons. Especially on ladders. Should take care of the remaining AI issues on ladders (the old subs in the saves don't get updated, but the fixes apply to new subs that you don't yet own. And ofc all the subs in a new game!) + +--------------------------------------------------------------------------------------------------------- +v1.0.20.1 +--------------------------------------------------------------------------------------------------------- + +Fixes: +- Fixed hidden structures not colliding anymore. +- Wiring debugger: Fixed tooltip rendering under the outer frame of the connection panel. +- Wiring debugger: Fixed the glow sprite on connections having an inconsistent size in different resolutions. +- Fixed jailbreak_sootman event getting stuck at the 1st SpawnAction, preventing most of the event from working at all. + +--------------------------------------------------------------------------------------------------------- +v1.0.20.0 +--------------------------------------------------------------------------------------------------------- + +Optimization: +- Major optimizations to situations where there's lots of items in the submarine (especially water-reactant items and minerals). +- Significantly reduced loading times when loading subs with lots of items in cabinets. +- Partially multithreaded lighting: FindRaycastHits (the heaviest individual part of the lighting algorithm) is now handled in a separate thread. + +Line of sight rework: +- Improved the LOS effect to get rid of weird, jagged geometry in spots with intersecting walls. +- Improved the wall damage effect to make leaks easier to see. +- Added a command called "debugdrawlos" which visualizes the LOS geometry, making it easier to adjust the walls if you want to tweak the LOS in the sub editor. +- Note that some submarines may require small manual adjustments to get the LOS to work perfectly with the new algorithm (especially if the sub includes “unnecessary” structures that were used to work around issues in the previous algorithm). You can also disable the “cast shadows” setting on a wall to make it see-through. + +Changes: +- Added "electrician's goggles", an item that visualizes power and signals on wires. It also makes connections on the connection panel flash when they're sending/receiving something, and allows you to see what exactly is going through (amount of power, signal values) by hovering the cursor over the connection. +- Added "debugwiring" console command which enables the same visualization as the electrician's goggles. +- Oxygenite tanks can be recycled. +- Shutting down the reactor doesn't automatically turn off automatic control. +- Allow monsters to damage flares and glowsticks. +- Jacov Subra needs to be escorted to the next location after he's rescued (it was weird to have him just disappear after the mission). +- Taking items from trash cans is no longer considered stealing. +- Sulphurite shards explode when thrown (causes an acid cloud that inflicts mild burns). +- Adjusted music intensity ranges: now the "intensity tracks" kick in later (i.e. they require a higher-intensity situation) meaning the "actual songs" play a little more often. +- Upgrades that require materials can be purchased with materials from the sub instead of having to carry the materials on you. +- Made clown and husk events and missions more common. +- Added category buttons to the fabricator interface to make it easier to find items. +- Changed fabricator's "skills required" texts to make it clearer insufficient skills don't prevent you from fabricating the items. +- Hospital beds heal injuries faster than normal beds. + +Fixes: +- Fixed "hash mismatch" errors when publishing an update to a mod after you've given it a different name in the Steam Workshop in the language your Steam UI is set to. +- Fixed publishing an update to a mod always overriding the English description, instead of the language your Steam UI is set to. +- Fixed nav terminal's sonar control panel disappearing when switching resolution or display mode if the terminal has a mineral scanner. +- Fixed secure steel cabinet in abandoned outposts being openable with a randomly selected bandit's ID card, not the bandit leader's card as intended. +- Workaround to Sootman potentially getting stuck in the jailbreak mission if it can't find a way to the sub (e.g. due to broken waypoints in a custom sub or outpost module): if he can't find a way to the sub in 2 minutes, he'll start following the player instead. +- Fixed some z-fighting issues in various outpost modules. +- Fixed flak cannon shells exploding in loaders if there's a monster near the loader. +- Fixed oxygenite tanks not being set to 0 condition when they explode in a welding tool or flamer. +- Fixed/changed welding a door shut not protecting the door from damage. Modding: Added a new tag "weldable" to define targets that can be welded. +- Fixed flamer damaging duct blocks, unlike intended. +- Fixed Harpoons only reeling in when facing the target. +- Fixed wires that aren't connected to anything not getting copied (with Ctrl+Z or by dragging and dropping with Ctrl) in the sub editor. +- Fixed Hognose event being possible to get multiple times, potentially allowing you to hire multiple Captain Hognoses. +- Fixed lights ignoring constant set_color signals after the color is changed manually. +- Fixed both biome gate locations sometimes belonging to the same faction (and in general, random locations getting changed into Coalition outposts across the map). +- Fixed server log stopping to update after there's 800 messages in it. +- Fixed missions that take place in a location further away on the map sometimes not unlocking when there was no suitable location available. +- Fixed 3rd part of the Honkmotherian Scriptures not being available anywhere. +- Fixed tutorials reappearing after finishing the campaign. +- Fixed progressive stun's visual effect and speed multiplier abruptly resetting when passing affliction strength 9. +- Fixed certain special symbols (the BlockElements unicode range) not showing up on text displays. +- Fixed characters with husk symbiosis transforming to an AI-controlled husk when the host dies. +- Fixed rewards not being shown in the round summary unless the mission was completed successfully (i.e. you couldn't see what the reward is when you start the mission). +- Fixed advanced gene splicer deconstruction output. +- Fixed weird behavior when selecting a periscope a bot is controlling (UI disappearing as if you were operating the turret). +- Fixed waypoint visibility checkbox not being selected when you generate waypoints in the sub editor, even though generating the waypoints toggles their visibility on. +- Fixed water moving erratically in rooms with lots of connected hulls (with weird spikes and water level jumping up and down). +- Fixes anaparalyzant not reducing paralysis. +- Fixed some Chinese characters not displaying correctly when the language is set to something else than Chinese. +- Adjusted fire particles to make them clip through walls less. +- Fixed characters not falling through holes appearing in the floor below them until they move. +- Fixed characters twisting to a weird pose if you grab them while they're lying in bed. +- Miscellaneous tutorial fixes: don't allow the player to access the areas of the other jobs in the roles tutorial, fixed getting stuck if you enter the rightmost room (where the role tutorials start) as an assistant, fixed bots sometimes wandering outside the initial room. +- Fixed a rare crash caused by a null reference exception in Rope.Update. +- Fixed characters being allowed to aim with weapons in single player when incapacitated/ragdolled. They couldn't actually move the aim position, but the crosshairs appeared and harpoon ropes could be kept from snapping, even though they're set to snap when not aiming. +- Fixes to some of the UI layout issues on ultrawide resolutions. The UI is still not optimal on ultrawide resolutions, but the most severe issues (such as the non-functional crew list) should be fixed now. +- Fixed negative treatment suitability definitions not working correctly, which has had some effect on the bots’ decisions and the suitable treatment listing on the health interface. +- Fixed the min and max strength thresholds of periodic effects not working. Of the vanilla afflictions, affects paralysis, sufforine poisoning, and morbusine poisoning, causing them to trigger stun effects earlier than intended. +- Fixed hanging end of the wire sometimes being "at the wrong end" of the wire after copying entities or saving/reloading. +- Added an option to disable the "remote content" (update notifications, changelogs) in the main menu by adding RemoteContentUrl="" to the player config file. We're suspecting the freezes some players are experiencing when they open the main menu are related to the content in the main menu being fetched from our server, and testing if disabling it makes the issue go away would give us more clues for diagnosing the issue. + +Talents: +- Fixed "Medical Expertise" not increasing bandage effectiveness. +- Fixed "Mudraptor Wrestler" not affecting unarmored or veteran Mudraptors. +- Fixed monsters not properly ignoring characters with the "Non-Threatening" talent. +- Fixed Moloch, Black Moloch, Crawler Broodmother and Giant Spineling not having enough inventory space for extra loot given by "Bloody Business" and "Gene Harvester" talents. +- Fixed "Rifleman" talent damage bonus not applying to Assault Rifles. + +Multiplayer fixes: +- Increased the default packet limits. It seems the previous defaults were so low it was possible to get kicked due to "sending too many network messages" in some situations even if you weren't actually trying to spam the server using a modified version of the game. +- Fixed rate limiter kicking in too eagerly when the server is configured to use a higher-than normal tickrate. +- Fixed an exploit that allowed getting new subs for free. +- Fixed submarine store displaying the client's subs instead of the server's. +- Fixed Hangul (Korean symbols) not being included in the default allowed client name characters. +- Fixed headset/radio channel resetting between multiplayer rounds. +- Fixed clients hearing radio static when someone talks in a different channel near them. +- Fixed tainted genetic materials in someone's inventory appearing to become untainted when a new round starts. +- Fixed local voice chat icon switching to radio icon (from yellow to gray) at the end of conversations when you release the push-to-talk key. +- Fixed server description getting cut off after 22 lines. +- Fixed changing the name of a dedicated server using the textbox in the server lobby not changing it in the server list. +- Fixed clients not getting positional info for remotely controlled turrets if the character controlling them is far away (> 250 m), meaning you wouldn't see a turret move if you're watching some e.g. operate a remotely controlled turret on a drone. +- Fixed mission minerals spawning with an incorrect rotation (always facing up) in multiplayer. +- Fixed inability to unlock some achievements (such as "Nuclear blast survivor") in multiplayer. +- Fixed cursor positions sometimes "desyncing" when the cursor is very far from the character (e.g. when operating a far-away drone). +- Fixed characters sometimes getting stuck on the wrong side of a door client-side, and not getting corrected until the client moves in the opposite direction or opens the door. + +Bot and AI fixes: +- Improved how the bots navigate on ladders. +- Fixed bots sometimes not being able to release the ladders when there's two ladders close to each other. +- ClownDistrict_Colony_01: Fix a ladder waypoint not being linked to the ladder, causing bots to get stuck. +- Adjusted the waypoint generation logic on ladders. Fixes bots sometimes not being able to open the hatches, because they couldn't get close enough to the waypoints just below/above them. +- Improvements to medic bot AI: they should now be better at determining which injuries are minor enough to ignore, making them waste less medicine. +- Fixed outpost NPCs who should stay in a specific room (e.g. outpost manager) never returning to the room if they leave it e.g. due to a fire, flood or someone attacking them. +- Fixed bots picking up non-pickable items (items that have CanBePicked disabled in the Pickable component settings). +- Fixed bots saying "Cannot reach [name]!", when they can't reach a wait target. +- Fixed bots removing diving suits when they shouldn't, if they are ordered to wait using the contextual wait order. Should behave the same as when told to wait without using the contextual order. +- Fixed bots having issues with doors that are both broken and welded (which is another bug that shouldn’t happen anymore). +- Fixed NPCs running towards doors if they somehow get on another sub, because they didn't detect the access restrictions correctly. +- Set Remora's and Kastrull's drones, outpost jail rooms and (automatically generated) hulls in docking ports as AvoidStaying zones, which makes the bots to try not to idle there. +- Waypoint fixes to Typhon, R-29, and Camel. +- Fixed bots never leaving the drones (or other connected subs) and returning back to the main submarine in the idle state (i.e. without giving them an order or reacting to an emergency situation etc.) +- Addressed bots and NPCs sometimes twitching between two waypoints after reaching their target position. +- Fixed bots not always being able to open the doors in beacons or wrecks while attempting to return back to the main sub. +- Fixed the start and the end node of the vertical hallways in the outposts being incorrectly linked, causing some pathing issues for the bots. +- Fixed bots operating turrets shooting at handcuffed enemies. +- Fixed defense bots attacking husk containers. +- Fixed monsters never ignoring targets that they fail to damage. They should leave those be after a while (depending on the initial priority). +- Fixed pets becoming hostile to all humans (except the owner) when attacked by a hostile human (a bandit in an abandoned outpost for example). +- Potential fix for (hard to repro) issues where a bot runs towards a door without being able to open it, because they happen to skip the nodes past the door when it closes. +- Fixed NPCs and bots sometimes not being able to open the hatch, because they couldn't get close enough to skip the last node before the node connected to the hatch. +- Fixed incorrect linking of the start and the end waypoints in the vertical hallway modules. Caused the bots to open the hatches too early. + +Modding: +- Fixed "hair with hat sprite" (the short hair the characters switch to when wearing a hat) being visible even if the whole head should be hidden by another wearable. Not noticeable in the vanilla game, but can affect some mods. +- Fixed crashing when trying to create a character that doesn't have any health parameters. +- Fixed submarine spawning docked to a random docking port of the outpost even if one of them is marked as a main docking port. Doesn't affect vanilla content, since there's only ever one docking port per outpost. +- Fixed round not ending when you dock with an outpost if the outpost module contains any linked subs (lifts, drones, etc). +- Fixed items with absurd amounts of health (more than 38 digits) causing the item to have infinite health, which would lead to various issues and crashes. Now an item's health can't be set above a million. If you want to have an item whose condition never goes down, use the property "Indestructible" instead. +- Autoinjecting can be enabled on specific subcontainers (as opposed to having to make the item autoinject anything inside it). +- Fixed bots being unable to use diving gear that goes in the InnerClothes slot. Doesn't affect any vanilla content, because all diving gear goes in the OuterClothes slot. +- Items' FireProof and WaterProof properties can be changed using status effects. +- Fixed monsters' SimplePhysicsEnabled staying enabled when a client takes control of it. + +--------------------------------------------------------------------------------------------------------- +v1.0.13.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed "hash mismatch" errors when trying to enable a mod that's been updated in the most recent patch. +- Fixed "the submarine contains entities with duplicate IDs" error message when loading a submarine that contains multiple shuttles/drones. + +--------------------------------------------------------------------------------------------------------- +v1.0.13.1 +--------------------------------------------------------------------------------------------------------- + +- Updated localizations. +- Fixes to Japanese and Russian translations. +- Fixed Azimuth not going up in Silent Running mode. + +--------------------------------------------------------------------------------------------------------- +v1.0.13.0 +--------------------------------------------------------------------------------------------------------- + +Misc changes and improvements: +- NPCs who offer services don't get turned hostile regardless of your reputation. If you've got money, they'll be happy to serve! +- Attacking outpost NPCs can't decrease your reputation by more than 20 points per round. Works as a safeguard against enormous reputation losses e.g. in the case of a trigger-happy griefer or a nuclear mishap. +- Destroying outpost walls can't decrease your reputation by more than 10 points per round. +- Outpost NPCs don't allow players to grab them for longer than 10 seconds to prevent being able to drag them around the outpost. +- Minor visual improvements to biomes: biome-specific outpost levels (instead of all outpost levels looking like Cold Caverns), more level objects in Hydrothermal Wastes and the Great Sea. +- Spawn abyss and combat suits in enemy subs and wrecks instead of normal ones in later biomes. +- Fixed minerals still sometimes spawning on the wrong side of cave walls (when the other side of the wall is outside the boundaries of the level). +- Fixed pressure stabilizer only affecting the player for 100 seconds, instead of the intended 1000 seconds (16 mins). +- Fixed clients not getting assigned the "None" permission preset when using a language other than English (meaning it wasn't possible to customize what permissions clients have by default). +- Fixed enabling cheats not actually disabling Steam achievements for the rest of the campaign (it was possible to re-enable unlocking achievements by saving and reloading). +- Fixed Tormsdale mission not completing unless you bring the item to the sub. Now retrieving the item counts as "bringing it to the sub" in friendly outposts. +- Optimized/simplified exosuit and FB3000 status effects. +- Made huskified humans' items move to a duffel bag on death. +- Increased the priority of turret lights to prevent them from getting hidden when using a low light limit. +- Reduced the minimum mass required for a character to be visible with thermal goggles, always show at least the main limb regardless of the mass. Fixes thresher hatchlings being invisible to the goggles. +- Alien power cells can be deconstructed. + +Bots: +- Fixed bots targeting crawler eggs when they are inside an inventory (also in the Broodmother's inventory). +- Fixed bots being allowed to shoot items from very long distances. +- Fixed bots wasting ammunition on crawler eggs that are not dangerously close to the sub. +- Fixed bots using an unintentionally long delay before shooting. +- Fixed bots targeting (but not shooting) enemies inside abandoned outposts. +- Adjusted the delays and the targeting ranges. Remove the "grace" distance modifier. Improves the bots' general usage of turrets. +- Fixed "fight intruders" order causing bots to attack enemies in abandoned outposts again. +- Bots are allowed to use meds from an unconscious patient's inventory. +- Fixed bots falling off the ledge in DockingModule_02_Colony (again). +- Fixed bots not prioritizing the leaks as they should when multiple bots are fixing leaks simultaneously. +- Fixed bots not preferring the items that lie on the ground. +- Fixed bots often not being able to reach small items like battery cells or rifle rounds that lie on the ground. +- Fixed bots sometimes holding the flashlight in their mouth. +- Fixed bots acting weird when picking up items and having their inventory full. +- Fixed bots not being able to find an alternative container for the items they are cleaning up, when the path to the preferred container is blocked. Didn't affect bots getting a specific item, like a diving suit when they need it. +- Bots are no longer allowed to wear the items (other than in hands) when they are cleaning them up. +- Improved bots' abilities to find items. They should be much quicker at it than previously. +- Possibly fixed bots sometimes ignoring targets that they shouldn't ignore. +- Fixed bots not being able to change the oxygen tanks when they are in a safe room with no enemies. +- Fixed bots using both diving mask and the suit simultaneously. +- Fixed bots holding to old paths that shouldn't be valid anymore (= not complying when you order them to follow outside of the submarine). +- Fixed bots not being able to use pathing when the player has just controlled them, leaving them in a ruin, wreck, or a beacon. Only happened when the bot hadn't been AI controlled before during the round. +- Fixed bots using the waypoints not linked to any sub when they should use the waypoints linked to a sub and vice versa. +- Fixed bots trying to use the gaps when they could just use a path to get to the target. +- Fixed missing links between doors and waypoints in Alien_Entrance3. +- Fixed bots sometimes not being able to release from the ladders when they were trying to exit a wreck or beacon to get back to their own submarine. +- Fixed bots sometimes still idling on ladders, which they shouldn't do (There are some unaddressed cases where it might seem like they'd do this, but actually don't. They just can't reach the buttons linked to the door.) +- Fixed bots sometimes failing to climb up the ladder all the way up and falling down just before reaching next floor. Happened only in the idle state. +- Fixed bots sometimes getting stuck on the long ladder in EngineeringModule_02_Colony. +- Fixed waypoints on ladders leading to a hatch on many subs (using old waypoints), which caused the bots to fail to reach the hatch while trying to fix it. +- Fixed bots not being able to operate properly in high pressure levels when they don't have a suit that protects from the pressure (e.g. a regular diving suit later in the campaign). +- Bots now prioritize suits that give a better pressure protection (there's a separate attribute for it in the item definition: called "botpriority", which can and should be taken into account with the modified items). +- Fixed bots not healing theirselves while swimming outside of the submarine (they only do that when the wounds are relatively severe). +- Fixed bots treating theirselves when there's a medic onboard, which is currently unable to treat them (if the medic is able to treat the bot, they should not try to heal theirselves). +- Fixed bots ignoring targets that are currently fixing leaks (which was intentional, but seems to have been a bad decision). +- Added new dialogue for the bots about the lethal pressure levels and insufficient protection for it. +- Fixed some minor buts regarding the dialogue. +- Fixed bots not being able to use harpoon coil rifles properly. +- Fixed bots accepting random items as weapons when they can't find any weapon. Note that many tools, like welding tools and wrenches, can intentionally be used as weapons. +- Fixed prepare for expedition order and another order, like clean items, possibly resulting in looping behavior where the bot can't decide which one to follow. +- Adjustments to how the bots prioritize combat targets under fight intruders objective. +- Fixed bots not reacting when they are non-intentionally damaged by friendly NPCs (e.g. security smashing a player character). + +Multiplayer fixes: +- Changes to make starting a round more robust: fixes various equality check errors ("submarine/mission doesn't match") if starting a multiplayer round takes a long time. +- Fixed dedicated servers' content package info getting truncated to 255 bytes, causing the content package list to just display "unknown" if the server has lots of mods enabled. +- Fixed "input contains duplicate packages" error when trying to join a server that has certain types of mods enabled (more specifically, mods that only contain client-side content, identical content or files of the type "Other", which could result in the MD5 hashes of the mods to be identical). +- Fixed projectile spread not being as random as it should be in multiplayer (successive hitscan rounds usually launched in the same direction). +- Fixed spectators not hearing others if their character is dead before the character despawns. +- Campaign rounds aren't forced to end if there's only one client on the server using freecam. +- Fixed crashing when a traitor missions starts when the host isn't controlling a character. +- Fixed sonar beacon tickbox sometimes flickering on and off in multiplayer. +- Fixed clients not seeing wall damage in outposts if the server has made outpost walls damageable, and the client doesn't have permissions to manage server settings. +- Fixed arc emitter briefly stunning the user client-side. +- Unconscious players can't end the round. + +Countermeasures against multiplayer exploits: +- Fixed an exploit that allowed you to equip 2-handed weapons in only one hand. +- Added protection against deliberately lagging the server. + - Added an option to enable "DoS Protection" in the server settings under "Anti-Griefing". + - Enabled by default. + - When enabled, the server will automatically kick players who are causing the server to perform poorly. + - Added a new "Max Packet Auto-Kick" in the server settings under "Anti-Griefing". + - Enabled and set to 3000 by default. + - Can be disabled by setting the limit to 1200 or below. + - When enabled, the server will automatically kick players who are sending a certain amount of network packets in a minute. +- Added "Spam Immunity" server permission. + - Gives immunity to getting kicked from DoS protection, chat spam and from sending too many packets. +- Added a rate limit to console commands in multiplayer. +- Added a rate limit to creating new characters in multiplayer. + +Balance: +- Buffed Harpoon Coil Rifle a bit (shorter charge time). +- Reduced Focused Flak Shell penetration slightly. + +Talents: +- Engine Engineer, Helmsman and Affiliation talents no longer stack (allowed gaining insane engine speed boosts and bonuses by having large numbers of crew with the same talent). +- Fixed makeshift shelves no longer being placeable in pre-1.0 saves. +- Fixed some incorrect talent icons. +- Fixed Networking talent only giving a discount for faction-specific items. +- Fixed Machine Maniac requiring 5 repaired items instead 3 like the description says. +- Gene harvester doesn't spawn genetic materials on pets. +- Dying due to a disconnect doesn't trigger talents (like "Revenge Squad") or get recorded as a kill. + +Submarines: +- Reworked Typhon (kudos to uberpendragon): replaced legacy items and structures, got rid of double walls, layout adjustments, visual improvements, improvements to the power grid and many smaller changes. +- Fixed waypoint in Herja's airlock not being linked to the door. +- Fixed fabricators not being linked to the cabinet next to them in Azimuth, Berilia, Kastrull, Orca2, Typhon, Typhon2, Winterhalter. +- Fixed some unhulled spaces inside Kastrull, Azimuth and Berilia. +- Fixed improperly wired smoke detectors in Typhon 2. +- Replaced the wall between gunnery and engineering (that every sane person cuts a hole in) with a door in Kastrull. +- Fixed medic not being given proper ID card tags in R-29, preventing them from accessing the toxin cabinet. +- Fixed Venture's exterior airlock door being repairable with a welding tool instead of a wrench. +- Fixed water detector in Dugong's oxygen generator room not being connected to the flood alarm circuit. +- Added "Silent Running" to Azimuth, as well as 1 diving suit and exterior cameras to make it more worthy of tier 2 (despite a lack of guns) + +Fixes: +- Fixed all shadow-casting lights going through the outpost walls when docked to one. +- Oxygen generator sprite and animation fixes. +- Fixed escorted characters being hostile to you if they belong to a hostile faction. +- Safeguard against getting pinned under flooded enemy subs. The sub can now be pushed off as long as the enemies inside it are dead/incapacitated. +- Fixed enemy subs not affecting monster spawns (meaning monsters could spawn very close to enemy subs, and fighting an enemy sub didn't decrease the probability of monster spawns as it should've). +- Fixed submarines sometimes getting stuck when trying to squeeze through a tight passage in the level. +- Fixed pets being considered hostile in hostile outposts (causing AI crew to report them as intruders). +- Fixed monsters sometimes spawning inside walls during nest missions. +- Fixed paths between biomes sometimes being unlocked from the start on certain map seeds. +- Fixed launching an alien turret (or any modded turret that spawns it's own ammo inside itself) causing a crash. +- Fixed crashing when you exit Steam while the Workshop menu is open. +- Fixed some of the fonts not working properly in Japanese (but using roughly similar Chinese symbols instead). +- Fixed campaign's end boss moving away from you if you attack it with melee weapons. +- Fixed enemy crews not being able to switch between turrets and being very reluctant to operate multiple turrets at the same time. +- Fixed reputation reward text sometimes overflowing in the round summary (e.g. when the mission modifies both the husk cult and clown rep). +- Fixed characters holding and eating bananas weirdly. +- Fixed all friendly characters using the "hostage" dialog and all hostile characters the "bandit" dialog in abandoned outposts. +- Fixed characters sometimes becoming briefly immobilized (as if stunned) when the surface of the water rises up to the character's chest. +- Fixed cultist hood overlapping with the exosuit. +- Fixed exosuit and FB3000 not being tagged as "provocative" (meaning enemies didn't care about the sounds they make or the lights on them). +- Adjusted FB3000 fabrication recipe (the previous required so many materials they don't fit in the fabricator's input slots). +- Fixed PUCS not having an AI target unlike all other diving suits. +- Fixed sonar monitor's "sonar circle" overlapping with the control panel on some resolutions / HUD scales. +- Fixed occasional invisible barriers around alien ruins. +- Fixed protein bars only healing 1/60 of the intended amount. +- Fixed "Engineers_are_special" event no longer appearing. +- Fixed characters sometimes being able pass through level walls by swimming down through the broken floor of a wreck. +- Fixed "acquire a wrench" popup appearing multiple times in the mechanic tutorial. +- Fixed black squares on docking ports and hatches. +- Fixed crashing when trying to increment the version number of a mod whose version number consists of only numbers (i.e. no periods) or is empty. +- Fixed hireable cultists and clowns being the wrong way around (i.e. high clown rep allowed you to hire cultists and vice versa). +- Fixed wikiimage_sub and wikiimage_character crashing the game if the file is being used by another process. +- Fixed wikiimage_sub not sorting the entities the same way as the sub editor and game screen. +- Fixed status monitor displaying very small amounts of water in linked hulls as 1%. +- Faction reputation is reset after finishing the campaign. +- Fixed colony docking modules spawning with a bit of water in them. +- Fixed minerals sometimes spawning in normal caves in abyss mining missions. Happened if no abyss islands with caves happened to generate - now we always generate a cave in at least one of the islands. +- Fixed lights on the items the character is wearing being visible when inside a clown crate. +- Fixed mudraptor eggs (or other items set to be damaged by repair tools) not being damaged by flamers. +- Fixed handheld sonars not working in the end levels. +- Fixed rebinding the Use key not working in the sub editor. +- Fixed Ctrl+A not selecting connected wires in the sub editor. +- Fixed ability to climb ladders while lying in bed. +- Fabricator input slot tooltips don't show duplicate item names when the item can be crafted from multiple different items with the same name (e.g. petraptor egg can be crafted from 3 different egg items, all called "mudraptor egg"). +- Fixed attacking others with the husk appendage not healing the user. +- Fixed pet name tag getting stuck mid-air when equipped. +- Fixed next round's missions not being displayed in the round summary when leaving a location that has missions (e.g. outpost with a jailbreak mission). +- Fixed inability to hire Jacov Subra if you miss/ignore the event the first time you get it. +- Outpost generator only takes walls with a collider into account when determining the bounds of the modules. Fixes husk modules being placed unnecessarily far from the outpost due to the decorative structures outside the door, leaving a very short hallway between the modules. +- Fixed characters sometimes dying from barotrauma despite the pressure icon not being visible. Happened when the pressure was just above the lethal threshold, but not as high as outside the sub. +- Fixed character interact texts (like "[H] Heal") not changing when you change the language. +- Fixed treatment suggestion for husk infection being shown when wearing zealot robes. +- Fixed inability to fabricate high-quality nuclear depth charges. +- Fixed exosuits getting autofilled with batteries. +- Fixed exosuits' lights not turning off when the wearer dies. +- Fixed 0% grenades (stun grenade and fixfoam) detonating if a player has one in their inventory when a mission starts. +- Fixed pre-unlocked talents not being visible client-side on the special faction NPCs hired during the round. +- Fixed escort and cargo missions sometimes leading to an abandoned outpost even if there's an inhabited one available. +- Fixed characters (ragdolls) sometimes getting stuck to the corners near platforms. + +Modding: +- Fixed thalamus items fading from the prefab color to a darker tint, disregarding the actual sprite color of the item. +- Fixed LevelTrigger statuseffects not doing anything when triggered by a submarine. +- Added a scrollbar to the campaign setup's crew tab to make it work properly when there's more than 3 initial crew members. +- Support for using OnWearing in Containable StatusEffects. +- Fixed ability to "relaunch" a projectile that has already been launched or that's stuck to some target using status effects, which lead to various strange results. +- Fixed ItemContainer StatusEffects working in a different way than other effects, applying the effect separately to each target. Prevents e.g. having an effect that does something to an item if a condition is met on the character wearing it. + +--------------------------------------------------------------------------------------------------------- +v1.0.9.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing when you move from one textbox to another using tab and go past the last available textbox. +- Fixed inability to enter the final levels on some subs that include shuttles/drones. +- Fixed autoinjectors (PUCS, autoinjector headset) wasting the syringe without any effects on the character. +- Fixed bots failing to operate turrets in Typhon 1 due to them being partially inside the ceiling. +- Fixed lights going through walls in outposts. +- Fixed language selection prompt not showing up when launching the game for the first time. +- Fixed bots doing objectives during the roles tutorial, e.g. repairing the leaks for you. + +--------------------------------------------------------------------------------------------------------- +v1.0.8.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed loading screens sometimes getting stuck when playing in Chinese, Japanese or Korean. +- Fixed certain mods that override outpost generation parameters causing crashes due to missing outpost NPC prefabs. +- Fixed outpost NPCs never attacking you (just aiming their guns at you) if you attack them, but your reputation is not low enough to turn the outpost hostile. +- Fixed broken dialog line in the waytoascension1 event. +- Fixed healing your crewmates causing your karma to decrease. + +--------------------------------------------------------------------------------------------------------- +v1.0.7.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed mechanic tutorial getting stuck at the point where you need to weld a leak. +- Fixed treatment suggestions not showing up in the naloxone part of the medic tutorial. +- Fixed patient spawning dead in the CPR part of the medic tutorial. +- Fixed bots being unable to move through Herja's airlock due to an unlinked waypoint. +- Fixed tutorial Dugong spawning with empty ammo boxes. + +--------------------------------------------------------------------------------------------------------- +v1.0.6.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed some new Steam achievements not unlocking. + +--------------------------------------------------------------------------------------------------------- +v1.0.5.0 +--------------------------------------------------------------------------------------------------------- + +- Fixes to Japanese translations. +- Implemented support for some upcoming Steam achievements. +- Improved backwards compatibility: fixed outpost managers no longer spawning in mods that override outpost generation parameters due to the generic non-faction-specific outpost manager prefab being removed. + +--------------------------------------------------------------------------------------------------------- +v1.0.4.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed outpost NPCs getting randomized every time you re-enter an outpost. +- Fixed inability to gain more than 15 talent points in the multiplayer campaign. + +--------------------------------------------------------------------------------------------------------- +v1.0.3.0 +--------------------------------------------------------------------------------------------------------- + +- Adjusted plant spawn rates in caves. +- Made lead more common in stores. +- Fixed mission listing shown on the top of the screen spoiling enemy faction ambushes. +- Fixed enemy faction ambushes being possible everywhere on the map (they should only happen within 3 steps of outposts belonging to an enemy faction). +- Fixes bots sometimes running towards doors that are closed by something else (another person or an automatic logic). +- Fixes bots ordered to wait outside of the submarine not being able to switch their oxygen tanks. +- Added a couple of endgame-foreshadowing lore bits. + +--------------------------------------------------------------------------------------------------------- +v1.0.2.0 +--------------------------------------------------------------------------------------------------------- + +- Exosuits are powered by fuel rods instead of batteries. +- Fixed affliction probabilities being evaluated twice, meaning that e.g. 50% probability of getting some affliction from an attack was actually a 25% probability. +- Fixed item highlights from the previous round remaining visible the next round. +- Fixed swapping items in a container sometimes causing too many items to be visible in it. +- Fix the vitality modifiers on husk not working properly, because health indices on the limbs were not defined. Effectively husks always took 2x damage. +- Fixed characters still spawning inside outposts that have turned hostile due to low reputation. +- Fixed all special faction hire events getting stuck if you say you need to "think about it", return, and say you still need to think about it. +- Fixed missing "place in ceiling" text in beacon station save dialog. +- Fixed basic depth charges being cheaper than intended (only 30 mk). +- Fixed inability to make lights blink at a high frequency by rapidly turning them on and off with e.g. oscillators. +- Fixed ranged weapons emitting particles in the wrong direction. There haven't been any changes to this code in years, so it must've been an issue for a long time, I guess we just never noticed because no gun before the scrap cannon emitted particles with a noticeable velocity? +- Fixed a pathfinding issue that often made bots swim against cave walls. +- Fixed inability to join servers with a submarine switch/purchase vote running. +- Fixed votes passing if the client who initiated them disconnects before anyone else votes. +- Fixed follow orders not being persistent between singleplayer rounds. + +--------------------------------------------------------------------------------------------------------- +v1.0.1.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed Mailman talent giving you the 150 mk bonus every time you open the campaign map or mission menu and there's a cargo mission visible. +- Fixed missions available from the destination location to some other location being listed as "outpost missions" in the campaign map's mission selection. +- Fixed outposts that faction missions take place in being allowed to turn into abandoned outposts when next to hunting grounds, making the missions impossible to complete. +- Fixed hidden items (e.g. Separatist deco that's disabled in Coalition outposts) sometimes getting chosen as targets for scripted events, resulting in non-interactable, glowing "ghost items". +- Fixed mysterious floating status monitor in AdminModule_02_Colony. +- Miscellaneous optimizations. +- Fixed Separatist jailbreak mission causing a crash. +- Fixed ranged weapons (most noticeably, scrap cannon) emitting particles in the wrong direction. +- Fixed acid burns not having a cause of death text. +- Fixed "skedaddle" not giving a 10% movement boost like the description says. +- Fixed odd fabrication list sorting: the items that require a recipe to fabricate were split into ones you have the skills to fabricate and ones you don't, even though that isn't visible in the UI, making the list just seem out of order. +- Fixed red glow around the light switch's green button. +- Fixed banana being held weirdly. +- Fixed inability to hold a captain's pipe or cigar in your left hand. +- Fixed ready checks not working. + +--------------------------------------------------------------------------------------------------------- +v1.0.0.0 +--------------------------------------------------------------------------------------------------------- + +Faction overhaul: +- Outposts are controlled by the Europa Coalition or Jovian Separatists, and some of them include a module belonging to the Church of Husk or Children of the Honkmother. +- Got rid of location-specific reputation. Now all the events/missions give faction reputation instead (excluding missions that aren't related to or given by a faction, e.g. abandoned outpost missions). +- Lots of new outpost events, and a longer "event chain" for the secondary factions. +- Lots of new faction-specific missions: some variants of existing missions, some new. +- Faction-specific hires: "generic" high-level characters with more experience points and better gear than normal hireable NPCs. Available for hiring when Coalition or Separatist reputation is high enough. +- Special, named characters who can be hired via scripted events after reaching a high enough reputation. +- Faction-specific vendors (separatists, husks, clowns) who sell special items (many of which are completely new) if your reputation is high enough. +- If your Coalition/Separatist reputation is low enough, you may get attacked by their vessel during missions. +- There's now always two paths from biome to another, one controlled by the Coalition and one by the Separatists. +- Improvements to the campaign map. +- Added a 3rd talent tree, "Politician", for the Captain. Focused around faction relations and reputation. + +Endgame: +- Completely remade the ending of the campaign. Now you'll get to see what's beyond the Eye of Europa and perhaps uncover the cause for the increasing levels of radiation. +- New types of enemies/bosses. +- Some new events to foreshadow the ending during the course of the campaign. + +Misc changes: +- New loading screen / location portraits. +- Two new music tracks. +- Items' skill requirements are shown in their tooltips (the same way as damage resistances). +- Tweaks to poisons. +- Adjusted Europan Handshake to work better with the overhauled morbusine poisoning. +- Acid Grenades and 40mm Acid Grenades are now properly affected by talents +- Acid Grenades and 40mm Acid Grenades deal more damage and slow enemies down, making them more viable against fast monsters. +- Made regular 40mm grenades penetrate armor more efficiently. +- Made Diving Suits resist Acid Burns a bit more. +- Europa Brew's Acid Vulnerability is now double as effective (200% damage taken instead of 100%). +- Adjustment to throwable items (shorter throw distance and reduced speed in water). +- Made flares float in place to make them more useful. +- Made high-quality stun guns more effective (stunning the target faster). +- The health scanner always shows poisons and paralysis on monsters to make it easier to determine whether the poisoning is progressing or wearing off. +- A pass on sound ranges: the ranges should now be more consistent and sensible. +- Made moloch shell fragment and riot shield medium items instead of small to fix them going inside e.g. toolbelts. +- Made husk eggs consumable. +- Made it more difficult to repeatedly enter an abandoned outpost and re-loot the bandits: now the bandits immediately attack you if you re-enter the outpost. +- Monsters you haven't encountered yet are now hidden by default in the character editor. Can be enabled using the command "showmonsters" and re-hidden using "hidemonsters". The value is saved in creaturemetrics.xml. Doesn't affect custom creatures. +- Fixed character crush depths behaving inconsistently (varying between levels, e.g. sometimes crushing the character at the depth of 2000 meters, sometimes 3000). +- Improvements to submarine crush depth effects: previously the breaches were easy to deal with because pressure did small amounts of damage to all walls, now it instead does heavier damage to some walls (and the amount of damage and walls to damage increases with depth). +- Added a round light component variant. +- Increased the hard-coded max mission count back from 3 to 10. It'd be preferable to not change the value above 3 in the vanilla game, but since campaign settings are not moddable, we shouldn't be too strict about it (because it can be useful for a mod that this value can be adjusted). +- Miscellaneous optimizations. +- New slot indicator icons (= the icons that show what can go inside some items, like tanks/ammo). +- Made outpost hull repair service cheaper. +- Doors can now be damaged by melee weapons and ranged (handheld) weapons. (They were already destructible by submarine mounted weapons and explosives) +- Adjusted and rebalanced item damage for most items, to take into account doors being destructible. +- Reduced time needed for a crowbar to open doors, 7.5s for regular doors, 6s for wrecked doors (down from 10 s). +- Boosted Plasma Cutter damage against doors and items (walls not touched). +- Made galena more common in order to make lead easier to get. +- Added Auto Operate option for all turrets. Can be enabled in the submarine editor. Not currently used on vanilla submarines. Auto operated turrets don't require a person to operate them, but they still require power and ammunition (-> someone needs to reload them). + +Multiplayer: +- Added a language filter to the server browser. +- Fixed reports given by dragging and dropping them on the status monitor always targeting the room the character is inside. +- Improvements to medical clinic syncing (should fix some of the afflictions a character has sometimes not being visible on the list). +- Fixed crashing if you close a server when mod downloads are disabled. +- Improved projectile syncing: spread now behaves the same client-side as it does server-side (as opposed to being completely random). +- Improvements/fixes to dialogs that are shown to multiple clients: disable the option buttons when another client chooses an option, and highlight the option that was chosen. +- Fixed server randomizing the game mode at the end of the round when playing a campaign with the game mode selection set to Random. + +AI: +- Fixed bots considering certain multi-hull rooms flooded when they are not. +- Fixed bots deciding prematurely that they can't fix an item when it's deteriorating (e.g. when it's submerged). +- Fixed bots removing battery cells from exosuits when ordered to charge batteries. +- Fixed bots sometimes getting stuck in automatic doors and/or double doors, because they didn't wait for the door to open entirely before pressing the button again. +- Improved bot ‘extinguish fires’ behavior. Fixes bots sometimes not being able to extinguish larger fires, because they stopped too far and didn't keep advancing towards the target. +- Fixed bots claiming that they can't return back to the sub and then following the order anyway. +- Improved the ‘find safety’ calculations so that the bots give more preference to the distance of the room. +- Fixed some remaining issues and edge cases in the logic over when the bot needs diving gear and when it can be taken off. +- Fixed captains (and some NPCs) idling in the airlock if they equip a diving suit. +- Bot can now target items (like projectiles) with turrets and have different targeting priorities on different monsters. +- Fixed bots being allowed to reach items that are too far to be interacted with. + +Fixes: +- Fixes and improvements to translations (Japanese and Chinese in particular). +- Fixed light components with a range of 0 and a hidden sprite being invisible against dark backgrounds. +- Various fixes to Typhon 1: most notably, adjusting the hulls to prevent some rooms from being impossible to drain fully. +- Fixed "kill" command not killing characters under the influence of "Miracle Worker". +- Fixed some lights becoming invisible when their range is set to 0 and they're against a dark background. +- Fixed lights turning on without power when they receive a toggle or set_color input. +- Fixed changing the amount of items to fabricate inadvertently starting(or activating) fabrication in MP if you've previously started fabricating something +- Fixed campaign settings resetting in the campaign setup menu every time you relaunch the game (meaning you'd always need to e.g. remember to toggle the tutorial off if you want to play without it). +- Fixed inverted mouse buttons not working properly since the last update: the left mouse button was considered the primary mouse button regardless of your OS settings. +- Fixed status monitor not properly displaying condition on tinkered items. +- Fixed machines smoking when above 100% condition with tinkering. +- Fixed inventory overlapping with the chatbox on low aspect ratios (small width, large height). +- Fixed some layering issues in abandoned outposts. +- Fixed water-sensitive items sometimes spawning as loot in wrecks. +- Fixed radio static still playing even if you don't have a headset. +- Fixed rifle grenade sounds not working. +- Fixed crashing on startup if the MD5 hash cache file is empty. +- Fixed research stations and loaders not being visible on the status monitor's electrical view. +- Fixed artifact missions sometimes choosing the same artifact as a target if you happen to have multiple missions active at a time, which would lead to console errors when the round ends. +- Fixed exosuit playing the warning beep if there's empty or almost empty tanks in any of its slots. +- Fixed oxygen generators deteriorating in some of the outpost modules. +- Fixed reputation loss when a character other than the player (e.g. crawlers in the 'crawleroutbreak' event) damages the outpost walls. +- Fixed outpost modules sometimes being placed in a way that makes them overlap with the sub. +- Fixed characters trying to walk in flooded spaces that are too low to stand in (like some of the tight passages in alien ruins). +- Genetic material backwards compatibility to fix old unidentified genetic materials disappearing from saves prior to v0.21.6.0. +- Fixed genetic materials being too rare in outposts now. +- Fixed hunting grounds affecting outposts 2 steps away, not just ones in adjacent locations. +- Fixed "residual waste" talent duplicating genetic materials. +- Fixed monsters sometimes spawning inside destructible ice chunks in caves. +- Fixed respawn shuttle sometimes spawning inside floating ice chunks. +- Fixed equipping a ranged weapon setting its reload timer to 1, making it possible to reduce some weapons' loading times by unequipping and equipping them. +- Fixed partially consumed items not staying on top of the stack they're in. +- Fixed submarine tier and class affecting the prices of the submarine upgrades: e.g. a tier 2 upgrade would cost more on a submarine where tier 2 is the maximum than on a submarine with a higher maximum. +- Fixed reputation loss when you steal items from bandits in a beacon station. +- Fixed equipped flares igniting when you click on the inventory. +- Fixed "Quickdraw" talent not affecting Alien Pistols. +- Fixed toolbelts and other items worn on the torso getting hidden when wearing a safety harness. +- Fixed advanced syringe gun and slipsuit fabrication recipes. +- Fixed floating pumps and ladder layering issues in Herja. +- Limited the number of makeshift shelves per sub to 3 (similar to portable pumps). Otherwise you can use them to expand the sub's cargo capacity indefinitely. +- Fixed dementonite and hardened crowbars spawning in respawn containers (= respawn shuttle cabinets). +- Fixed alien blood no longer causing psychosis, + made it slightly less effective to make fabricating blood packs more worthwhile +- Fixed fire extinguisher spray getting blocked by characters. +- Venture: Fixed the battery room not flooding properly (again), fixed the two hulls in the airlock not being linked, adjusted the waypoints a bit. +- Selkie: Disconnect the outer nodes from the ladder/door nodes, because the docking ports can't be opened manually. +- Fixed Thalamus AI not running properly when there's no player characters or submarines around (e.g. when all the players are in the freecam mode). +- Fixed the ammo indicator not showing correctly on the advanced syringe gun. +- Fixed bots sometimes getting confused by outside waypoints while being inside an outpost. +- Fixed item relocation logic running also on NPCs that are not in the player team, which could cause diving suits dropped by NPCs to get spawned in the player sub. + +Modding: +- Fixed crashing if a StatusEffect is configured to SpawnItemRandomly but doesn't configure anything to spawn. +- Improved the error handling of item/character variants. Previously if the parent prefab wasn't found, there was no error message, but the variant was still created, causing crashes in various situations. +- Added AITurretPriority and AISlowTurretPriority on items and characters. Setting the priority to 0 can be used for telling the bots to ignore the target entirely. Items also need to have IsAITurretTarget="True" enabled to make them a valid target. +- Added ItemDamageMultiplier on items. Can be used for increasing the damage caused by other items, like weapons. Works like the existing ExplosionDamageMultiplier. + +--------------------------------------------------------------------------------------------------------- +v0.21.6.0 +--------------------------------------------------------------------------------------------------------- + +- Minor localization fixes. +- Fixed some occasional crashes in the character editor. + + +--------------------------------------------------------------------------------------------------------- +v0.21.5.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed delete save button not working in the singleplayer "load game" menu. +- Fixed depleted fuel revolver round recipe requiring too many materials. +- Reduced medical item cooldown to 0.5 seconds. +- Minor fixes to Chinese localization. +- Fix bugged sufforing poisoning when it reaches the full strength. +- Fixed crashing when you save a sub that contains item variants with decorative sprites (most wrecks) as a new content package. + +--------------------------------------------------------------------------------------------------------- +v0.21.4.0 +--------------------------------------------------------------------------------------------------------- + +Unstable only: +- Fixed crashing when an item spawns after upgrades with material requirements have been purchased in the multiplayer campaign. +- Fixed crashing if the submarine preview is closed before generating the preview finishes. + +Changes: +- Some submarine upgrades cost materials in addition to money. +- Crush depths are displayed on the submarine switch terminal. +- Miscellaneous fixes to all translations. +- The "max missions" campaign setting is restricted to a maximum of 3. +- Minor improvements to ragdoll animation when falling prone due to stun/unconsciousness/ragdolling. +- Revisited the skill requirements and the OnFailure conditions on welding tool, plasma cutter, flamer, and steam gun. Flamer and steam gun now apply burns on the user only when they don't have enough skills to use the item. All these items are now less efficient when used with low skills. +- Changed Alarm Buzzer sound to differentiate it from the diving suit warning beep. +- Depth charge tweaks: require UEX, increase non-contained item explosion radius and damage, allow quality to affect explosion, increase pricing. +- Reduced Flak Cannon effectiveness (in particular Spreader Ammo and Explosive Ammo), against large enemies in particular. +- Lights flicker when hit by EMP. +- Large monsters no longer drop the loot when they die. This was implemented as a workaround to it being difficult to grab large monsters, but now they're much easier to grab - you can grab them anywhere near their main limb, instead of having to find the "origin" somewhere at the center of the monster. +- Bots now prefer PUCS over the other diving suits and the other diving suits over exosuit. +- Made drinks and other consumables work more consistently. +- Adjusted the aim poses used while holding certain melee weapons. +- Harpoons: Adjusted the damage on walls and the projectile launch forces. Spears can now stick to the walls. Inversed the reeling logic: ragdoll key = reel in. + +Poison overhaul: +- Reworked most poison afflictions with the goal that a medic can now use them offensively on monsters and humans alike. +- Sufforin, Morbusine, Cyanide, Paralyzant now work on most monsters. Bigger monsters are generally more resistant than the smaller. +- Sufforin poisoning: Slowly makes the target fall sick. Eventually leads to death. Stronger monsters may recover. +- Morbusine poisoning: Kills the target relatively quickly from gradual oxygen deprivation/organ damage. Stronger monsters may recover. +- Cyanide poisoning: Doesn't do much at first, but progresses rapidly and kills the target suddenly. Lethal even to the strongest monsters. +- Paralysis: Advances more quickly than previously. Effective even on larger monsters. (Leucocytes don't always apply enough paralysis for it to progress. They also use a version of the affliction that progresses using the old, slower speed.) +- Poisons (and paralysis) now wear off when the affliction level is low. +- Made medic AI react sooner to treat poisons. +- Attempts to poison the target can now fail when the user has a low medical skill. +- Added a short cooldown to applying medical items. Prevents being able to spam medicine (or poisons) at a nearly unlimited rate. +- Adjusted the syringe and stun gun dart trajectories. +- Reworked the weapons and the medical skill gains: instead of always increasing the weapons skill when a target takes damage, afflictions like poisons now increase the medical skill. Also applying the buffs now increases the medical skill. The skill increases are defined per affliction. +- Fixed the skill gains on low levels (0-15) being ridiculously high. + +Talents: +- Fixed "Down With the Ship" sometimes having an incorrect description. +- Fixed "Bounty Hunter" and "Logistics Expert" not giving 15% experience bonus. +- Pet raptor eggs can be fabricated from raptor eggs of any size. +- Fixed Flamer being craftable by anyone, even though it should only be possible with the "Pyromaniac" talent. +- Fixed ability to move in an unpowered exosuit when you've got any speed buff. +- Fixed "True Potential" and "Chonky Honks" not requiring clown power to work. +- Reduced the chance of finding genetic materials with the "Gene Harvester" talent, fixed genetic materials sometimes being found on defense bots. +- Fixed "Spec Ops" not working properly with shotguns and other weapons that fire multiple projectiles per shot. Only the first projectile that hit did double damage. +- Fixed some parts of Hemulen and Venture not flooding properly. +- "Mass production" talent only applies to items in the "material" category. Fixes e.g. recycle recipes sometimes allowing you to keep the original item. +- Fixed "Lone Wolf" not giving any damage/stun resistance. +- Fixed "Scrap Savant" having a 80% chance of finding scrap instead of 20%. +- Fixed "Steady Tune" not doing what the description says (giving a constantly diminishing 7.5% resistance instead of 60%), made the talent give 100% immunity instead. +- Fixed "Multifunctional" talent not giving a boost to crowbar damage. +- Fixed inaccurate "Unstoppable Curiosity" and "Ph.D in Nuclear Physics" descriptions. +- Fixed skill boost from "Journeyman" not matching the value in the description. +- Fixed "Quickdraw" damage bonus. +- Fixed inaccurate "Journeyman" description. +- Fixed "Oiled Machinery" not increasing fabrication speed. +- Fixed tinkered doors requiring a higher condition percentage to become repaired. +- Fixed "Drunken Sailor" not protecting entirely from the negative effects of drunkness. + +Multiplayer: +- Better support for playing the MP campaign without a host or someone with campaign management permissions on the server: + - You can vote to end the round in the campaign as well. + - Automatic restart works in the campaign mode as well. + - Anyone can manage salaries if there's no-one allowed to do it. + - If there's no host or anyone with permissions in the server, anyone is able to setup a new campaign. + - Campaign can be voted for when game mode voting is enabled. +- Made ragdoll syncing more robust: reduces cases of teleportation/desync when manually ragdolling the character in multiplayer. +- Fixed rejoining clients not regaining control of their character even if the character is still alive, if the client's IP address has changed. A respawn would also not trigger. +- Fixed "failed to write a network message, too much data is being stored in SegmentTable" errors that could occur in various situations: for example when the host has a large ban list, lots of submarines, and when rewiring a device with lots of connections. +- Fixed "Create new character" button not appearing in the tab menu when dead or spectating. +- Fixed clients not entering the server lobby if they accept a server invite during a single player round or tutorial. +- Fixed inability to join IPv4 servers when IPv6 is disabled. +- Fixed hidden submarine list sometimes desyncing if you have specific custom submarines. +- Fixed characters spawning with their inventory, skills, etc intact if they die during a round and the round ends when the client is no longer in the server. Or, to put it another way, spawning as if they hadn't died at all. +- Fixed an issue that prevented some dedicated servers from appearing in the server list. +- Fixed chat-linked wifi components not receiving order and report messages. +- Save the server settings after starting up the server to create the default settings file if it doesn't exist, instead of only when the server is shut down or the settings changed. +- Fixed list of hidden submarines sometimes desyncing. +- Fixed inability to start Linux dedicated server using LinuxGSM due to an incorrect EOL character in DedicatedServer.exe. + +Bugfixes: +- Fixed high-quality items spawning earlier in the campaign when playing with a higher campaign difficulty setting. +- Fixed multiple issues in the tutorials: missing text, events not progressing when not following tutorial's steps, infographics usability issues. +- Fixed attacking with a melee weapon making you unable to turn (flip) for a while. +- Fixed ragdolling affecting the character's velocity, allowing it to be used as a way to avoid fall damage. +- Hull fixes to vanilla subs and wrecks. +- Fixed alien flares practically never spawning in ruins. +- Fixed status effects defined inside an attack definition still using the old OnUse/OnFailure logic instead of OnSuccess/OnFailure. +- Fixed "save as item assembly" and "snap to grid" buttons taking cursor focus in the sub editor even when they're not visible. +- Fixed inability to launch custom dedicated server executables from the main menu on mac and linux. +- Fixed inability to drag and drop items from the entity list to small containers (such as battery charging docks) in the sub editor. +- Fixed item condition not decreasing client-side if the condition decreases very slowly: for example when using a thorium rod with the "Cruisin'" talent. +- Fixed flares still emitting light after running out. +- Fixed Electrical Discharge Coil preview not working in the sub editor. +- Fixed alien flares not activating when clicking LMB. +- Fixed crawler's arms getting broken when the character flips (turns) in water. +- Fixed the recycle recipe of flak explosive ammo. +- Fixed misaligned shells in wrecked railgun shell rack. +- Fixed misaligned light component light sprite. +- Fixed crashing if the select audio device is disconnected while in the initial loading screen. +- Fixed inability to sell genetic materials that aren't 100% refined. +- Fixed liquid oxygenite exploding too easily. +- Fixed Hemulen's bottom airlock never fully draining. +- Fixed incorrect damage values in "Genetic Material (Hunter)" tooltip. +- Fixed exosuit not playing the warning beep when low or out of oxygen. +- Fixed "taste test" event showing for everyone and not progressing past the 1st prompt. +- Fixed "special training required" and "too many of this item" messages being shown to everyone when someone tries to place a portable pump. +- Added a pump to RemoraDrone's engine room, otherwise it's impossible to drain. +- Fixed some lighting sprites appearing dimmer than they should (most notably, junction boxes and supercapacitors). +- Fixed submarine's crush depth being displayed incorrectly on the campaign map when a submarine switch is pending: the hull upgrades of the current sub weren't taken into account, even though they carry over to the new sub. +- Fixed item assembly descriptions not showing up in the sub editor unless they're configured in a text file. +- Fixed rapid fissile accelerator ammo causing an explosion when launched, instead of when it hits something. +- Fixed bots sometimes trying to contain multiple ammo boxes when reloading turrets (also affected other items). +- Fixed "Manually Outfitted" not doing anything when starting a campaign. +- Fixed guardians trying to heal themselves in inactive pods (not destroyed pods, but ones deactivated via wiring). +- Fixed bots having trouble with fixing Barsuk's top hatch and leaks around it. +- Fixed sprite bleed in turret icons. +- Fixed radio channel presets resetting between rounds. +- Fixed some lines in the "shockjock" event being shown to everyone. +- Fixed radio noise playing even if you don't have a headset. +- Fixed hitscan projectiles going through subs when you're firing from inside another sub. +- Fixed lights set to flicker/pulse eventually getting out of sync even if they're set to the same frequency. +- Fixes to submarine preview: wires are now visible, scaled doors work correctly, camera is now correctly centered on the sub when opening the preview. +- Fixed the affliction type of some afflictions (like drunk) being "poison", causing them to be treated as poisons. They are now "debuffs" instead. +- Fixed defense bots not attacking pirates or bandits. Also fixed them not protecting the owner when attacked by the outpost guards. +- Fixed bots not knowing how to handle diving suits that don't have an oxygen tank inside them. Now they should be able to use them and refill them with an oxygen tank. + +Modding: +- Added a button for updating core mods into the Mods menu. +- Addressed various inconsistencies, issues and limitations in how status effects are used in certain cases: + - Status effects defined for attacks with the type "UseTarget" now correctly target the use target, instead of the attacker like they used to. + - Changed the status effects of type "Character" to "UseTarget" for MeleeWeapon and Projectile components. The motivation behind this change is that previously we couldn't target the attacker at all within these item components, which might be desirable for some melee weapons. + - MODDERS, PLEASE NOTE: Effects that target "Character" in the previously mentioned components now affect the user - if that's not the intention, the target should be changed to "UseTarget". + - The use target can now be a character, an item, or a structure, depending on the context. This allows effects that weren't previously possible, but due to it we'll now need to introduce some restrictions in the definitions in some cases. For example, we might want to use a conditional to check whether the target is of the right type, before triggering the status effect (). + - Added a new attribute for the MeleeWeapon component, "HitOnlyCharacters", which can be used for ignoring the hits to walls and items entirely. + - Due to the changes, some status effects that previously worked, might now need the "AllowWhenBroken" set to true in the definition to keep them working as they used to. So e.g. the "OnImpact" doesn't work anymore on your custom explosive, try that. +- Fixed crashing when trying to place a wreck with no hulls in a level. +- Fixed mod descriptions getting truncated to 255 characters when selecting an already-published item in the Mods menu. +- Fixed HMG's requiring hmgmagazine instead of any item with the type "hmgammo", making the use of modded ammo impossible without overriding the gun too. +- Fixed crashing when an upgrade tries to increase an integer value. +- Changed the affliction type of some afflictions, which might have implications on mods if they targeted them by type. +- Added AimAngle on Holdable item components. Can be used for defining a different hold angle for the aim and the rest poses. Note that on Holdables, the angles are mutually exclusive (defined separately), but on MeleeWeapons they are cumulative (added together). Therefore, no need to change the existing items! +- Fixed definitions not triggering the status effects that have the target type "UseTarget". + +--------------------------------------------------------------------------------------------------------- +v0.20.16.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed console errors when firing a Flak Cannon using spreader ammo in multiplayer. + +--------------------------------------------------------------------------------------------------------- +v0.20.16.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed non-hitscan projectiles going through doors. +- Fixed electrical discharge coils hitting characters very unreliably, unless the character happens to be right next to a wall. +- Fixed makeshift shelves being containable in crates and cabinets, allowing for infinite recursive storage space. +- Fixed the effects of the "Grid Maintainer" and "Egghead" talents. +- Fixed incorrect "I Am That Guy" description (it gives a flat 20 skill bonus, not 20%). +- Fixed "Cruisin'" talent increasing fuel consumption by 10% instead of decreasing it by 20%. +- Optimized Steam Workshop queries done by the game (less bandwidth usage and stress on Steam's servers). + +--------------------------------------------------------------------------------------------------------- +v0.20.15.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed Revenge Squad talent doing nothing. +- Fixed Quickdraw talent's 8 second cooldown not working. +- Fixed flamer being fabricable without the appropriate talent. +- Fixed incorrect Aggressive Engineering talent description. + +--------------------------------------------------------------------------------------------------------- +v0.20.14.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed missing Rifle fabrication recipe. +- Fixed command devices (nav terminals, status monitors) not being in the electrical category, preventing "Better Than New" talent from having an effect on them. +- Fixed Graduation Ceremony still unlocking double the talents in multiplayer. +- Spawn husk eggs instead of husk syringes as creature loot. +- Cultist events require husk eggs instead of syringes. +- Adjusted shotgun fabrication recipe. + +--------------------------------------------------------------------------------------------------------- +v0.20.13.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed incorrect admin module sometimes being used in colonies, making it impossible to get to. +- Fixed a performance issue (character vitality logic being unnecessarily heavy) caused by some of the recent talent changes. +- Fixed inability to fabricate Rifle Bullets. +- Fixed contained items that have been configured to be hidden not being positioned correctly (meaning any positional effects done by the contained item would not work correctly). + +--------------------------------------------------------------------------------------------------------- +v0.20.12.0 +--------------------------------------------------------------------------------------------------------- + +Talent overhaul: +- Redesigned and rebalanced talents: lots of new talents, changes and balancing to existing ones and replacing some of the more broken ones with new ones. +- Redesigned talent tree structure: there's now a selection of "generic" talents, and after you've unlocked 4 of them, you can choose a specialization talent tree. After completing a specialization tree, you can choose another one. +- Lots of new talent-related items and 2 new pets. +- Players can select talents for bots in multiplayer. +- Anyone can fabricate the items bots have unlocked using talents. + +Balance: +- Slightly adjusted values of handheld weapons. + - Damage values of weapons have been adjusted to be more in line with their cost + - Damage to structures has been revised (f.e. knives shouldn't be so efficient at cutting through walls). + - Improved ammo availability for basic weapons. + - Usage of a minimum difficulty level to have some weapons appear in stores only later in the game. Even some previously talent-only items can appear in stores now in very late biomes. +- Made some weapons available later in the game to increase the feeling of progression. +- Slightly adjusted values of apparel (armor, clothing, diving suits) to better highlight strengths and weaknesses. + - Combat Diving Suit is now actually better for combat than the regular diving suit, due to higher damage resistances. + - PUCS no longer gives a bonus to speed when using Underwater Scooter, as it has plenty of other strengths. + - Mechanic's apparel now has higher laceration protection than Engineer's apparel, as that's typically the damage they'd get from failing to repair. + - All starter clothing gives less protection now, while some shop/npc clothing now gives some benefit. +- Chance of finding good/excellent/masterwork quality items in higher-difficulty levels. +- Plasma cutter is now much better at cutting. +- Rebalanced damage dealt by tools. Damage should be a bit higher overall. (don't actually try to fight mudraptors with a wrench though) + +Tutorial improvements: +- A new campaign-integrated tutorial that teaches the basics of the campaign mode in the first outpost. +- Various fixes and improvements to the Basic and Role tutorials. +- Added popups when completing tutorial chapters that allow you to restart or continue and to return back to the menu. +- Added a reactor infographic designed to help new players better understand the reactor interface. It's accessible through a help button on the top right corner of the interface. +- Added in-game hints for the genetic system. + +Changes and additions: +- New weapons: Rifle, Heavy Machine Gun, Machine Pistol, Harpoon Coil-Rifle. +- Flashlight can now be attached to all ranged weapons held with two hands. +- Limit which submarines are available in each outpost: high-tier subs become available as you get further in the campaign, and the submarine class selection depends on the type of the outpost. +- Two new music tracks. +- Added a slider to the fabricator that can be used to select how many items to fabricate. +- Added an option to hide enemy health bars. +- Items' damage modifiers are shown in store tooltips. +- Added a button for treating all characters in one go in the medical clinic. +- Breaches through the submarine's outer hull throws shrapnels that can cause minor damage to nearby characters, making monsters that can't get inside more of a threat to the crew (as opposed to just the submarine itself). +- Added a new honking scary random event to beacon stations. +- Water-sensitive materials now explode when they've been in water for 3 seconds, not immediately. Added particle, sound and light effects. +- Affliction descriptions change depending on the strength of the affliction, and whether you're treating someone else or yourself. +- Added a button for opening the Steam Workshop to all tabs of the workshop menu. +- Added tooltips that explain how the bot spawn modes work to the server lobby. +- Added various new loot items to different creatures. +- Large monsters (Abyss monsters, Moloch, Watcher) now also drop items upon death. +- Husk eggs now come in two forms: Husk eggs with actual egg-like appearance and the syringe version. Typically syringes are crafted, so finding a syringe on creatures felt a bit out of place. The eggs look as yucky as you’d expect. +- Made saline significantly less effective as a treatment for bloodloss to make blood packs more useful. +- Nerfed flak cannon's explosive ammo. +- Emp damage now stuns and damages electrical characters (Fractalguardian and Defensebot). Modders note: it’s implemented as an affliction, so it's not tied to the "empstrength" attribute defined for explosions. +- Allow putting medium items (e.g. storage container) in medical and toxic cabinets. +- Some changes to wrecked item sprites (replacing the old low-res pictures with modified versions of the normal items' sprites). +- Optimized the server lobby: there was an issue in the logic that updates the microphone icon that caused the game to check available audio devices every frame. +- Optimized status monitors: previously some parts of their UI were always updated regardless if anyone is viewing the UI. + +Multiplayer: +- Quality of the radio voice chat diminishes with distance (gradually fading into radio static), similar to the way as the quality of the text chat. +- Voice chat range also affects spectators (= spectators can't hear players talking at the other side of the level). +- Fixed speech impediments only affecting the text chat, not the voice chat. +- Fixed radio voice chat not working properly if the range of the radio is larger than 250 meters. Happened because characters' positions aren't synced if they're further away than 250 meters from the client. In practice, the quality/volume of the chat would stop diminishing after 250 meters, and then immediately cut off when outside the radio range. +- Fixed inability to connect to IPv4 servers when IPv6 is disabled. +- Fixed occasional crashes when shutting down a server (for example with the error messages "pipe is broken" or "ChildServerRelay readTask did not run to completion"). +- Fixed "no core packages in the list of mods the server has enabled" error when trying to join a server that's using a different version of the core package you have enabled. +- Fixed "Input contains duplicate packages" error still occurring if you try to join a server that has empty content packages when you don't have those packages yourself. +- Fixed networking errors when the connection to the server is momentarily lost and then re-established. +- Added a cooldown to client name changes to prevent using it for spamming. +- Fixed bans issued with the "banaddress" command using a client's Steam ID not working. +- Server visibility can be adjusted in the server lobby (instead of having to restart the server). +- The "respawnnow" console command forces a respawn even if there's less than the minimum amount of players waiting for a respawn. + +Bugfixes: +- Fixed candidate box not being visible when using the Chinese input method. +- Fixed switching characters interrupting outpost events (even if there's currently no dialog active). +- Fixed certain events preventing other events from triggering when half-finished (e.g. preventing you from unlocking missions when an event is still running and for example waiting for you to talk to some other NPC). +- Fixed bots sometimes firing in a random direction when they equip a weapon. Happened because the aim and shoot inputs could already be active when the bot switches from another item to the weapon (e.g. from underwater scooter to some gun). +- Fixed pirates sometimes being unable to operate multiple turrets at the same time (even if there's enough crew to operate multiple), and attempting to operate hardpoints. +- Fabricator chooses the available ingredient that's in the worst condition when there's multiple suitable ingredients available. +- Fixed Esc not closing the campaign interfaces (map, store, shipyard, etc) but opening the pause menu instead. +- Fixed piezo crystals no longer spawning in the Great Sea. +- Fixed characters falling off ladders when using aimable tools. +- Fixed currently selected mission being included in the mission count displayed on the campaign map (i.e. showing "1/2" when you're choosing a new destination at an empty location). +- Fixed inability to sit in cafeteria chairs. +- Fixed projectile impacts getting triggered by gravity spheres and other TriggerComponents (meaning you couldn't hit monsters near a gravity sphere). +- Fixed blood pack fabrication recipe outputting only one item. +- Fixed tutorial not progressing when inserting a welding fuel tank inside the welding tool straight away, rather than inventory first. +- Fixed PUCS not beeping when you're underwater without a tank if you're inside a hull that has oxygen in it. +- Fixed some issues in sonar AITargets which made monsters hear the sonar when they shouldn't: switching to passive would immediately make the current directional ping cover 360 degrees, and whether the ping was directional or not would actually depend on whether the previous ping was directional, not what the mode is now. +- Fixed items getting autofilled into non-interactable containers in wrecks and outposts. +- Fixed ID cards looted from the corpses of a wreck not giving access to the secure containers in the wreck. +- Fixed verifying file integrity on Steam resetting the server settings file. +- Fixed crashing if you try to open an access-restricted directory in the file selection dialog. +- Fixed a typo in physicorium shell's damage config, causing it to not do bleeding damage. +- Fixed money gain/lose popups no longer showing in the campaign. +- Fixed bloodloss and drunkenness never fully healing, just dropping below the threshold at which the icon appears. As a result e.g. drunkenness and bloodloss never fully went away, which caused issues with some talent effects. +- Fixed bots always opening the door/hatch they're trying to repair. +- Fixed power indicator not rotating with batteries. +- Fixed lights on welding tools and plasma cutters emitting light the next round if the round ends while using them. +- Fixed Camel's airlock not draining fully. +- Fixed Berilia's bottom EDC not being wired to a supercapacitor and a loose wire between the flak cannon and the right supercapacitor. +- Fixed status effects targeting "NearbyCharacters" or "NearbyItems" being applied twice. Modders: if you used this, double the effects (e.g. damage) to get the same results as previously. +- Fixed a rounding error that caused Health Scanner HUD to display every level of bleeding below 100% as "minor". +- Fixed speech impediment from the husk infection making the bots unable to register any new targets on their own (= without being ordered). +- Fixed bots having unintentionally long reaction times on reporting the issues, causing them to ignore new enemies for a while when they first encounter them, unless being attacked. +- Fixed the default aim assist being 50% instead of 5%. Fixed aim assist not resetting when the reset button is pressed on the settings window. +- Fixed other players not seeing the spray particles when someone uses a sprayer in multiplayer. +- Fixed ability to "fire" (just dropping the projectile) hardpoints that are connected to a periscope and loader. +- When throwing an item (such as a grenade), the whole throw animation is played before the item is actually launched. Prevents being able to throw items at a ridiculous rate by spamming the hotkeys and LMB. +- Fixed portable pump's per-sub limit not working if you attach them at a spot with no background wall. +- Fixed oxygenlow resistance not affecting the time it takes to die in an unconscious state. +- Fixed bloodloss resistance not affecting how fast bleeding causes bloodloss. +- Fixed numpad keys toggling the chat when the Chat key is bind to nothing. +- Fixed main menu sometimes appearing half obstructed when starting the game on Mac. +- Fixed husk appendage breaking if the character already has extra limbs from e.g. genes. +- Fixed blocked doorways in Alien_Entrance3. +- Fixed Cyrillic symbols not being visible in the server list's server info panel when playing in a language other than Russian. +- Fixed certain genetic effects (such as regeneration from Hammerhead Matriarch genes) not working properly when multiple characters have the same effect. +- Adjusted railgun, coilgun and double coilgun firing offsets to make the projectile spawn closer to the end of the barrel. +- Fixed loot sometimes spawning in vending machines' output slots. +- Fixed water level sometimes "flickering" up and down when water is leaking to a room from the left or right. +- Fixed resetting the UI position doing nothing to equipped items' UIs (e.g. handheld status monitor). +- Fixed items equipped in the health interface slot being sellable. +- Fixed inconsistent view ranges of large turrets. +- Fixed SMG magazine shape being inconsistent with the shape of the mag well on the SMG sprite. +- Fixed character portrait and health bar buttons being clickable (despite being hidden) when the health interface is open. +- Fixed occasional crashes due to location store being null when teleporting from location to another with console commands. +- Fixes to impact-sensitive items exploding at the start of the round (e.g. at the start of explosive transport missions or when purchasing explosives). +- Fixed bots occasionally being unable to operate turrets when starting a new round until they're re-ordered to man the turret. +- Fixed focus staying on the highlighted item/character indefinitely if you keep holding LMB, even if you're outside interaction range. +- Fixed some creatures not having enough space in their inventory for the genetic materials to spawn into. +- Fixed minerals still sometimes being placed outside the level in mineral missions. +- Fixed cave tunnels sometimes being too narrow to pass through. +- Fixed "man and his raptor" outpost event giving 1000 marks in an incorrect branch of the dialog (the one where you immediately accept the NPC on board, instead of the one where the NPC says they'll pay you 1000 mk). +- Fixed cases of interaction texts for focused item (most notoriously, the planter) not being updated correctly. +- Fixed "snap to grid" causing door gaps to get misaligned. +- Fixed weird equipping behavior on fruit and paints, causing them to be equipped in both hands when trying to unequip. +- Fixed junction boxes not getting damaged by water. +- Fixed opiate withdrawal only reducing down to 20%, but never fully healing by itself. +- Fixed engines reverting back to the non-damaged sprite when they're damaged badly enough that the sprite starts shaking. +- Fixed walls being set up incorrectly in vertical abandoned outpost hallway modules, causing them to stick out into the connected modules. +- Fixed bots being unable to fix Typhon 2's top docking hatch or the wall right next to it. +- Fixed crashing when applying upgrades to linked subs, and there's more than one linked sub. +- Fixed Research Station being in the "Outpost" subcategory in the sub editor. +- Fixed bots dropping medicine from PUCS when changing its oxygen tank. + +Modding: +- Added a button to the main menu that can be used to update all installed mods when there's updates available. +- Mods with errors can no longer be enabled. This change should encourage modders to fix errors in their mods and report bugs, as well as discourage players from ignoring errors. +- Removed most of the debug console error spam seen when launching the game or opening the settings menu when faulty mods are installed. +- Fixed mods failing to show up in the mods list at all when they have certain kinds of errors. +- Implemented the status effect type "OnSuccess" where "OnUse" was used instead. Changed "OnUse" to be neutral, meaning it always triggers, regardless of the (skill) requirements. You may need to switch using "OnSuccess" instead of "OnUse", if it's intended for the status effect to trigger only when the (skill) requirements are matched. +- Fixed increasing an item's HealthMultiplier making the items appear damaged in existing subs/saves (e.g. if you doubled an item's maximum condition, the items would remain in the old maximum condition and appear 50% damaged). +- Fixed crashing if a talent is triggered when the character receives some affliction, and that talent applies the same affliction on the character. +- Fixed crashing if the ingredient of a fabrication recipe can't be found. +- Fixed inability to sync properties of ItemComponents that the item has multiple of (meaning that it was only possible to e.g. edit the light color of the item's first LightComponent if it has multiple). +- Added 'launchimpulse' on RangedWeapon to affect projectile's speed (sum of launch impulses). +- Added 'penetration' on RangedWeapon to affect projectile's penetration (sum of penetration). +- Added 'DontApplyToHands' property to Propulsion, preventing extra force applying to hands when the item is held in hands (instead applying only to the character's whole body). +- Added a skill requirement conditional for StatusEffect, example: to make a status effect occur only if the target has less than 35 weapon skill. +- Added ReloadSkillRequirement and ReloadNoSkill to RangedWeapon. E.g. a weapon with reload=2s, ReloadSkillRequirement=40, ReloadNoSkill=5s will have a character with 20 weapons skill reload at 3.5 s. +- Fixed sound's frequency multiplier not working in many cases (status effects, specific item sounds like turret movement sounds). +- Made it possible to check if some value is null or not with PropertyConditionals (e.g. CurrentHull="eq null"). +- Added UseEnvironment.None to Propulsion component. +- Fixed the debug console command "head" causing the character to disappear. The command can be used for changing the appearance of the character at runtime. +- Status effects of type "OnUse" on projectiles now trigger when the projectile is launched. Previously it launched when the projectile hit the target. Use OnImpact (or OnSuccess/OnFailure) when you want something to happen when the projectile hits the target. +- Added an option to multiply the damage by max vitality (relative damage) per affliction definition, in addition to the "multiplyAfflictionsByMaxVitality" attribute defined for the status effects. If you want to define it for an affliction separately, leave the status effect level definition undefined, because it'd override the affliction specific value. +- Fixed item's OnSpawn effects being applied twice. +- Fixed item components that inherit the status effects from another item component (e.g. the medical syringes) triggering the status effects twice when the effect is triggered via the item and not via the item component. Didn’t cause issues with the vanilla items, but might affect some mods. If your item e.g. suddenly does only half of the damage after the update, it’s possible that it was affected by the bug. Just double the effect to fix it. + +--------------------------------------------------------------------------------------------------------- +v0.19.14.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed submarine upgrades getting clamped to the maximum of that upgrade between rounds, disregarding class/tier bonuses. + +--------------------------------------------------------------------------------------------------------- +v0.19.13.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed "failed to find the end of the bit field after 100 reads" error when trying to join a server that has a large number of mods enabled. +- Fixed "Tandem Fire" talent causing a crash due to the changes in the previous version. + +--------------------------------------------------------------------------------------------------------- +v0.19.12.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed submarine upgrades getting lost if you switch to a lower-tier sub that can't have as many levels of upgrades as the current sub, and then back again. +- Fixed some monster events not being as common/uncommon as intended. In more technical terms (which may be of interest to modders): the commonness defined as an attribute of an EventSet did nothing, making the event default to a commonness of 1. The commonnesses defined for specific level types worked correctly. +- Fixed clients getting stuck in a non-functional lobby if they happen to disconnect or get kicked back to the lobby at a specific point when loading a new round. +- Fixed large turret hardpoint origin being off, causing turrets installed on a large hardpoint to be misaligned. +- Attempt to fix crashing when disconnecting from the server you're hosting. +- Fixed Ctrl+Shift+S shortcut (quicksave) not working in the sub editor. +- Fixed toolbelts and storage containers in old subs going inside toolbelts. +- Fixed submarine tier resetting to default when reopening the sub editor's save dialog. +- Fixed sub editor not taking filename case into account when saving an existing sub: if you'd try to save the file with a different filename case, it'd ask about overwriting the existing sub, but save it as a new file even if you opt to overwrite. +- Fixes to Herja room names (use Engineering, Gunnery compartment, etc. labels), add camera to the front, with a periscope for the captain. +- Fixed non-purchaseable talent items not being available as extra cargo. +- Sorted extra cargo alphabetically + added a filter box. +- Fixed taking items that spawned inside another item (e.g. tanks in a diving mask) from NPCs spawned by an event not counting as stealing. +- Fixed characters falling off ladders when using aimable tools. +- Fixed money gain/lose popups no longer showing in the campaign. +- Fixed inability to manage the campaign if there's no-one with permissions alive. Previously we allowed anyone to manage the campaign if there's no-one with permissions present in the server, but that's not enough, because the players with permissions can't end the round if they're dead. Now if there's no-one with permissions alive, anyone is allowed to manage the campaign. +- If Select and Deselect have been bound to the same key, the deselect input is ignored when interacting with another item than the selected one. Prevents e.g. falling off ladders when trying to open a hatch when both Select and Deselect have been bound to E. +- Made it possible to enter a hostname (e.g. someserver.com) in the direct join prompt. +- Adjusted the size of the submarine list elements in the server lobby to reduce the amount of empty space on large resolutions. +- Fixed event texts for the "scan ruin" mission being in an incorrect language. +- Attachable items cannot be attached inside walls. +- Fixed distance at which you can attach items being slightly longer than the interact distance, making it possible to attach items out of reach. +- Fixed inability to turn when you're dual wielding melee weapons and attacking continuously. +- Fixed inability to cancel deconstruction if there's non-deconstructible items in the queue. +- Fixed local copy of a mod you're publishing not using the version number you've entered in the publish menu. +- Fixed crashing when trying to open the tab menu's character tab with a character who has no personality trait (may happen e.g. if you use a mod that adds custom personality traits and try to play that save without the mod). +- Fixed sourcerect issue in alien generator + decorative sprite not disappearing when the fuel rod is taken out. +- Fixed corrupted mods causing a nullref exception when autodetecting required mods in the sub editor. +- Fixed minerals not disappearing from mineral scanner if they get detached by something else than a character picking them up (e.g. by the destructible ice wall they're on breaking). +- Fixed event-specific metal crate deconstructing to steel. +- Fixed inability to join servers that have enabled multiple mods with identical content. +- Fixed tandem fire not working if there's a character between you and the other character on a periscope. + +--------------------------------------------------------------------------------------------------------- +v0.19.11.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed some old campaign saves being impossible to continue due to the new submarine upgrade restricions. +- Fixed "update all mods" button doing nothing in the Workshop menu. +- Fixed inability to create mod lists that include Workshop mods. + +--------------------------------------------------------------------------------------------------------- +v0.19.10.0 +--------------------------------------------------------------------------------------------------------- + +- Updated translations. Includes various fixes to existing translations. The Japanese translations in particular has been significantly improved. +- Fixes to Camel waypoints. +- Fixed pump in Camel's airlock not pumping out by default. +- Fixed high-quality fuel rods and other high-quality consumable items resetting to 100% between rounds. + +--------------------------------------------------------------------------------------------------------- +v0.19.9.0 +--------------------------------------------------------------------------------------------------------- + +Fixes to new issues in the previous build: +- Fixed missions always giving rewards even if you fail them! +- Fixed clients sometimes failing to reconnect to the server if the connection is momentarily lost. +- Fixed item conditions resetting to 100% between rounds. +- Fixed mineral missions always causing a crash. + +--------------------------------------------------------------------------------------------------------- +v0.19.8.0 +--------------------------------------------------------------------------------------------------------- + +- Minor improvements and fixes to the tutorials (e.g. safeguards to prevent dying or getting stuck). +- Fixed Typhon 2's chaingun being placed inside solid walls. +- Fixed Tandem Fire talent causing a crash if there's no allies alive. +- Fixed bots being unable to shoot at ice spires with pulse laser or chaingun. +- Removed outdated Deep Diver loading screen tip. +- Fixed misaligned connection panel interface when repairing a status monitor. +- Fixed Winterhalter battery recharge speed being limited by the relay that supplies power to them, making recharge speed upgrades useless. +- Fixed a networking issue that caused afflictions' periodic effects (e.g. nausea-induced vomiting) to happen too frequently client-side. +- Fixed none of the contextual orders except "wait here" showing the name of the order in the tooltip. +- Fixed inconsistencies in some crawler swarm mission names (large swarms not being described as large). +- Fixed mineral mission resources sometimes spawning in separate caves. +- Fixed minerals mission resources sometimes spawning outside the level. +- Moved handheld sonar's drag icon to a more appropriate position. +- Fixed buoyancy making locked subs slowly move vertically. +- Reactors don't explode if they reach 0 condition without fuel. +- Fixed motion sensor not detecting pets. +- Fixed cargo capacity displayed in the mission selection screen including the cargo containers in the outpost the sub is docked. +- Fixed clients being unable to select the respawn shuttle if they have to download it from the server. +- Fixed duplicate banlist entires when a client gets banned due to an incorrect password. +- Some wire and waypoint cleanup to R-29 and Remora. +- Removed a wall in Remora to allow for better movement inside. +- Changed one railgun shelf to boxes shelf on Remora. +- Added a coilgun and a couple more diving suit cabinets to R-29. +- Fixed "completed initialization before receiving content package order" error when trying to reconnect to a SteamP2P server. + +--------------------------------------------------------------------------------------------------------- +v0.19.7.0 +--------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Completely remade tutorials. There is now a Basics Tutorial to cover basics like moving, inventory and repairs. More specific tasks are explained in the Roles Tutorial, where every job has their own tutorial to go through, explaining what it means to be e.g. an Engineer or a Captain. +- Added new mining missions, including some in the abyss. +- Reintroduced separate local/radio voice chat keys as a legacy option. Now it's again possible to speak with voice activation by default and use a push-to-talk button for radio, the same way as before, by setting the chat mode to Local and using the new radio voice chat hotkey. +- Device/item UIs can be moved around by dragging. +- Allow using devices while on a ladder or sitting on a chair. +- Changed reactor temperature bar colors (from blue to red). +- Higher quality stun batons cause heavier stun. +- Changed unit load device capacity to 12 (because the sprite has space for 12) and made them waterproof. +- Changed fabricator skill calculations: the most inadequate of the required skills determines the fabrication time (instead of the average). +- Made dying drop a characters' skills towards the maximum initial skill instead of minimum. +- Added a new keybind for opening and closing the chat box. The default bind is B. +- Added a warning if a new keybind overlaps with any of the player's existing binds. +- Overvoltage makes devices perform better, increasing the output of engines, making fabricators, deconstructors and pumps operate faster, electrical discharge coils do more damage, batteries recharge faster and oxygen generators generate more oxygen. Encourages operating the reactor manually and hopefully makes it a little more engaging. +- Added more randomness to junction box overvoltage damage, and made partially damaged boxes take more damage from overvoltage. Prevents all boxes from breaking at the same time, making overvoltage less of a pain to deal with and intentionally overvolting devices more worthwhile. +- Added manual temperature adjustment buttons which immediately increase/decrease the temperature of the reactor for a brief amount of time on manual control (bumps the gauge up/down by a fifth, and the boost fades out in 20 seconds). Allows reacting to load fluctuations very quickly, and conserving fuel by operating the reactor at a lower fission rate � a new benefit to operating reactors manually. +- Signals no longer set the fission and turbine rates of the reactor instantaneously, making automated reactor circuits less overpowered. They are still viable, but especially now with the addition of the extra incentives for operating the reactor manually, they're no longer as clearly the best and most efficient way to operate the reactor, making manual operation more worthwhile. +- Made the "distort" camera effect a little less obtrusive and glitchy-looking (smoother texture + less heavy effect). +- Made water-sensitive materials (lithium, potassium, sodium) spawn in waterproof chemical crates. +- Made crates deconstruct much faster to make them easier to get rid of. +- Sonar disruptions now hide minerals. +- Grayed out ranged weapons' crosshair when reloading (similar to turret crosshairs). +- Disabled the autodocking prompt (which verifies whether you actually want to dock when docking is initiated by an automated circuit) in single player. +- Improved the way drag is applied on submerged items. Fixes heavy items dropping at unnaturally high speeds in water. +- Added a splash effect when an item falls into water. +- The deconstructor UI shows what the input items deconstruct to (particularly important now with the lossy deconstruction recipes - it can be risky to deconstruct something just to see what materials it gives out if that results in material loss). +- Wall and device repair costs in outposts are calculated based on the amount of damage on your sub, instead of always having a fixed price. +- Inflamed lung doesn't affect characters that don't need oxygen. +- Added swarm behavior for crawler husks. +- Added some more oomph to nuclear explosions. +- Adjust the alpha of the outpost service icons according to distance to make it easier to estimate where the NPC is at. Show the title of the NPC when hovering the cursor over the icon. +- Added "unlockmission" console command. +- Added "setcampaignmetadata" console command (may be useful for modders creating custom scripted events for the campaign). +- Changed how NPC "titles" work. Previously we defined "titles" for the pirates (e.g. "Pirate Lord" and such), and the title replaced the name of the NPC (which made their dialog a little awkward). Now we display both the name and the title over the character, and special outpost NPCs also have titles. +- Gave diving masks to most NPCs. +- Changed the burn overlay formula: now also the non-affected limbs get half of the effect, because the sharp contrast between limbs looked weird. +- Restored the 3-shell Railgun rack as a legacy option. +- Reworded the "respawn with penalty" prompt to make it less confusing: you always get a penalty to your skills when you die now, and Reaper's Tax is an "extra penalty" you get on top of that if you opt to respawn mid-round. The intention behind this is to incur a cost to respawning, as it shouldn't be possible to get unlimited free reinforcements and supplies mid-round. +- Made SIGTERM close the linux server gracefully. +- Made respawn items (suits, scooters) spawn in the respawn shuttle's cabinets when possible. +- Show a healthbar on items (e.g. eggs and thalamus organs) when damaging them with handheld weapons (melee or ranged). + +Submarines: +- Added a new intermediate transport sub, Camel. +- Added submarine tiers. Higher-tier submarines can be upgraded further than lower-tier submarines. +- Overhauled and balanced submarine upgrades. +- Added Large Weapon Hardpoints. +- Added Flak Cannon and Double Coilgun as new Large Weapons. +- Railgun is now considered a Large Weapon. +- Added an upgrade that adds a mineral scanner to nav terminals and sonar monitors.cannon +- Submarine class now affects which upgrades are available for the sub. +- Removed the Deep Diver class: the way we see it, Deep Divers didn't have a clear enough role in the game, especially considering that hull upgrades served pretty much the same purpose. In practice, the only clear benefit of a Deep Diver was being able to get through the very last levels of the campaign, and having to switch to one just for that purpose wasn't fun. Now any submarine with full hull upgrades can get all the way to the end of the campaign. +- Fixed messy wiring in Typhon 2's bottom left hardpoint. +- Winterhalter and Remora are now Scout class ships. +- Added some loose vents and panels to Herja, Winterhalter and Barsuk, fixed invisible "loose panel" (news stand) in Orca 2. +- Fixed floating light component in Orca 2. +- Medical fabricator now consumes 500 power on all submarines, to be consistent with other fabricators. +- Updated prices of all submarines to match tiers. +- Gave Typhon 2 better stats and even more firepower, to outclass the original Typhon. +- Improved R-29's speed and gave it a Flak Cannon. +- Added Large Weapon hardpoints to Berilia to make it a Tier 3 transport. +- Tweaked the hulls and waypoints around Herja's top docking hatch to make it easier for bots to reach and weld. +- Fixed a waypoint/hull issue in Typhon's stowage compartment (waypoint in such a tight space the bots couldn't reach it). + +Balance: +- "Mission cheesing" by repeatedly undocking and redocking to an outpost to reroll the mission events no longer works: new mission events don't reappear until one "world step" has passed (~10 minutes or traversing through one level). +- Balance pass on handheld weapons: adjusted reload times, damages, stun durations, recoil and ammo stack sizes. +- Reduced tools' structure damage (dual-wielded storage containers no longer chew through submarine walls in seconds). +- Increased heavy ruin wall health to make it less easy to cheese your way into the artifact room in ruins. +- Made boomstick fire in bursts of 2 (similar to deadeye carbide) to prevent ridiculous fire rates with quick-reloading. +- Added EMP effect to nuclear depth charges for consistency. +- Pulse Laser and Railgun now have similar power consumption as other turrets. +- Changed how skill levels affect the quality of fabricated items. Previously having a skill level equal to or higher than the item's skill requirement would result in a good quality item, meaning that practically everyone could e.g. fabricate good quality oxygen tanks. Now your skill needs to be >20% from the minimum skill requirement towards 100 (e.g. if the item requires 20 skill to fabricate, 36 results in a higher quality item). +- Reduced PUCS's radiation resistance from 100% to 90%. Complete invulnerability to radiation has way too much potential for exploits and overpowered strategies. +- Adjusted supplies in pirate submarines. +- Turned some weapons' burn damage into explosion damage. +- Made the extra sales from "traveling tradesman" talent stack. +- Terminal ignores empty signals. +- Reduced commonness of molochs (as they can take a lot of time to kill, running into multiple of them can quickly become a chore) +- Removed steel requirement for depth charges. Fabricate decoy depth charges from depth charges, rather than from the base material. +- Reduced the Pulse Laser tri-laser bolt spread. +- Explosions are now calculated differently, using the number of limbs to divide the damage (up to a maximum of 15 limbs). Adjusted explosion damage values to match new calculations. +- Coilgun costs 5000 marks to install, Pulse Laser and Chaingun 6000. Large turrets each cost 7500 each. +- Made mudraptor eggs modestly profitable for farming (decreased cost from shop, increased deconstruction yields). +- Mineral yield and spawn rates rebalance: minerals found are now much more dependent on location (biome, cave, abyss). +- Balanced existing mineral missions: adjusted rewards & required minerals, and required some minerals to be handed over to the outposts as proof of their existence. +- Rebalanced Engine Force values to better match hull size. Most Scouts (Azimuth, Orca2, Remora, Winterhalter) are now faster. Humpback, Typhon and Orca are slightly slower. + +Multiplayer: +- Fixed missions sometimes unlocking in incorrect locations in MP campaign, making them either unselectable or causing a "mission mismatch" error when the round starts. +- Fixed clients downloading submarines they already have from the server if the mods those submarines are in are not currently enabled. +- Significantly sped up file transfers (mods, submarine files, campaign saves). +- Clients who've recently joined (by default 2 minutes) are not allowed to vote to kick others, and vote kicking someone always requires at least 2 votes. +- Servers don't allow selecting hidden jobs (jobs only used by NPCs) as job preferences. +- The minimum kick vote counts are no longer rounded down. Previously if you had for example four players on the server and the minimum vote count set to 60%, kicking would require 2 votes, now it requires 3. +- Fixed inventory and wallet resetting if a campaign round ends when a client's character has spawned, but the client is not currently controlling it (e.g. due to getting kicked to the lobby). +- Fixed spectator checkbox overlapping with the character info if you get kicked to the lobby mid-round. +- Fixed "kick" button staying disabled indefinitely if you vote to kick someone and the vote doesn't go through. +- Fixed Steamworks publish tab showing the "free weekend" message when using Steam family sharing. +- Minor tweaks to the end of PvP missions to make them a little less underwhelming: instead of ending the round immediately when one team is dead (without even giving enough time to see the enemy die), there's a brief delay, a message box and a camera transition to let the players see what happened. +- Fixed PvP team assignment sometimes being wildly imbalanced, even when there were enough players with no preference to make the team sizes equal. +- Fixed clients getting stuck in the loading screen if they happen to disconnect at the right moment between rounds. +- Fixed bank balance not getting corrected if it's become desynced by e.g. client-side commands. +- Fixed server not registering a client's character as disconnected if the client disconnects and reconnects before the round has fully started, causing the client to get stuck as a spectator when they rejoin. +- Fixed clients disabling their client-side-only mods when they join a server. +- Fixed hull/item repairs purchased from an outpost sometimes not getting applied client-side. +- Fixed "missing entity" errors in a specific situation in multiplayer. Occurred when a respawn shuttle was enabled and loaded on the server (= i.e. in a non-outpost level), and a client disconnected and immediately reconnected. This would cause the client to deselect the respawn shuttle and make them start the round without loading one, leading to the "missing entity" issues due to the shuttle only existing server-side. +- Fixed damage visuals not showing on characters who've died off-screen. +- Fixed ability to upgrade the sub when there's a switch pending in multiplayer. +- Fixed friendly fire and karma always showing up as disabled on dedicated servers in the server list. +- Fixed spineling spikes fired by a human with spineling genes not damaging any human characters (enemies in PvP, pirates in pirate missions) when friendly fire is disabled. +- Fixed "invalid ExecuteAttack message: limb index out of bounds" errors when you join a server where a character has fired spineling spikes with spineling genes mid-round. +- Fixed "entity not found" errors if a shuttle or submarine ends up absurdly deep in multiplayer (>100 km). We don't even know how someone managed to pull this off. +- Fixed rapidly clicking on the mission giver sometimes not giving all the available missions when the "Use" input is set to LMB. Happened because the conversation logic didn't check if there's another conversation active, causing the server to show a new conversation when clicking the NPC, without interrupting/continuing the previous conversation. +- Made shockjock event only show for the player triggering the event (making it visible for everyone works kind of weirdly, when the event involves talking to an NPC next to the character who triggered the event). +- Fixed outpost events getting stuck at the last ConversationAction if another client has finished the action. + +Optimization: +- Updated our runtime to .NET 6, which should yield significant performance improvements. Do note that this unfortunately means we'll have to drop support for macOS versions older than 10.15, but we have taken some measures to help the affected Mac players continue having access to Barotrauma. More info here https://store.steampowered.com/news/app/602960/view/3367025204056277713. +- Optimized afflictions that apply other afflictions on the character (e.g. radiation sickness, drunkenness, opiate withdrawal). +- Optimizations to the talent system, particularly when the talent menu is open and when there's a large number of talents (e.g. when using mods that make all talents available to every class). +- Physics optimization: fixed submerged items' physics bodies staying active indefinitely even after they've come to rest due to buoyant forces being applied on them constantly. Now we stop updating bodies that have come to rest on the floor and aren't light enough to float. +- Optimized AI objectives that make bots fetch items (combat, contain item, decontain item, get item). + +Submarine editor: +- Fixed door gaps not appearing in the sub editor until you select the door. +- Fixed sub editor background images not saving. +- Fixed turret lightsource rotation not refreshing in the sub editor when flipping the item. +- Fixed prefab placement breaking in the sub editor if LMB is held while moving the cursor outside of the selection panel. +- Fixed several instances of janky UI interactions in the submarine editor: dragging the selection rectangle now works even if the cursor reaches into the prefab list; letting go of a dragged entity works even if the cursor reaches into the prefab list; the dragged entity no longer goes invisible when reaching into the prefab list. +- Made PowerContainer recharge speed always default to 0. +- Fixed adding resizeable items (like ladders) not being registered in the sub editor's command history, preventing undoing it. +- Changed default reactor output from 10,000 kW to 5000 kW. +- Decreased Winterhalter reactor output and increased its fuel consumption rate. +- Fixed some gap issues in Winterhalter. +- Fixed medics not having access to the toxin cabinet in Barsuk. +- Fixed medic, engineer and mechanic spawnpoints having no tags in Typhon. +- Fixed crashing when trying to multi-edit a string value in the sub editor. +- Fixed dragged objects becoming invisible if you bring the cursor over a UI element in the sub editor. +- Fixed screwdrivers and wires in your "inventory" being included in the total item count in the sub editor's wiring mode. +- Fixed entities that were below the cursor when starting to resize a structure staying highlighted during resizing. +- Fixed sub editor treating the autosave interval as minutes instead of seconds (saving every 300 minutes instead of 300 seconds). + +Fixes: +- Fixed "power flowback" issue in turrets. As of the power rework, wires connected to the same input or output pin of a device are considered to be in the same grid, which in practice meant a turret could be connected to another supercapacitor through the power_in connection of another turret, even if there was no direct connection between the 1st turret and the supercapacitor. Now the turrets (and electrical discharge coils) need to be wired directly to the supercapacitor. +- Fixed brief freezes when monsters spawn mid-round. +- Fixed turrets linked to the same loader messing up the upgrade store UI and causing item swaps to cost more than they should. +- Fixed submarines always saving in the root folder of a local mod, instead of the subfolder they were originally in. +- Fixed Reaper's Tax not stacking. +- Fixes to ruin decals in a bunch of ruin modules. +- Fixed a waypoint issue in the Alien_Entrance3 ruin module. +- Removed oxygen tanks from DockingModule_01_Colony. +- Fixed duct block's misaligned broken sprite. +- Fixed status monitor calculating linked hulls' water amounts incorrectly (displaying the average of their water percentages, which isn't correct if the hulls aren't the same size). +- Fixed inactive components (components not currently sending any signal) not reactivating if their output is set to a non-empty value. +- Fixed missing gap in SecurityModule_02. +- Fixed lack of outpost events in difficulties past 80 (which no longer occur normally but still exist in old saves and mods). +- Fixed lithium and magnesium descriptions. +- Adjusted hulls in DockingModule_02_Colony to prevent bots from jumping off the ledge. +- Fixed motion sensors detecting pets as monsters (pets are now a separate target type). +- Fixed helmets not protecting against concussions. +- Fixed safety harness not protecting against lacerations. +- Fixed increasing an item's HealthMultiplier not increasing the current condition (so e.g. doubling the item's max health would cause it to have 50% condition). +- Fixed successive event dialogs in the same prompt scrolling the prompt back up and then down. +- Fixed missing "pirateclothes" inventory icon. +- Made bots better at figuring out which button controls a door when there's some complex circuit involved. Previously the bots would try to find a button connected to any of the door's connections via wires/circuits, now only the toggle and set_state inputs are considered. +- Bots now clearly prefer using buttons linked to the door in the sub editor. Can be used as another way to help bots figure out which button they should press in situations with multiple buttons and complex door control logic. +- Fixed bots failing to find a path to a couple of spots on Herja. +- Fixed alien materials (physicorium, incendium, fulgurium, dementonite, paralyxis) not being shown on the mineral scanner. +- Another fix to cave generation to prevent it from creating impassable paths. +- Fixed inability to use manual assignment for bot orders with options. +- Fixed all boolean components (And, Or, Xor) using the And Component's tooltip for the "timeframe" property. +- Fixed boolean operator component (And, Or, Xor) timeframes not working correctly in some situations (non-zero timeframe, empty false output). The component would deactivate as soon as it stops sending an output, which could prevent some inputs from timing out (meaning that the component could send a signal again as soon as it receives signal A, even if signal B hasn't been received within the timeframe). +- Fixed PUCS consuming the medical item inside it when a welding fuel or incendium tank is inserted. +- Fixed a level generation issue that sometimes made the level impassable if there happened to be a cave right above the outpost. +- Fixed holes on sloped walls being impossible to pass through when you're swimming straight down/up (or straight right/left depending on the wall): the walls are technically considered either horizontal or vertical (depending on the angle of the slope), and you would have to swim in a direction perpendicular to this "technical" direction of the wall. +- Fixed retrying the Hognose mission making a new Hognose join your crew every time. +- Fixed idling NPCs sometimes getting stuck on ladders. +- Fixed mirrored turrets being displayed backwards on the status monitor. +- Fixed character's hands getting "stuck" if you handcuff yourself while dragging someone. +- Fixed dragged character's arms not being pulled towards you, making it look like you're dragging them without touching if you run or walk away while dragging. +- Fixed dragged bots slowly moving constantly, preventing them from switching to the normal standing pose. +- Fixed bots having trouble fixing leaks in multi-hull rooms: they were required to be in the same hull as the leak, which prevented them from fixing leaks in e.g. R-29's bilge. +- Fixed combat missions not ending the round if both crews are dead. +- Fixed bots stating the name of the character they're firing at with turrets, making it seem like they know the name of every pirate they come across and magically recognize them through the walls of the enemy sub. +- Fixed Chaingun rotation speed not being affected by the weapons skill. +- Fixed crashing when using ':' in item assembly names on Linux platforms. +- Fixed ImmuneToPressure ability flag being ignored on characters who don't need air (in practice meaning that you can get killed by pressure if you get huskified even if you have a talent that makes you immune to pressure). +- Fixed geneticmaterialcrawler_unresearched3 producing mudraptor genes. +- Fixed linked subs still sometimes getting placed on the wrong side of the docking port when switching subs. +- Fixes to ruin door connections, wiring and connection panels. +- Fixed "insurance policy" giving the money to the dead character instead of the bank. +- Fixed damage to mirrored wall pieces resetting between rounds. +- Increased the minimum width of cave tunnels to prevent impassable paths. +- Fixed deconstructor input slots becoming unlocked when starting a new round while the deconstructor is running. +- Fixed Grenade Launcher quality doing basically nothing, because it increased the minuscule amount of blunt force trauma the grenade causes on impact instead of the explosion damage. +- Fixed vitality modifiers not being taken into account in the readings in the health interface. For example, gunshot wounds on the head cause a x2 larger vitality drop than on other limbs, but this wasn't displayed on the health interface. +- Fixed Planet Neon Sign sprite bleed. +- Fixed level resource spawn rate not properly respecting the resource spawn chance values of level generation parameters. +- Fixed some text overflows in the hiring menu when using a small HUD scale. +- Fixed name on an ID card resetting to the original name if you rename a character and then start a new round. +- Fixed handcuffs in the backmost hand being drawn in front of the character. +- Fixed water splashes appearing in an incorrect hull when a character's limb moves from a flooded hull to another hull, where the limb is no longer underwater. +- Fixed crashing when a signal causes a wired item to be dropped (e.g. when you attach a detonator to a destructible ice wall and blow it up). +- Oxygen generators and shelves don't fill up oxygen tanks when on fire. Caused repeated explosions when the tank constantly refilled and re-exploded. +- Fixed "gene harvester" and "deep sea slayer" working on all enemies, not just monsters. +- Fixed floating point inaccuracy sometimes preventing items from being used as fabrication ingredients (e.g. an oxygen generator may sometimes only fill tanks up to something like 99.9998%, which prevented it from being used in recipes that require a full tank). +- Fixed item picking timer (e.g. detaching an item from a wall) ticking down when the game is paused. +- Fixed outpost supply cabinets missing the oxygen tank spawns. +- Made the water current outside the levels start from the same point where monsters start heading towards the level, to make sure monsters can't escape too far from subs with a weak engine. +- Fixed hardened diving knife recipe. +- Fixed probability multiplier not being shown in wearable tooltip if the damage multiplier is 1. +- Yet another attempt to prevent beacon missions from failing for apparently no reason: sonar monitors won't get damaged by water after the beacon's been activated. +- Fixed text selection in a textbox stopping when the cursor goes outside the box. +- Fixed fire, breach and intruder report icons not being shown to anyone. +- Fixed missing/unwired lighting in ResearchModule_02_Colony. +- Remove particles when switching screens (otherwise e.g. particles from the previous round are still in the level if you happen to be looking at the right spot). +- Thalamus or ice walls can't be welded. +- Quick-reloading tries to reload the item whose contained items have the lowest condition. In other words, if you've equipped 2 weapons, quick-reloading reloads the one with the least ammo instead of the one that's the first in your inventory. +- Fixed erroneous dementonite and depleted fuel tool recipes. +- Fixed swapping a scaled turret/hardpoint causing the new one to be misplaced. +- Fixed inability to upgrade the sub or do maintenance if you buy and opt to switch to a new sub, and then go to the submarine switch terminal to cancel the switching. +- Fixed stolen items becoming non-stolen when deconstructed. +- Fixed ItemContainer UI popping up (with no visible inventory slot) when you pick one up, e.g. picking up a detonator from the floor. +- Fixed "[E] Rewire" hover text being shown on attachable items that haven't been attached to a wall (even though they can't be rewired until attached). +- Fixed trying to bind multiple console commands to the same key with the "bindkey" command crashing the game. +- Fixed high-quality revolvers having no difference to normal-quality ones. They should get a 10% damage boost per quality level but didn't, due to incorrectly configured quality stats. +- Fixed multiple monster missions sometimes spawning the monsters close to each other, causing them to attack each other. +- Fixed monsters sometimes using the wrong animation parameters while idling (or moving slowly). +- Fixed nuclear depth decoy using the same sprite as the normal depth decoy. +- Fixed fractal guardian VitalityMultipliers being configured incorrectly (using the "type" attribute but with affliction identifiers instead of types). +- Fixed incorrectly sized thalamus wall colliders, added background sprites to the walls. +- Fixed "tried to overwrite a submarine that's not in a local package" error when loading and trying to save a submarine autosave file. +- Fixed location portraits sometimes not showing up in the mission tab. Happened when we initialized the mission tab before the portrait had been loaded. +- Fixed Coilguns and Chainguns not always playing the firing sound when fired. Happened because their audio clips were so long (albeit mostly silent) that firing them continuously led to a ton of clips playing simultaneously, exhausting the available audio channels. +- Fixed monster missions' sonar marker being placed incorrectly if a monster ends up inside the sub, making it look as if the monster was far outside the level. This often made it look like the monster was moving away from the sub when trying to approach its position as it appeared on the sonar? +- Fixed bandolier (and other items that give bonuses when worn) giving bonuses when the item is held. +- Fixed mod texts being briefly misaligned when scrolling down the list of unpublished mods. +- Fixed light sprite rotation not getting refreshed when placing an attachable item on a wall when lighting has been disabled with console commands. +- Fixed supercapacitors showing 1% as the initial recharge rate because the recharge rate defaulted to 10. +- Fixed some ending options of the "good samaritan" outpost event not ending the event. +- Fixed random (non-mission) events disappearing from outposts when you save and quit. + +Modding: +- The tutorials are now implemented using the scripted event system, and are fully moddable. New tutorials can be implemented in xml or using the event editor, and the system could potentially be used for other types of content too (scripted "scenarios" perhaps?). +- Added DamageMultiplier and LaunchImpulse to Turret. LaunchImpulse is now defined on turrets instead of ammunition (total impulse is the sum of turret + ammunition). +- Added SnapRopeOnNewAttack property to Attacks: allows characters to switch attacks without snapping ropes from previous attacks. +- Added dividebylimbcount to Explosion, which determines whether the damage is spread out among limbs (if set to true). +- UpgradeCategories with no upgrades in them are hidden from the upgrade menu (i.e. if you modify the upgrades so some of the vanilla categories no longer contain any upgrades, those categories won't be shown). +- Added CheckTalentAction, which can be used in events to check whether a target has unlocked a specific talent. +- Changed how submarine upgrades are calculated: now no longer adds previous levels' cost to the price, but rather relies on higher increasehigh values. +- Made NPC personality traits a separate content type instead of defining them in the localization files. +- Fixed OnDeath status effects defined in afflictions not working. Did not affect any vanilla content. +- Fixed crash when controlling a character with more than 10 "Any" inventory slots. Did not affect any vanilla content. +- Fixed custom husk appendages' textures failing to load. +- Added new properties to StatusEffect's SpawnCharacter feature: Stun, AfflictionOnSpawn, AfflictionStrength, TransferControl, RemovePreviousCharacter, TransferBuffs, TransferAfflictions, TransferInventory. +- Fixed bots always choosing their "personality trait" from the first 6 even if more are modded in. +- Fixed affliction names and descriptions being empty if they're not available in the selected language or configured in the affliction .xml file directly. +- Fixed custom husk afflictions not always working properly, because the vanilla husk affliction was sometimes used instead of the custom husk affliction. +- Fixed ExtraLoad working the wrong way around on PowerTransfer components that generate/consume power (the extra load would supply power to the grid). Does not affect the vanilla game, because neither junction boxes or relays generate or consume power. +- Fixed crashing if Afflictions defined in an Attack can't be found. +- Fixed crashing if a Throwable has an OnActive StatusEffect that removes or kills the user. +- Fixed items/structures falling back to the description defined in the .xml even if it's empty, if the description is not defined for the selected language. Now descriptions fall back to English when not defined for the selected language. +- Fixed the "reloadwearables" and "loadwearable" console commands crashing the game when used outside the character editor. +- Fixed character editor crash if you first reload textures and then recreate the ragdoll. +- Fixed inability to localize item names if the name is defined directly in the item config. +- Allowed defining where mineral mission resources are spawned using the "positiontype" attribute. The supported types are "MainPath", "SidePath", "Cave", and "AbyssCave". +- Fixed console errors when trying to check int values with PropertyConditionals. +- Fixed melee weapon's StrikingPowerMultiplier only affecting the afflictions defined in the Attack, not the ones defined in the status effect. + +--------------------------------------------------------------------------------------------------------- +v0.18.15.2 (MacOS only) +--------------------------------------------------------------------------------------------------------- + +- Fixed crashes on MacOS 10.13 and 10.14. This seems to have happened because Microsoft quietly dropped support for these versions in .NET Core in late 2021, and we didn't realize until this hotfix when we deployed with a sufficiently new version of the technology. +- Fixed inability to use the voice chat on some MacOS versions, due to the game not having permissions to access the microphone as a result of the aforementioned .NET Core upgrade. + +--------------------------------------------------------------------------------------------------------- +v0.18.15.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed frequent crashing in the submarine editor. The crashes were caused by modifying multiple entities at the same time, such as by selecting an entity of the same type as the last entity that was edited. +- Fixed dragged objects becoming invisible if you bring the cursor over a UI element in the submarine editor. +- Fixed a bug that sometimes caused radio voice chat to be muffled. + +--------------------------------------------------------------------------------------------------------- +v0.18.15.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Show a warning when trying to switch to a submarine that's low on fuel or to a submarine that has no manually placed items to prevent softlocking the campaign if you switch to a sub that has no fuel. Whether a submarine is considered to have manually placed items can be set when saving it in the submarine editor (the checkbox "manually outfitted" in the saving dialog). +- Also show the low fuel warning when leaving an outpost without enough fuel. +- Handheld sonars can't detect minerals from inside the sub. +- Changed the plus and minus button in the campaign settings into arrows. The button on the right increases difficulty, which in the case of the starting balance and supplies means reducing them, making the plus and minus buttons misleading. +- Reduced costs of handheld weapon ammunition significantly. +- Up revolver & harpoon shop availability (especially at military outposts / armory merchants) +- Slightly reduced effectiveness of harpoons and revolver round to compensate for the cheaper / more available ammo. +- Changed recipes for Handcannon, Assault Rifle and Auto-Shotgun. Weapon crafting is more expensive, to compensate for cheaper ammo. +- Adjusted numerous other recipes and price costs of materials. Previously little used materials (like tin) are now used more. +- Partially reintroduced the "toggle inventory" keybind, now called "toggle entity list". Even though toggling the in-game inventory is no longer possible, the keybind can be used to change the hotkey for toggling the sub editor's entity list. + +Fixes: +- Fixed shuttles getting misplaced when switching and transferring items to a new sub with shuttles. +- Fixed inability to damage items (such as monster eggs) with melee weapons or handheld weapons. +- Fixed "failed to parse the string 'COLOR.GUI.GREEN' to Color" errors when using the submarine upgrade interface in Spanish. +- Fixed items with a projectile component (e.g. bullets, harpoons, syringes) going through external walls when dropped. +- Fixed incorrect value in the "too many lights" error message in the sub editor. +- Fixed lightcomponent not getting refreshed when flipping a lightcomponent horizontally. +- Fixed extra cargo defined in the server settings spawning every round in multiplayer campaign. +- Fixes wreck corpses' damage visuals (bloodstains, burns) not showing client-side. +- Fixed wearables that are worn (or held) in multiple limbs applying skill bonuses multiple times (e.g. when holding a bandolier with both hands). +- Fixed console error when deselecting all target types from a motion sensor in the sub editor. +- Fixed crashing when multi-editing motion sensor targets in the sub editor. +- Fixed one of the path unlock event texts still using the old price (talking about 12,000 mk even though the price is 4,000 mk). +- Fixed money getting incorrectly deducted on the client side when buying items from the vending machine. +- Fixed item transfer taking items from non-interactable containers. +- Made depleted fuel sprite darker to match the rest of the "depleted" items. +- Fixed PUCS's autoinjection feature sometimes causing performance drops in multiplayer. +- Fixed "tried to overwrite a submarine that's not in a local package" error when you delete a sub that's in a local package and try to resave it. +- Fixed misaligned broken duffelbag sprite. +- Fixed full-white x-ray monitors. +- Fixed FPS drop when adjusting character appearance in the campaign setup menu or server lobby. +- Fixed tunnels at the beginning or end of the level sometimes being too narrow to pass through (especially with a small sub) when there's no outpost at that side of the level. +- Fixed missing background sprite in duct block. +- Fixed water particles not showing up when water is flowing down a duct block. +- Fixed changing the scale of resizeable structures (such as background doors) messing up the outline of linked subs in the sub editor. +- Fixed non-player-team interactable items getting transferred on sub switch. +- Fixed ballast flora root emitting particles when damaged client-side, even if it's already been destroyed. +- Fixed recycle recipes for Piercing Ammunition Box and Pulse Tri-Laser Fuel Box. +- Fixed some lights (e.g. vending machines, neon lights, holographics displays) looking different in the sub editor than they do in-game. +- Fixed undocked shuttles remaining undocked if you save and start a new game with the same submarine during the same session. Restarting the game fixed the issue though. +- Fixed sonar markers going crazy if the start and end locations have the same name + added some more variety to location names to prevent duplicate location names. +- Fixed multiediting an ItemComponent modifying all the components of that type in all the selected items (e.g. when editing the 1st light component of a switch, all lights in all switches would be edited). +- Fixed melee weapons not damaging structures from outside. + +Modding: +- Fixed removing a door mid-round crashing the game. Does not affect the vanilla game, because doors are never removed mid-round. +- Fixed having a vending machine in your inventory crashing the game due to the 0-capacity input inventory of the machine. + +--------------------------------------------------------------------------------------------------------- +v0.18.12.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed medical doctor tutorial throwing an error and freezing in most languages other than English. +- Fixed occasional disconnects with the error "the given key was not present in the dictionary" when giving orders or reporting things in multiplayer. +- Fixed occasional crashes caused by AIObjectivePumpWater. +- Fixed certain looping item sounds (oxygen generators, vents, reactor) being too quiet to hear. +- Fixed one of texts not appearing in the "captive souls" event. +- Fixed inability to fabricate rubber shells. + +Modding: +- Fixed crashing when a MonsterEvent fails to find the character prefab. + +--------------------------------------------------------------------------------------------------------- +v0.18.11.0 +--------------------------------------------------------------------------------------------------------- + +Bugfixes: +- Disabled project-wide invariant globalization, which was meant to address "couldn't find a valid ICU package installed on the system" errors on some Linux distributions. The fix caused issues with case-insensitive comparisons and converting to upper or lower case in non-latin alphabets. +- Fixed tutorial characters spawning without a headset. +- Fixed inability to bind keys to LMB by clicking on the input box. + +--------------------------------------------------------------------------------------------------------- +v0.18.10.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed "index out of range" error when joining a server where's someone's rewired items. +- Fixed some mission messages being displayed as "missionmessage0.nameofthemission". + +--------------------------------------------------------------------------------------------------------- +v0.18.9.0 +--------------------------------------------------------------------------------------------------------- + +- Updated translations. +- Fixed crashing when a mod includes event sets that reference a non-existent event. +- Backwards compatibility: readded some mission events we'd removed since the previous update. + +--------------------------------------------------------------------------------------------------------- +v0.18.8.0 +--------------------------------------------------------------------------------------------------------- + +Balancing: +- Added some new campaign settings: starting balance, amount of starting items and difficulty. +- Cargo mission reward of construction materials has been reduced to be less balance-breaking. +- Revisited all item spawns. Drastically reduced and adjusted the spawns everywhere. Disabled some spawns in campaign. All the subs should now start with a bare minimum in the campaign. +- Reduced selling price to ~25% of base price to avoid getting too rich from looting too early/easily +- Increased effect of "Requested Goods" to be 2x to compensate for the decreased selling price. +- Alien artifacts and trinkets can still be sold for a high price at research stations. (2x modifier, to compensate for the reduced selling price) +- Removed batteries from Headset, to reduce the value of selling/deconstructing these. +- Duffelbag deteriorates over time when in use, and now is carried with both hands. +- All items now deconstruct into less materials than it takes to construct them. Avoiding infinite construction/deconstruction loops for easy skill leveling. +- (Temporarily?) Removed most hand-placed items from the vanilla subs to make balancing and debugging the auto item placement easier. +- Revisited crew corpse spawns. The id cards are no longer manually placed. The cards found from the crew now actually work. +- Minor adjustments to bandit loadouts. +- Changes to chaingun. Now fires 500 shots instead of 200 per ammo box, at the cost of DPS. +- Added shredder rounds for chaingun, as an option against armoured targets. +- Adjusted the armor penetration of all turrets. +- Made location evolution take a little longer, colonies cannot be formed closer than three steps to another colony. +- Made wreck missions a little more common. +- Adjustments to the preferred containers (= where things are spawned and where they should be placed). +- Changes to the existing missions and how they are distributed. Added new missions. +- Reduced the costs for unlocking the biomes. +- Adjustments to the monster spawns. +- Changes to the item "gating". Some items don't appear early in the game anymore. +- Adjustments to the mission specific variants of the monsters. +- Added a large Crawler variant for some missions (removed the Swarmcrawler that was used for crawler missions). +- Halved Mudraptors' priority for eating dead bodies. +- Reduce nausea chance of energy drink to 25%. +- Changes to the campaign progression in general. +- Changes to the level generation parameters, especially in Cold Caverns and the Ridge. +- Changes to the level resources distribution. +- Changes to the event manager settings (that affect the monster spawns). +- Adjusted and normalized the item loadouts for all the jobs. + +Chat improvements: +- Chat mode (radio/local) can be toggled using a dropdown next to the chat box or with a dedicated "ToggleChatMode" keybind (R by default). +- Voice chat now has only one push-to-talk keybind (V by default) which respects the selected chat mode. +- There's now a dedicated "ActiveChat" keybind (T by default) to open the chat using the currently active chat mode. +- If you want to keep the chat keybinds the way they were (separate keybinds for local and radio), you can rebind the "Chat" and "RadioChat" inputs back to T and R and the new "ToggleChatMode" and "ActiveChat" inputs to something else. + +Changes and additions: +- Added damage overlays to characters (characters who've taken damage look damaged). +- Added two new beacon stations. +- Added a bunch of new UI sounds (tickbox toggling, confirming transactions, increase/decrease sounds for number inputs, cart sound for adding/removing items in store interfaces, selecting/clicking components, sliders and modlist). +- Added UI volume slider. +- Show a verification prompt if an automated circuit tries to make the submarine undock from or dock with an outpost. Prevents campaign getting softlocked if someone rewires the docking port in a way that makes it dock/undock immediately at the start of around. +- Color subs in the sub editor's list to indicate whether they're vanilla, workshop or local subs, added a tooltip that explains why some of them cannot be deleted through the editor. +- ID cards can now be purchased from outposts. The card gets assigned the appropriate tags for the character doing the purchase. +- Clients need to wait 1 minute if their vote gets rejected before they can start another vote of the same type. +- Increased the priority of explosion particles to make it less likely for them to not appear when the particle limit has been reached. +- Made matriarch genes slowly heal bleeding (not just afflictions of the type "damage") to get it to be more in line with the description. +- Adjusted small water flow sounds: lower max volume, lerp volume according to the water flow (-> small leaks are much more quiet). +- Added energy drinks and protein bars to vending machines. +- Reduced Winterhalter engine power drain (from 6000 total to 4250). +- Decorative level objects (plants and whatnot) can spawn on outpost walls. +- Adjustments on the particle effects of chaingun and coilgun. +- Added non-lethal rubber bullets for riot shotgun. +- Added a server setting to change if the looted money goes to the player or to the bank. +- Improved tooltips in the wallet menu to make their function more clear. +- Corpses can now be grabbed in singleplayer to loot money. +- Made the crew wallet menu update when the players permissions change. +- Prevented selling items from submarine containers tagged with "dontsellitems", instead of "donttakeitems". +- Removed merchant balance effect on item prices. +- Replaced "item sell value" with the location reputation effect on the store interface. +- Hide AppData path from tooltips in the sub editor to prevent exposing the user's name. +- Made the descriptions of some materials (that used to just say "useful for crafting") more descriptive. +- Increased oxygen generator output in some vanilla subs. +- Made handheld sonar beacon sound less grating. +- The client who initiated a vote cannot take part in that vote (except if they're the only client who can vote, in which case the vote automatically passes). +- Made flashlight flicker before the battery runs out. +- Added some lootable money to corpses found in wrecks. +- Removed the small equipment indicators next to the character portrait. +- Weapon holders now use the tag "mountableweapon" instead of "weapon" to determine which items can be placed in them. Allows tagging non-weapon items as mountable in the holder, without making bots consider it a weapon due to the "weapon" tag. Also allows to keep some weapons not-mountable. +- Ammunition Shelf can now also store Depth Charges ("depthchargeammo" tag added) +- Doors and hatches can now be mirrored in the sub editor (making them open from top to bottom, or from right to left). +- Depth charges can be stored in coilgun ammo shelves. +- Adding preview images to wrecks, beacon stations, outposts or enemy subs isn't allowed in the sub editor (unnecessarily bloats up their file size, as the preview images aren't visible anywhere). + +Performance: +- Improved the performance statistics view that's enabled with the "showperf" console command: more fine-grained stats and easier-to-read visuals. +- Optimized AI pathfinding when they're trying to find a safe hull. Particularly noticeable in colonies when the NPCs are fleeing from something. +- Optimized character status effects (e.g. health regen and other constant damage reductions). +- Optimized watcher's acid clouds. +- Optimized loading submarines. Reduces loading times especially when there's lots of items in the sub. +- Lighting optimization: now some unimportant (dim and small) lights are hidden when there's lots of light sources visible on the screen at the same time. The maximum number of visible lights can be adjusted in the game settings. +- Lighting optimization: the number of light recalculations per frame is limited, meaning that when there's lots of moving, shadow-casting lights visible, the game doesn't try to recalculate the shadows all at the same time. +- Lighting optimization: simplify the light rendering when zoomed very far out (e.g. when looking through a periscope). +- Optimized status effects that modify items' conditions every frame (for example, oxygen tank shelves that fill up oxygen tanks). +- Optimized many status effects by making them only execute once per second instead of every frame (most importantly, diving suits and volatile fuel rods). +- Optimized talents: buffs are applied to characters periodically instead of every frame. +- Optimized the logic that bots use to determine the safety of hulls. +- Optimized items: stop updating items that don't need to be updated more aggressively. +- Optimized bot AIs: in particular, the cleanup, repair, pump water and load items objectives. Should significantly improve performance when the bots are doing these objectives when there's a large number of items in the sub. +- Optimized entity culling logic (determines which items/structures are currently visible in the screen). +- Optimized a bunch of textures. + +Fixes: +- Fixed server not refreshing the power grid when a client disconnects and reconnects a power wire. +- Fixed hull updates not being sent if the water/oxygen/fire in the hull doesn't change server-side, preventing the hull's status from getting corrected if a client somehow ends up out of sync. +- Fixed ballast flora sometimes becoming unkillable in multiplayer. +- Attempt to fix tab menu crew list sometimes getting stuck to a broken state at the beginning of a round. +- Fixed inability to access the character tab in the tab menu when dead (preventing you from creating a new character). +- Fixed occasional "hash calculation for content package xxxx didn't match expected hash" errors when updating/enabling certain mods. +- Fixed preview sometimes breaking in the character customization menu when switching the hair or accessories on Linux or Mac. +- Fixed fonts not getting rescaled when changing resolution. +- Fixed misplaced hull in the beacon stations. +- Fixed ability to pick up items and take items from other characters when controlling a character whose inventory is inaccessible while alive. +- Fixed message box about a too large preview image not being shown when trying to publish one in the Workshop (instead throwing the generic "publishing failed" error). +- Fixed Venture airlock (missing button, inner door wiring). +- Fixed level floor not being visible on the sonar. +- Fixed bots being unable to shoot with a turret whose line of sight is blocked by another turret (even though the projectiles can go through the turret). +- Fixed switching a sub making its preview image disappear from the submarine switch menu. +- Fixed an issue where the client was adding mission rewards into the bank on their screen causing desync. +- Fixed item assemblies still getting misaligned when saving. +- Fixed crashing when there's no audio device available (no speakers/headset connected) and a character enters water. +- Fixed crashing when trying to save an item assembly with a space at the end of the name. +- Fixed crashing when a character tries to operate a turret from outside the sub. +- Fixed submarine name being set to a truncated value in the submarine save dialog if the submarine name text at the top of the screen gets truncated, leading to a crash if you try to save the sub with that name. +- Fixed devices whose power consumption is set to 0 not working when not connected to a grid. +- Fixed outpost NPCs choosing the item to spawn for the device they're operating randomly, occasionally causing them to for example load reactors with volatile rods. +- Clients replicate sending chat messages to wifi components in mp. Fixes radio-linked wifi components not receiving the signals client-side. +- Fixed tab menu staying open during loading screens. +- Signal components' and terminals' sprites don't mirror horizontally in mirrored subs (what's a DNA, RO, ROX or XEGER component??). +- Fixed inability to rewire any docking ports in outpost levels, even if the port is not docked with anything (should only apply to the port docked with the outpost). +- Fixed "Ignore This" orders being wiped when loading an existing multiplayer campaign save. +- Fixed abyss area being very small in the Aphotic Plateau, preventing the abyss monster from reaching you if you go deep enough. +- Fixed status monitor displaying small amounts of water as 1% even though water detectors output 0%. +- Fixed autopilot conflicting with VELOCITY_IN inputs (now signals override the autopilot for 1 second). +- Fixed ConversationAction getting interrupted when opening an input-blocking menu in single player. +- Fixed sprite bleed in chaingun ammunition boxes. +- Fixed appearance of specific named NPCs being inconsistent (e.g. Captain Hognose sometimes being a woman or not having an eyepatch). +- Fixed certain scripted events getting stuck if you switch characters in single player (e.g. the events that require you to interact with fliers on the wall). +- Fixed crashing when the source of a rope is removed (e.g. when a latcher despawns while latched on to the sub). +- Fixed votes always going through if no-one votes. +- Fixed energy drink giving x10 more haste when used via the health interface. +- Fixed the monster spawns for the new game plus not working (currently a placeholder set). +- Fixed monsters spawning from missions not avoiding the engines. +- Split campaign state networking messages into multiple ones. Previously all the campaign-related data (map state, reputation, upgrades, purchased items, selected missions) was included in the same message, and whenever anything in the data changed, the server would send all of it to clients. This would cause performance and bandwidth issues in some situations, for example when reputation was changing rapidly. +- Fixed some pumps in Kastrull working without power. +- Fixed quick-reloading working incorrectly when trying to reload from a stack that doesn't fully fit in the weapon (e.g. when double clicking on a full stack of revolver rounds with a half-loaded revolver in hand). +- Fixed inability to quick-reload weapons with more than 1 inventory slot (e.g. autoshotgun). +- Fixed outpost NPCs having x3 more health than they should. +- Fixed morbusine not killing NPCs with higher-than-default health. +- Fixed graphics errors when using Razer Cortex overlay. +- Fixed bots being unable to repair Winterhalter's top hatch. +- Fixed server crashing if you disable all mission types and try to start a mission round. +- Fixed Chinese/Japanese/Korean text not wrapping properly on terminals. +- Fixed bots sometimes walking towards a wall or holding the ladders when they are idling. +- Fixed "main docking port" property not being taken into account when placing outposts (= the outpost was placed with the assumption that the docking port closest to the sub's center is the main docking port). Sometimes caused the outpost to be placed too close to the level walls, preventing the sub from docking with it. +- Fixed ladders not being visible in the sub preview. +- Fixed some UI elements being too large when switching from a large resolution to a smaller one, or vice versa. +- Fixed weapon holder sprite depth. +- Fixed level editor's test mode generating a different level than the editor itself. +- Fixed ballast flora branches that have been disconnected from the root not being considered disconnected after a level transition (allowing them to keep growing). +- Fixed "set default bindings" not doing anything in the settings menu. +- Fixed door/hatch gaps not getting moved when snapping to grid in the sub editor. +- Vertically mirrored beds can't be laid on. +- Fixed wrecked reactors being forced to non-interactable even if made interactable in the sub editor. +- Fixed keybinds shown in the controls tab not refreshing when resetting the binds. +- Hopefully fixed colonies sometimes not including some modules (most often the armory module). +- Fixed ready checks sometimes ending at a slightly different time client-side compared to the server, allowing you to answer the prompt even though the time to answer already ended server-side. +- Fixed large terminal welcome messages going slightly outside the bounds of the listbox. +- Fixed overlapping in the tab menu's mission tab when there's more than one mission selected. +- Fixed fabricators and deconstructors playing the sounds even if they're out of power. +- Fixed occasional "hash mismatch for downloaded mod" errors on Linux. +- Fixed clients occasionally spawning as the old character after they've opted to create a new one. Only happened if the client hadn't died and was still controlling the old character at the end of the round. +- When a client creates a character with a new name, the client's name is changed to match it after they spawn as that character. +- Fixed enabled mods getting disabled when updating them in the mods menu. +- Fixed a rounding error in Sprite.DrawTiled that sometimes caused an extra 1-pixel line on some scaled and flipped structures (e.g. certain wall pieces scaled to 0.6). +- Fixed Orca 2 still using the old chaingun charge time. + +Modding: +- Added "mod lists" which can be used to enable/disable sets of mods more easily. +- Option to choose which local mod(s) to add a submarine to when saving one in the submarine editor. +- Mods can be unsubscribed from by right-clicking on them in the mod list, and it's possible to unsubscribe from multiple ones at the same time by using ctrl+click or shift+click to select more than one. +- Local mods can be merged in the mod list by selecting the ones you want to merge and selecting "merge all selected" from the right-click context menu. +- Better filtering in the mod list: option to only show local mods, Workshop mods, published mods, submarines and/or item assemblies. +- Added "SameInventory" spawn position type to status effects (allows spawning items in the same inventory the entity applying the effect is in). +- Added support for multiple light components in wearables. +- Fixed permanent stats given by talents not getting synced to clients in multiplayer (doesn't affect any vanilla talents). +- Fixed nullref exception when trying to trigger a location type change to a type that doesn't exist (doesn't happen in the vanilla game). +- Added an extra tag to the "canned heat" talent to make it easier to add custom upgradeable tanks that aren't compatible with vanilla tools. +- Option to make status effects drop the items contained inside the target item (usage example in the duffel bag). +- Level object, cave and mineral commonness can be defined based on the biome instead of the level generation parameters (= no need to define commonness for "coldcavernsbasic", "coldcavernsmaze" etc separately). +- Option to define ConversationAction texts directly in the event xml (instead of having to always define them in a spearate text file). +- Extended CustomInterface functionality with NumberInput elements that allow using float values ("numbertype") and defining the increment size ("step") the number of decimal places ("decimalplaces"). (Thanks, mLuby!) +- Implemented element for removing all the child elements of an element in a variant file. +- TriggerComponent now supports negative forces: negative force value will cause the it to pull triggerers towards it. +- Multiple TriggerComponent properties can now be modified through signals and CustomInterface components. + + +--------------------------------------------------------------------------------------------------------- +v0.17.16.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Added some tutorial information to the data sent to GameAnalytics. + +Fixes: +- Fixed an exploit that allowed modified clients to execute console commands server-side without the appropriate permissions. +- Fixed NPCs spawning without any items when the system language is set to Turkish. + +--------------------------------------------------------------------------------------------------------- +v0.17.15.0 +--------------------------------------------------------------------------------------------------------- + +Fixes: +- Fixed crashing if a custom language doesn't configure NPC personality traits or conversations. +- Fixed crashing when you try to disguise as someone else when using a mod that overrides the vanilla human config. +- Fixed characters getting instakilled if you dive too deep in the sub editor test mode. + +--------------------------------------------------------------------------------------------------------- +v0.17.14.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Display both wallet and bank balance on campaign interfaces when the player has access to the bank funds. + +Fixes: +- Hopefully fixed the frequent "SteamP2P connection timed out" errors during loading screens. +- Fixed "missing entity" error when a character who's stats have been modified by a talent gets removed (e.g. eaten by a monster, despawning). +- If starting a multiplayer round takes a long time, instead of throwing the "did not receive STARTGAMEFINALIZE message" error, you're asked whether you want to keep waiting or return to the lobby. +- Fixed "failed to parse the string 'COLOR.GUI.GREEN' to Color" errors when using the submarine upgrade interface in Spanish. +- Fixed junction boxes not deteriorating over time. +- Fixed turrets being able to fire without consuming power when the power is wired to some other connection than power_in. +- Fixed broken supercapacitors providing unlimited power to turrets. +- Fixed IsMale/IsFemale properties resetting when saving and reloading (not used by the vanilla game). +- Fixed haloperidol not healing psychosis. +- Fixed ballast flora sometimes becoming unkillable client-side when entering a new level. +- Fixed the Server Log button overlapping campaign interfaces by hiding it whenever a campaign interface is open. +- Fixed an inconsistency in the assault rifle mag recipe. +- Fixed job not showing up in ID card description. +- Fixed store interface not being updated when the player balance changes. + +--------------------------------------------------------------------------------------------------------- +v0.17.13.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Players who are allowed to manage money in the multiplayer campaign can use money directly from the bank without having to transfer it to their wallet first. +- Managing money always requires permissions: unlike other campaign-related permissions, not having anyone with permissions on the server doesn't give everyone permissions. + +Fixes: +- Fixed deconstructors, fabricators and research stations not being powered in some colony modules. +- Fixed power connections not getting recalculated server-side when disconnecting and reconnecting a wire. +- Fixed client context menu not working in the tab menu if the client's not controlling a character. +- Fixed preview image disappearing when saving a sub. +- Fixed custom jobid tags not working on ID cards. +- Fixed crashing with the error "Coroutine Barotrauma.SinglePlayerCampaign+d__16 threw an exception" when trying to give items to a human prefab instance that has no item sets configured. +- Fixed installed mods list not refreshing when uninstalling an unsubscribed mod. +- Fixed outpost reactors using mechanical skill for repairs instead of electrical. +- Fixed outdated Dugong preview image. +- Fixed Deadeye Carbine firing an inconsistent number of rounds per burst in multiplayer. +- Fixed crashing when launching the server with a fresh config file due to the language being set to None. +- Fixed crashing on startup if the workshop mod directory doesn't exist. +- Fixed "Canned Heat" not having an effect on oxygenite tanks. +- Fixed entity list's search results being in a random order in the sub editor. +- Fixed crashing when trying to view an item assembly that contains entities that can't be found in the sub editor. +- Fixed bots not taking medical items' negative effects into account when determining which meds to use, often leading to overdoses/suffocation when using opiates. +- Fixed bots trying to clean up items into deconstructors. +- Fixed clients failing to spawn items with console commands when there's a structure prefab with the same identifier (e.g. ladders). +- Fixed characters being unable to gain skills added by a mod if the job doesn't initially have those skills defined. +- Automatically correct linked submarine paths in the submarine editor. +- Fixed electrical discharge coils sometimes working with insufficient power. +- Fixed crashing when creating a humanoid character in character editor. +- Fixed cargo missions putting cargo in non-interactable and hidden-in-game containers. +- Fixed only the first Powered component being considered when determining how much power an item is supplying to the grid. Prevented alien generators from working. +- Fixed textbox's text position breaking when there's overflow and you're editing in the middle of the string. + +--------------------------------------------------------------------------------------------------------- +v0.17.12.0 +--------------------------------------------------------------------------------------------------------- + +- Updated translations. + +--------------------------------------------------------------------------------------------------------- +v0.17.11.0 +--------------------------------------------------------------------------------------------------------- + +Fixes: +- Fixed occasional crash when talking to an outpost merchant. +- Fixed cargo missions putting cargo in non-interactable and hidden-in-game containers. +- Don't show wallet info on character portrait in other multiplayer game modes than the campaign. +- Fixed certainstructure names not showing up properly in the submarine editor in languages other than English. +- Fixed relays that have "can be overloaded" set to true breaking when overloaded (should never happen because relays can't be repaired). +- Fixed occasional mission mismatch errors in multiplayer when there's a hunting grounds or beacon mission in the level. + +--------------------------------------------------------------------------------------------------------- +v0.17.10.0 +--------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Overhauled colonies: completely new modules, improved layouts, new structures and items, new events. +- Split outposts stores into several different vendors who sell different types of items. +- New store (and sub editor) categories: weapon, medical, diving, and fuel. Reorganized the items into categories. +- Adjusted the amount of colonies in Cold Caverns. +- Added personal wallets. Everyone in the crew now has their personal wallet that they can use to purchase whatever they wish in outposts. The host (or people with campaign management permissions) can distribute a portion of the mission rewards to the crew or transfer money from the shared funds to the players. +- Reworked campaign permissions: removed BuyItems and CampaignStore permissions (no longer needed, since everyone can buy), added ManageMap and ManageHires permissions, ManageCampaign allows gives you all the other campaign-related permissions. +- Items can be purchased from outpost vending machines using the personal wallet. +- Reworked the power distribution logic. Should fix unstability and inconsistencies in power grids involving relays and batteries. +- Adjustments to reactors and supercapacitors to prevent the increased supercapacitor loads from crippling the subs on default recharge rates: slightly increased Humpback reactor output and decreased the default recharge rate of the capacitors, reduced recharge rates in the 3 new subs and set the supercapacitor efficiency to match the rest of the subs. +- Ballast flora improvements: improved damage visuals, branches die when cut from the root, the flora regenerates health at a rate relative to it's size. +- Made text displays and terminals craftable/attachable/detachable. +- Made Concat component's separator field editable mid-round. +- Made Deadeye Carbine fire in bursts. +- Animation adjustment: The head now rotates towards the mouse cursor while aiming or swimming. +- Swim animation adjustment: The body now rotates towards the aim target also when the character is moving, and not only while staying still. Moving while not facing the movement direction results in reduced movement speed. +- Set the bottom hole probability to 0 in Cold Caverns, which reduces the size and the frequency of holes in the level bottom. +- Characters spawn at a spawnpoint appopriate for their job when using the console command "spawn [job] inside". +- Added "low_oxygen" output to oxygen detectors. +- Beacon missions can spawn other types of monsters than just crawlers. +- Made supercapacitors take some damage when they're being charged faster than 70%. +- Increased Orca 2's reactor output. +- Adjustments to mission distribution: only easy missions at the beginning of the campaign, moved some of the more difficult missions later into the campaign. +- Made Not Component's ContinuousOutput property editable in-game. +- Show warnings when saving a sub in the sub editor if any of the entity counts (walls, items, lights, etc) are very high, don't allow saving if the light counts are above the upper limits. +- Added "power_value_out" and "load_value_out" connections to relays, batteries and supercapacitors. +- Boosted the structure damage from the small crawler eggs from 150 to 200. +- Adjusted structure and item damage for coilgun ammunition: piercing 50% less damage, exploding 100% more damage (from explosions), physicorium 50% more damage. +- Don't populate the abyss in difficulty levels 0 to 10 in single mission mode. +- Modified Selkie emergency hatch: can only use it if the shuttle is flooded. +- Reduce the probability for the coilgun to dismember limbs (or break armor). +- Removed submarine download confirmation prompt. All subs that are required to play in a server will be downloaded automatically, which shouldn't be a problem since they're only stored temporarily. +- Buffed ethanol's and tobacco's effects. +- Renamed "details" to "manage" and "permissions" to "rank" in the client management context menu to make them a little more clear. +- Changes to character aiming behavior. +- Water no longer dirties up walls. +- Disabled store category buttons for categories that contain no items. + +Modding: +- An extensive rewrite of how the game handles content packages and loading content. Addresses a ton of issues, inconsistencies and usability issues regarding modding. +- The Mods folder has been replaced by folders called "WorkshopMods" and "LocalMods". "WorkshopMods" is used to store mods installed from the Workshop, and any mods stored in it should never need to be modified manually. "LocalMods" is used for developing mods: installing/updating mods never modifies the contents of this folder to prevent any work from being lost. +- Submarines are no longer saved in the Submarines folder, because it made it easy to get vanilla and custom subs mixed up. The sub editor now automatically creates a new local mod for each saved submarine. +- Remade the Workshop menu and made it a tab of the settings menu. +- More robust handling of mod load order, overrides and variants. +- Clients now download the mods a server is using directly from the server, fixing content mismatches when for example trying to join a server that uses outdated mods. +- Mods now have version numbers to make it easier to determine which of the players are out of date. +- The Workshop preview images are no longer saved into the game folder, fixing the folder gradually growing in size as you use browse mods in the Workshop menu. +- Switching languages no longer requires restarting the game. +- Music can be overridden by identifiers. +- Reimplemented ServerExecutable to be usable in non-core packages. Now, players must select a server executable from a dropdown in the "Host server" menu if multiple are available. +- Character gender and ethnicity are no longer hard-coded: modders can use any kind of arbitrary tags to categorize character sprites.- Option to set the condition of an item spawned with status effects. +- Added new "accessiblebyowner" property to inventories. Allows making a character able to access their inventory even when "accessiblewhenalive" is false. +- Fixed clients not gaining control of the final stage of a husk affliction when "controlhusk" is enabled. +- When using a mod that doesn't set the InitialCount of any job, choose the first 3 jobs as the starting crew. Otherwise the crew customization menu will be empty and starting the campaign will lead to an immediate game over. +- Made it possible for attack StatusEffects to target the character doing the attack instead of the limb by using "Parent" as the target type. +- Using RemoveCharacter on a limb removes the character that limb belongs to. +- Fixed editing human character in the character editor sometimes making the inventory inaccessible. +- Fixed character editor crashing when trying to copy a character (unstable only). +- ItemContainers apply the OnContaining effects even when the item is broken. Doesn't affect any vanilla items. +- Ropes attached to limbs now automatically snap when another attack is chosen. +- Ropes can now be set to break from the end instead of always breaking from the middle (see the new abyss monster for an example). +- Ropes can be set to break if they are in too steep angle to the target. +- Projectiles always stick permanently unless a stick duration is defined. +- Characters (with deformable sprites) can be set to be drawn after (on top of) other characters. Normally characters are drawn in the order of spawning. +- AI Triggers can now be permanent. +- Added a generic damage threshold that currently defines how much damage the character needs to take from a single hit to hit the avoiding and releasing captured targets. +- Added a support for multiple identifiers and types in the limb health definitions. +- Added a support for min range for ranged attacks. +- Fixed monsters not being able to shoot faster than every ~1.5 second if they change the attacking limb. +- Added new after attack behaviors: Reverse and ReverseUntilCanAttack. +- Fixed "targetcontaineditem" still not working correctly. +- Fixed crashing when trying to remove fog of war at the very edges of the campaign map. Doesn't affect the vanilla game because there's enough padding at the edges of the map. +- Made DockingPort.ApplyEffectsOnDocking editable in the sub editor. +- Option to make missions force a ruin in the level if there isn't one. +- Character editor: don't check the validity of the texture path when copying humans (because the path is not valid and will be parsed later). Allows creating custom human characters by copying the vanilla human (even though they are not fully supported). +- Level editor no longer attempts to save the vanilla content. + +Monsters: +- Added Latcher, a new abyss monster. +- Added a difficulty hierarchy for the abyss monsters. Easier monsters should spawn more frequently on an easier difficulty level, the harder should spawn more frequently on higher difficulty levels. Currently the new abyss monster is defined as the easiest, and Endworm the hardest. Charybdis is in between. +- Revisited endworm: the armor now breaks less easily, reduced the change of cutting the worm towards the head, adjusted the bleeding speed. +- Adjusted abyss resource spawning: less resources per level, the number of resources is relative to the difficulty, the spawned resources aren't guaranteed to always be the 5 least common alien materials. +- Made molochs, abyss monsters and fractal guardians immune to poisons. +- Fixed monsters sometimes trying to follow targets after losing the track of them even when they should be falling back from them (according to the after attack behavior). +- Fixed monsters sometimes using the after attack behavior of the current attack even when the cooldown of that attack is not active. +- Fixed monsters sometimes being unable to target the submarine, because their attack was incorrectly considered invalid. +- Fixed fractal guardians fleeing to a shelter immediatedly after taking some damage when they have targeted the guardian pod once and have not changed the target yet (e.g. if you shoot a guardian that is returning from the pod and if it has not yet spotted you). +- Adjusted the probabilities for spawning the Thalamus in the wrecks. +- Rebalanced mudraptors: slightly more health, less damage at head. +- Crawler: adjusted the vitality multipliers of hands and tail from 50% to 75%. +- Fixed Giant Spineling targeting doors after being attacked, which it shouldn't do by design. Might affect other creatures too. +- Fixed calyxanide not damaging the "naturally spawning" husks. +- Giant Spineling doesn't flee anymore when being shot with coilgun, chaingun, or small arms. +- Adjusted the kill hammerhead missions. + +Balance: +- Increased the price of calyxanide to make it more in line with the price of husk eggs. +- Fixed wrecked supply cabinets being treated as normal supply cabinets. Reduces the amount of loot spawned in them. +- Adjust the medical item spawns in wreck and abandoned med cabinets: less powerful medicines. Basic ingredients and consumables are more common, but come in low quantities. +- Increased the amount of scrap in wrecks. +- Increased Gene Splicer's price from 200 to 500. +- Increase the commonness of Esperite and Galena, which are sources of lead. + +AI: +- Fixed bots accidentally shooting with a weapon if they have it equipped when they try to use the underwater scooter. +- Fixed bots still sometimes getting stuck when trying to get something from or put something to secure lockers. +- Fixed bots acting weird while trying to use underwater scooters inside. +- Fixed bots failing to heal characters in a docked sub/shuttle. +- Adjusted bot behavior around ballast flora: priority of some objectives now drops to 0 when the target's been claimed by ballast flora, items claimed by ballast flora aren't valid targets for some objectives anymore. +- Made bot healing dialog reflect if CPR was performed or not. +- Fixed security from the player's own crew attacking the player in multiplayer when the player attacks someone in an outpost. +- Fix bots not ignoring items marked to be "Hidden In Game". +- Bots prefer not to take diving suits off in rooms marged with the "IsWetRoom" flag. +- Docking ports are now automatically considered as "wet rooms". +- Fixed bots trying to target through doors and walls even though there's no line of sight between the end node and the target. +- Added some dialogue to bots when they get infected with the husk infection. +- Fixed bots sometimes getting stuck to doors when they are trying to fix a hull behind it. Happened because the goto objective was completed before the bot could open the door. +- Attempt to fix a crash in AIObjectiveExtinguishFire. +- Fixed bots not being able to repair leaks between rooms (leaks that are not in the outer walls). +- Waypoint fixes on abandoned outpost modules, some regular outpost modules, and Winterhalter. +- Fixed bots occasionally getting stuck while climbing ladders connecting outpost modules. +- Fixes to waypoint generator, mainly on stairs. +- Fixed a null reference exception when a bot is dismissed while being told to follow the player and still in the combat state. +- Fixed items flagged as "HiddenInGame" being considered interactable and therefore e.g. valid repair targets. +- Fixed outpost guards not arresting the offender when it's very far from them. +- Fixed bots sometimes failing to navigate back to the sub (when they are on the other side of the sub than where the hatch is). + +Talents: +- Fix to yet another issue that sometimes prevented unlocking additional talents after unlocking "All-seeing Eye". +- Fixed "Curiosity" talent not giving experience to allies. +- Removing or changing order priority doesn't trigger the "Commander" talent buff. +- Fixed "Mass Production" talent allowing you to power devices by tinkering. +- Fixed "Pyromaniac" giving 39.9% damage resistance instead of 40%. +- Fixed ability to tinker indefinitely by interrupting the tinkering by switching to repairing the item. +- Fixed "Trusted Captain" and "Esteemed Captain" giving medals even when no missions have been completed. +- Fixed disconnected players preventing talents that require everyone to survive from working (e.g. "Field Medic", "Bootcamp"). +- Fixed "Deep Sea Slayer" always giving you a 50% buff to harpoons regardless if you're inside or not. +- Fixed "Deep Sea Slayer" talent not affecting explosive harpoons. + +Fixes: +- Fixed monsters being able to attack with practically no cooldown when they're taking constant damage from a player. +- Fixed crawler eggs not being displayed on the sonar. +- Fixed aiming being slightly off when crouching and not moving. +- Fixed item interfaces getting misaligned when there's several linked item UIs visible at the same time. +- Fixed inability to interact with doors/hatches through docking ports. +- Fixed escort missions failing if the escorted characters are in a shuttle docked to the main sub. +- Fixed pumps rounding the pumping rate value to -39 instead of -40. +- Fixed shell shields dropping from moloch's inventories when they spawn (because they could only be placed in hand slots which the molochs don't have). +- Fixed linked subs not being taken into account in the cargo capacity displayed in the sub's info panel. +- Fixed ID card descriptions disappearing between rounds. +- Fixed ID card description not being added if the ID card tags are empty. +- Fixed "error" text in the medical clinic UI when trying to heal a character who's disconnected. +- Fixed texts overlapping on health scanner hud when using a text scale above 100%. +- Fixed "snap to grid" not working on structures. +- Update items' hulls after creating the hulls between docking ports. Fixes e.g. water detectors between docking ports still thinking they're outside after the ports lock and the area between them drains. +- Fixed decorative sprites rotating incorrectly on vertically mirrored items. +- Disable collisions between subs when "locking" the docking ports between them. Fixes the ports leaving a gap between them if some structures of the sub prevent them from aligning exactly. +- Fixed wifi components ignoring signals to the "signal_in" connection if the signal originated from another wifi component that can't transmit to this one (i.e. if a wifi component passes a signal through a wire to another wifi component that uses a different channel). +- Fixed dropped signal components being drawn behind devices (now they're only drawn behind devices when attached to a wall). +- Fixed SMGs autofilled into the subs sometimes spawning without magazines. +- Fixed misaligned "Label Number 6" decal. +- Attempt to fix occasional performance drops in the store interface. +- Fixed clients seeing a blank server lobby if they join when a round is running with respawning disabled. +- Fixed arithmetic and trigonometric components not passing the sender of the signal forwards, preventing e.g. helm skill from boosting engines if the signal goes through a component. +- Fixed occasional crashes when transitioning between levels with showperf enabled in multiplayer campaign. +- Fixed wearables not affecting movement speed when godmode is on. +- Fixes periscopes not focusing on turrets if there's certain components (e.g. arithmetic components) between them. +- Fixed crashing when trying to use the "dumpeventtexts" command with no arguments or a disallowed path. +- Made smoke detectors a little more sensitive (should fix small fires sometimes not being detected even if they're in the same room). +- Fixed reactor sometimes not catching fire again if you start overheating it again immediately after a fire. +- Fixed recycling a non-empty SMG magazine dropping the bullet inside it on the floor. +- Fixed EntitySpawnerComponent's SpawnAreaOffset.Y being inverted. +- Fixed gaps generating incorrectly on "Shell A 70 Degrees". +- Fixed items powered by battery cells not working correctly (certain devices like handheld sonar beacons never powering up, and items staying powered indefinitely when you put in a battery and take it out). Unstable only. +- Fixed turret lights starting in an incorrect rotation in the sub editor. +- Fixed "commander" talent still not correctly giving the buff (giving orders that a character already had didn't move the buff). Unstable only. +- Fixed nav terminals sometimes determining which docking port the docking button controls incorrectly (specifically, when the correct docking port is also connected to other ports). +- Fixed an exploit in the depleted fuel SMG magazine recipe. +- Fixed reactor gauges' background sticking out from the gauges when selecting a reactor in the editor. +- Fixed fractal guardians fleeing to the shelter immediatedly after taking some damage when they have targeted the guardian pod once and have not changed the target yet (e.g. if you shoot a guardian that is returning from the pod and if it has not yet spotted you). +- Fixed Crawler Broodmother regenerating really fast while eating. Broodmother no longer eats her own eggs. +- Fixed spinelings accidentally killing each other with their spikes. +- Fixed burn being ignored in the damagemodifier of Charybdis' head. The jaw worked correctly. Affects pulse laser damage for example. +- Fixed lights that are drawn behind subs counting as shadow-casting in the sub editor. +- Fixed server host creating 2 disconnect message boxes if the server crashes. +- Fixed text scale not being taken into account on scrolling text displays. +- Re-filled Typhon 2 oxygen tank shelves. +- Fixed spawnpoint editing panel being too small on large resolutions. +- Fixed inability to equip one-handed items when there's a suitable container in the other hand (e.g. flashlight when there's a storage container in the other hand). +- Cargo missions don't require the cargo to be inside a hull: being in the sub is enough. Fixes inability to complete cargo missions with unconventional subs where the cargo is stored outside hulls. +- Fixed non-equipped items that can't be put into a duffel bag disappearing when a character despawns. +- Fixed incorrect animation parameters being used for swimming while wearing a regular diving suit. +- Fixed projectiles sometimes staying attached to the target even when they are far from it. +- Fixed multiplayer campaign saves with semicolons or pipes in their name causing "path to a save file was empty" errors in the server lobby. +- Fixed performance drops in multiplayer when someone attacks the outpost NPCs and causes the reputation to drop. +- Moved the showperf view to the right to prevent it from overlapping with the crew list. +- Fixed status monitor's electrical view and item finder not showing items in docked subs. +- The sound of crowbaring a door open can't be heard from other subs. +- Fixed "a gaze into the abyss" achievement working unreliably. The achievement didn't unlock until you returned to 50% of the crush depth, which isn't possible in some levels (e.g. if the level starts at 3500 m and crush depth at 5000 m). Now it's unlocked if you get to 500 m above the crush depth or to the end of the level. +- Fixed certain achievements (last man standing, lone sailor, finishing a round with a specific job) not unlocking if you're in a docked sub instead of the main sub at the end of the round. +- Readjusted all sitting animations so that they characters shouldn't twitch anymore while sitting. +- Doubled the rate limit for medical clinic which should reduce "No response from server" errors. +- Fixed swimming characters sometimes being unable to stand up on stairs/platforms even if the water is shallow enough. +- Fixed guitar and harmonica being rendered on top of the water effect. +- Fixed guitar, harmonica, accordion and captains pipe having neutral buoyancy. +- Fixed mid-round joining clients not seeing subs purchased during that round. +- Fixed research station being repairable by clicking on it instead of pressing E. +- Fixed medical curtains disappearing before they're off-screen. +- Fixed karma preset being forced to default when starting a new server. +- Fixed Herja's rear motion detector being connected to an incorrect display, and the bottom turret display having an incorrect text. +- Fixed crash caused by selection not being cleared when autocompleting or running a console command. +- Fixed occasional performance dips when spineling spikes get stuck to the sub's exterior walls. +- Fixed item assemblies getting misaligned with the grid after saving. +- Fixed "Shell A 18" not aligning with the other shell pieces. +- Fixed welding tool's, plasma cutter's and watering can's particle effects getting "clamped" to the edges of the hull they're inside. +- Fixed permission icon in the client list not updating mid-round. +- Fixed "lock default wires" server setting not affecting docked subs. +- Fixed Dugong's small pumps working without power. +- Fixed buttons in structure editing menu using a different style than other types of entities in the sub editor. + +--------------------------------------------------------------------------------------------------------- +v0.16.7.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed excessive loading times when playing in Chinese, Japanese or Korean. +- Fixed certain logic components (and/or/xor with an empty output and non-empty false output) stopping to work altogether when they stop sending a signal. +- Fixes to crashes when trying to interact with certain elements in the server lobby while getting disconnected. + +--------------------------------------------------------------------------------------------------------- +v0.16.6.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed captain tutorial being impossible to complete due to the docking button not activating on the nav terminal. +- Fixed door lights appearing to be off in the tutorials. +- Fixed crashing when you try to use the hotkeys or double-clicking to put an item inside another item you're holding in your left hand, but there's an item with no inventory in your right hand. +- Fixed inability to repair research stations. +- Fixed status monitors crashing the game if the selected UI style doesn't define "IconOverflowIndicator". +- Fixed crashing when trying to view the specs window of a sub that hasn't been saved yet (= if you create a new sub, go to the test mode and open the submarine tab in the tab menu). +- Fixed some of Spineling's spikes getting hidden for 30 seconds instead of 15. + +--------------------------------------------------------------------------------------------------------- +v0.16.6.0 +--------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Added a medical clinic to outposts that allows you to heal your crew for a price. +- Added three new sub: Barsuk, Herja and Winterhalter. +- Improvements and polish to the human sprites. +- Improvements and polish to clothing and headgear sprites. +- Added the Submarine tab to the multiplayer campaign store to allow selling items on the submarine. +- Prevented selling items from submarine containers tagged with "donttakeitems", e.g. constructors, deconstructors. +- Added new campaign store related client permissions: use campaign store, buy items, sell inventory items, and sell submarine items. +- Entities can be grouped together and the groups selectively hidden in the submarine editor. +- Balanced mission rewards, commonness and difficulties. +- Added some new decorative items and structures. +- Adjusted medical items' effects on bleeding and burns. Bandages, plastiseal and antibiotic glue are now much more effective at treating them, and morphine & fentanyl only heal them by a negligible amount. +- Heavily increased supercapacitor's power consumption and made the recharge speed increase exponentially when the recharge rate is increased. +- Optimizations to signal logic, status effects and property conditionals. +- Item update optimizations. +- Optimizations to gap logic. +- Optimized multiplayer store interface. +- Added "separator" property to Concat Component. +- Added "power_value_out" and "load_value_out" connections to junction boxes. +- Added "set_output" connection to Greater Than Component, Equals Component and Regex Component. +- Made alien materials spawn in abyss islands. +- Exposed wall healths in the sub editor. +- Modified Orca 2 and R-29 reactor values so they're more in line with other subs. +- Made ballast flora toxins more visible and made them emit a sound. +- Made impacts toss items around less effectively, especially when the item is heavy. +- "Allow rewiring" server setting doesn't affect wrecks, pirate subs or ruins. +- Added an option to disable all in-game hints to the hint message box. +- Option to make sonar displays center on the connected sonar transducer. +- Made the sizes of signal components consistent (32x32px, they also align to the grid now). +- Don't allow fabricators to take items from linked containers the user doesn't have access to. +- Connected diving suit lockers to oxygen in vanilla subs. +- Pulse laser ammo can be bought from outposts and cities. +- Chaingun tweaks: doubled turning speed when firing, reduced charging up time, reduced ammo consumption and made the ammo boxes more expensive. +- Simplified Remora drone docking system. +- Show notifications about reputation changes mid-round. +- Escorted NPCs drop the items they took from the sub (like suits) at the end of the round. +- Added warnings when the game fails to run the physics at the desired 60 updates per second (which would cause rubberbanding in multiplayer). The warnings are shown below the FPS when the client is running slowly, and in the debug console of the host/moderators/admins when the server is. +- Made turret icons on the minimap gray instead of red when not manned (easy to think there's something wrong with the turret when it's red). +- Abandoned outpost's oxygen generators now consume power. +- Made characters crouch a little lower (enough to make it possible to shoot while standing behind a crouching character). +- Added a "sendchatmessage" console command with an option to configure the color of the message. +- Added button to align selected items and wire nodes to grid to the sub editor. +- Allow using cheats in editors. +- Don't show "hidden in-game" docking ports on the sonar, option to disable the docking port's particle and sound effects. +- The prompt about forbidden words in the server's name is only shown when trying to start a public server. +- Show prices in the submarine specs window (previously there was no way to see a sub's price in the server lobby). +- Allow wiring non-interactable items and accessing non-interactable containers in the sub editor. +- Chaingun projectiles and canister shells cause lacerations instead of gunshot wounds. +- Added recycle recipe to SMG magazines. +- Significantly reduced the speed at which welding tools fix walls. +- Changed the small arms max stack sizes to either 6 or 12 when the clip size is 6. Makes it less tedious to use the extra ammunition. +- Added damage sounds to doors when they take 10 or more damage. +- Made outpost containers' sprite depths more consistent with other containers. +- Added tags to outpost medical compartments and made them linkable. +- Mission completion and failure icons are now displayed mid-round in the tab menu. + +Monsters: +- Added 3 new monster variants: Giant Spineling, Crawler Broodmother and Veteran Mudraptor. +- An overall balance and behavior fix pass on all monsters. Feedback is welcome. +- Monster mission reward and difficulty level adjustments. +- Adjustments to the random monster spawn events. +- Adjusted the loot dropped by Crawler Broodmother, Giant Spineling, and Bonethresher. +- Moloch Pupa and Hammerhead Matriarch now also drop some loot. +- Crawler Eggs now deconstruct into suplhuric acid (and adrenaline gland, if they are not the smallest variants). +- Fixed mudraptors being unable to hit the targets that are very near. +- Fixed monsters sometimes getting stuck near the Humpback's bottom railgun. +- Fixed monsters getting stuck on trying to reach open gaps that are on the other side of the sub. +- Fixed aggressive boarders not being aggressive enough inside the player sub, because they couldn't target things that were blocked by a wall. +- Fixed Molochs not doing anything when there's babies around. +- Fixed Mudraptors not staying together in swarms. +- Fixed monsters continuing to eat a characters who've been revived with console commands (leading to weird results, such as the character being able to run around after being dismembered).. +- Fixed some monsters, like crawlers, trying to target walls with lots of gaps even though there are better targets closer to them. +- Fixed monsters being unable to target inner walls when they are technically outside of the sub (= when there's no hull where they are). Such places, between the outer and the inner walls, can be found e.g. in Humpback. +- Tigerthreshers can now target doors. +- Monsters that try to get inside the sub, should now notice and priorize doors more overall. Affects e.g. Mudraptors, and to lesser extent Crawlers (and Tigerthreshers). +- Monsters' burns don't heal by themselves. +- Fixed hammerhead matriarchs sometimes spawning in low-difficulty levels. +- Fixed endworm not having a burn damage modifier in the right tooth. +- Changed Golden Hammerhead's behavior towards stronger monsters. + +AI: +- The order of the crew list is saved between rounds in single player. +- Indicate when a bot is following someone else than you on the crew list's order icons. +- When quick-assigning orders, prioritize the characters with the same Operate order only when they are targeting the same item. +- When quick-assigning orders, don't prioritize characters with the same Maintenance order. Otherwise, Maintenance orders will always be quick-assigned to characters who already have the samer order. This will prevent giving out multiple Maintenance orders of the same type to multiple characters using the quick-assignment logic. +- Allow quick-assigning the same kind of Operate order to multiple characters. Previously, it would always be given to the character that already had the same kind of order. +- Added a new "Assault Enemy" order: bots with the order will seek out and attack any hostile characters in any connected submarines or outposts. +- Made the order quick-assigning logic prefer characters who don't have the order yet (among the characters with the appropriate job). +- Made it possible to use the order quick-assignment to give the Fix Leaks order to all character (although mechanics, engineers, and assistants are still preferred). +- Fixed bots sometimes getting stuck while trying to fix a leak that's not in the same sub (e.g. bot in Remora and the leak in the drone). +- Reduced the range where the bots can spot enemies outside of the sub. +- Improved bots' ability to return back to the submarine from caves. +- Fixed oxygen shards from old saves still being used as oxygen sources by bots. +- Fixed bots getting stuck in certain spots with ladders (e.g. Berilia's reactor room). +- Fixed contextual "clean up" order not being visible for weapons. +- Defined preferred containers for some items and added "locker" as the secondary preferred container for most items. Helps bots clean up things even when they can't find the primary container for the items. +- Fixed bots sometimes halting briefly next to a door when they shouldn't. +- "Fight intruders" order doesn't make the bots enter abandoned outposts to fight the enemies there. +- Disable aggressive behavior towards the player for the friendly crew members in single player (= accidental friendly fire never turns the security hostile in single player). +- Fixed bots saying they can't find items to load when someone takes an item they were targeting. +- Fixed bots saying they can't reach a leak when someone else fixes it before them. +- Fixed bots sometimes trying to adjust auto-controlled pumps when doing the autonomous Pump Water objective. +- Arrested pirate captains don't try to give orders to their crew. +- Change how captains (and theoretically other bots with an autonomous fight intruders order) behave: instead of idling around, they'll flee to the safety. And if there's no security officers around, they should fight the enemy aggressively. +- Fixed bots filling target containers with items that can't be refilled/recharged when given the Load Items order (e.g. putting welding fuel tanks in oxygen tank shelves). +- Made bots prefer the same fuel rods or ammo as already loaded when they're operating a reactor or a turret and need to find new ones. +- Bots that follow a character who's going inside/outside stick closer to the character they're following. Helps the bots to get back inside with you. +- Fixed pets becoming hostile towards the crew and other pets if a human attacks the character they're protecting. +- Fixed pirates not operating turrets when they have no power. +- Fixed bots not unequipping diving suits when they have an order but not actively following it (i.e. they are on idle). +- Fixed Operate orders not being dismissed automatically when another character is ordered to operate the same device. +- Fixed the dialogue reserved for rearranging character orders not being used in multiplayer. +- Fixed bots sometimes getting stuck on ladders while swimming. +- Fixed bots returning to the sub even when they have an active wait order. Happened when the order was given inside and then when e.g. the character is controlled by the player, and then when the player changes the character, the bot falls to the "find safety objective", because it's not allowed to stay outside. +- Bots can find buttons connected to a door using links made in the sub editor. Allows working around complex circuits that prevent the bots from figuring out which button controls a door. +- Fixed bots taking battery cells from portable pumps without considering their condition when acting on the Recharge Battery Cells order. +- Fixed bots not always reacting to monsters when they should be able to see them, while swimming outside. +- Fixed bots accidentally damaging friendly characters while trying to hit Swarmfeeders latched on to them. +- Fixed bots not using melee weapons when there's Swarmfeeders latched on to them. +- Fixed bots being able to shoot without any delay if they already have a weapon equipped. +- Fixed bots dropping the syringe inside PUCS when replacing the oxygen tank. +- Fixed bots sometimes failing to find a path to a docked shuttle or drone. +- Fixed NPCs reacting to combat between other characters when they shouldn't (e.g. when they don't witness it). +- Fixed bots not re-equipping body armor/ballistic helmet/something else when they drop the diving gear. +- Fixed bots having issues with some stairs. Note: these changes might require alterations on stair waypoints. Currently the generator doesn't do perfect job there. Look for the examples on how to fix them manually in the vanilla subs. +- Fixed bots sometimes trying to put items they're cleaning up into containers inside fabricators/deconstructors (e.g. an oxygen tank into a diving suit in a fabricator). +- Fixed bots equipping gene splicers when cleaning them up, causing the genetic material to get destroyed when the bot puts the splicer in a container. + +Talents: +- Removed the special stat boosts from "Olympian" (now it only increases the skill cap to 200). +- Halved the amount of damage "Still Kicking" heals (100 -> 50) +- Reduced gunshot wounds inflicted by handcannon. +- "True Potential" only has a chance of instakilling things smaller than a moloch. +- Halved damage buff from "Quickdraw" (80% -> 40%). +- Reduced skill gain from "Field Medic" (7 -> 3). +- Nerfed "Warlord" (20% chance of doubling the damage -> 5% chance). +- Reduced damage buff from "Expert Commando" (40% -> 20%). +- Health scanner doesn't show buffs from talents. +- Fixed "unused talent points" indicator staying visible after all talents have been unlocked if the character's gained extra talent points from other talents. +- Fixed incorrect talents sometimes unlocking server-side when unlocking "All-Seeing Eye". Happened because the server checked how many talents the client can unlock before applying All-Seeing Eye, which meant that the 3 extra talents would not be available, and the server would leave the last 3 talents unlocked. +- Fixed "Inspired to Act" talent only giving a skill bonus of 9.98 instead of 10. +- Fixed "Atmos Machine" talent not spawning psychosis artifacts or alien pistols. +- Fixed "Hazardous Materials" considering any reactor outside the main sub (e.g. beacon station) a wreck reactor. +- Fixed ranged weapons (including turrets) triggering "Electrochemist" talent's stun. + +Bugfixes: +- Fixes character resetting in MP campaign if you join mid-round and don't get to spawn in before the next round in a campaign you've previously played in. +- Fixed equipping two of the same genetic material and then unequipping one of them removing all the genetic effects. +- Fixed "novice seafarer", "experienced seafarer" and "naval architect" achievements being possible to unlock even if cheats are enabled. +- Fixed kills in multiplayer sessions not progressing the "xenocide" and "genocide" achievements, and kills being reported to Steam unreliably. +- Fixed clients not spawning the respawn shuttle if they join after the server had disabled the shuttle mid-round, leading to an "entity not found" kick. +- Fixed medical effects being different when the medical item is fired with a syringe gun. +- Fixed wall healths being half of what they should be on vanilla subs, increased structure damages to compensate. +- Fixed fabricator sometimes desyncing in MP when some of the ingredients are in the user's inventory. +- Fixed clients trying to reconnect to SteamP2P indefinitely if establishing the initial connection fails, eventually leading to a crash. +- Fixed "allow linking wifi to chat" server setting causing syncing problems with headsets. The setting wasn't synced with clients who don't have settings management permissions, which would cause them to get some of the wifi components' properties mixed up and sometimes prevent them from communicating using the headsets. +- Fixed motion detector requiring the target's velocity to be higher than the specified minimum velocity, instead of higher than or equal. As a result, a minimum velocity of 0 would not sometimes detect targets in range. +- Fixed an exploit that allowed combining genetic materials in deconstructors. +- Fixed "fixitems" command setting genetic materials' condition to 100. +- Fixed "reset to prefab" not resetting wall healths. +- Fixed certain logic components not passing forwards the character who sent the signal, preventing e.g. the character who undocked a drone from being logged or the character who killed something from being determined if the signal activates a weapon. +- Orca 2: Fixed missing power wires to a couple small pumps, neutral ballast level, gunnery marked as wet room. Added a duct block between upper and lower deck. Some minor visual fixes. +- Fixed voronoi sites sometimes getting placed outside the level's bounds, leading to messed up level geometry. +- Fixed turrets always starting at rotation 0 at the beginning of the round (instead of halfway between the min/max angles like in the editor). +- Fixed changing a delay component's delay using the editing hud not having an effect in-game when the component is receiving a continuous signal. +- Take structures/items with a collider into account when calculating a sub's dimensions (as opposed to just hulls). Fixes dimensions being incorrect in the submarine's info if the sub includes structures that extend far outside the hulls. +- Fixed crashing when swimming up from hull to another in a specific kind of hull configuration (two hulls side-by-side, with a gap leading up to another one). +- Fixed oxygen shards from old saves still being used as oxygen sources by bots. +- Fixed changes not being applied to all selected items when multi-editing a string field in the sub editor and deselecting the items without applying the changes by pressing enter. +- The game doesn't try to save a campaign if an exception occurs at any point during the saving process (should fix rare occurrences of campaign saves getting corrupted). +- Don't allow signals to deactivate ItemContainers. Fixes portable pumps' "toggle" input not working. +- Fixed removed items staying visible on the status monitor's electrical tab. +- Fixed plants still using the old values in old saves (i.e. dying too fast when not watered). +- Outposts can't request the "psychosisartifact_event" item (an event-specific special artifact that looks identical to the normal ones). +- Fixed size of a door's gap relative to the door changing when rescaling the door in the sub editor. +- Fixed fabricator consuming all the suitable ingredients when the ingredient is configured using a tag instead of an identifier (e.g. fabricating a stun gun dart would consume all the wires in the input slots). +- Fixed motion detector's detect offset getting mirrored when copying a mirrored detector. +- Fixed status monitor's submarine blueprint refreshing when initiating docking with a shuttle, instead of when the docking ports lock (sometimes causing the shuttle to appear slightly off from the docking port on the monito). +- Fixed fabricator failing to stack oxygenite tanks. +- Fixed items in the player's inventory not getting highlighted as valid ingredients when using a fabricator. +- Attempt to fix a rare crash caused by ScalableFont.DrawStringWithColors. +- Fixed freezing when trying to enable GameAnalytics from the settings menu on Mac. +- Fixed locked connection panel and non-interactable lights in R-29. +- Fixed Delay Component failing to parse set_delay inputs on systems that use comma as the decimal separator. +- Fixed charge rate not being displayed correctly on batteries in Chinese. +- Fixed junction box load not being displayed on status monitors in Russian. +- Fixed oxygen tanks being misaligned in oxygen generators. +- Fixed motion sensor not being able to detect subs in the sub editor test mode. +- Fixed recycled volatile fulgurium rods incorrectly using mechanical instead of electrical skill. +- Consider the character who severed a limb as the character who inflicted the afflictions caused by severing the limb. + Consider the character who caused bleeding as the character who caused the resulting bloodloss. Fixes achievements not unlocking and talents not triggering if you kill a target by cutting its limbs off or by making it bleed to death. +- Fixed characters sometimes becoming momentarily unresponsive when swimming out from a hull. +- Fixed speed penalty caused by the vegetation in caves sometimes not disappearing after passing through the vegetation. +- Fixed links from a docking port to a linked sub not being considered valid in the sub editor (only a link from linked sub to a docking port). Now the order of the link doesn't matter. +- Fixed repair window showing up if you use a periscope wired to a broken device. +- Fixed sonar getting misaligned when switching to the docking mode (the amount of misalignment being relative to the distance of the docking port from the sub's center). +- Fixed light textures not rotating with the lamps in the sub editor. +- Fixed elements in CustomInterface getting misaligned if the signal_out connections aren't used in sequential order (e.g. if you only connect a wire to outputs 2 and 3). +- Fixed server including lines multiple times in the saved server logs (e.g. the 2nd saved log file would include some lines that were already saved to the 1st log file). +- Fixed initial husk infection message being displayed immediately after getting infected, not after the infection advances. +- Fixed equip slots being misplaced if you open the health interface when the equip slots have been hidden. +- Fixed wrecks sometimes not spawning in levels despite a wreck mission being selected. +- Fixed characters moving slowly downwards when aiming underwater. +- Fixed moloch shell shields not protecting the user from non-hitscan weapons or melee weapons. +- Fixed messed up mining crane sprite. +- Fixed crashing when pirates try to operate the sub using a nav terminal that doesn't control any sub (doesn't affect vanilla subs because they don't contain that kind of nav terminals). +- Fixed fabricator showing the info of the selected item wrong when selecting the fabricator with another character (e.g. fabrication time still calculated based on the previous user's skills). +- Fixed characters reading skillbooks upside-down. +- Fixed personality traits changing after every round in mp campaign. +- Fixed monsters always eating the character they're grabbing, even when the monster is configured as not being able to eat (in practice only happened when a player controlled something like a fractal guardian and grabbed another character). +- Fixed characters sometimes using the "priorities have changed" dialogue when giving a new order. +- Fixed pumps' auto-controlled status not being updated correctly. +- Added some extra logging to diagnose the "did not receive STARTGAMEFINALIZE message from the server" errors. +- Misc localization fixes and improvements. +- Fixed tab menu's character tab not refreshing when switching to another character. +- Fixed ballast flora still being present when you replace an infested lost shuttle in an outpost. +- Fixed occasional crashes and entity ID errors when entering a new level with a ballast flora infested sub. +- Fixed inability to swap SMG magazines (or other items that go inside the held item) by double-clicking. +- Fixed "failed to parse the string to Vector2" when loading bot orders that have been saved on a system that uses comma as a decimal separator. +- Fixed rounding error in RespawnManager that caused it to require 1 extra dead player to trigger a respawn (e.g. 9 players and a minimum of 30% players to respawn required 3 players, but the client-side texts showed 2). +- Fixed "stairs left" appearing mirrored in the status monitor's sub blueprint and in the sub editor's entity selection menu. +- Fixed Wifi Component's "set_channel" input not working when sending signals to it via chat in multiplayer. +- Fixed autoshotgun not taking stacks into account in the ammo indicator below the inventory slot (= displaying it as being full when there's one shell in each slot, even though more could be stacked on the slots). +- Fixed hitscan turrets sometimes hitting targets inside your own sub when there's linked subs present. +- Fixed faraday and nasonov artifacts' periodic explosions stopping if the round is ended during their 0.5s "reset" period. +- Fixed oxygenite shards not exploding in depth charge shells. +- Fixed killer sometimes being determined incorrectly when a character gets killed by something else than another character: e.g. if a character got crushed by pressure, the character who last did damage to them was considered to be the killer, which could for example lead to achievements being unlocked in inappropriate situations. +- Fixed pumps not taking the volumes/shapes of the linked hulls into account when using "set_targetlevel", causing the neural level to be off in irregularly shaped multi-hull ballasts. +- Fixed artifacts sometimes spawning outside the level when there's no artifact holder to place them in (e.g. when having 2 artifact missions active at the same time). +- The electrical grid in beacon stations is turned indestructible after activating it. Should fix beacon missions sometimes failing for no apparent reason (if something happened to damage the beacon's walls during the round and flood it). +- Attempt to fix a null reference exception in Map.RemoveFogOfWar (suspecting it was caused by a mod that didn't configure the campaign map's sprite for some biome). +- Fixed nav terminal's docking button staying visible if the terminal is disconnected from the docking port by deactivating a relay between them. +- Fixed cursor position jittering when the sub is moving fast. +- Fixed discharge coils in Berilia and Orca 2 being connected to junction boxes instead of supercapacitors. +- Fixed wall colliders generating twice on abyss islands without caves, and the 1st generated wall not getting mirrored along with the level, leading to "invisible walls" in some areas of the abyss in mirrored levels. +- Pirates that are outside or unconscious count as being dead in the pirate missions. Fixes pirate missions failing if e.g. one of the pirates gets stranded outside their sub. +- Fixed some turrets being possible to power with batteries, even though the maximum power output of the batteries shouldn't be high enough. +- Fixed the drug dealer in the "heart of gold" event fleeing from the other bandits. +- Fixed decapitating not working as it should. +- Fixed being able to grab hostile NPCs. +- Fixed sound effects not playing when a monster hits the sub's inner wall. +- Fixed correct sprite not being used in the great sea on the campaign map. +- Fixed "settings" text overlapping in the settings menu when using a very large text size. +- EventManager doesn't consider monsters in a docked non-player sub (e.g. abandoned outpost) to be "inside the sub". Fixes intensity always being at 100% in monster-infested outposts. +- Fixed outpost cabinet's sprite having empty space above it. +- Fixed inability to put syringe guns, toy hammers, welding tools, plasma cutters and sprayers in weapon holders. +- Fixed escort missions giving huge rewards in higher difficulty levels. +- Fixed a nullref exception in CharacterHUD.Draw when an icon can't be found for a campaign interaction. + +Modding: +- Added "HealCostMultiplier" attribute to AfflictionPrefabs that adjusts the heal cost in medical clinic. +- EntitySpawnerComponent treats positive y offset as up to make it more consistent with other components. +- Added an option to define a hard limit for how many entities EntitySpawnerComponent can spawn. +- Fixed "targetself" attack conditionals checking both the attacker and the target. +- Added "delaybetweenspawns" property to MonsterEvents (determines the delay between spawning the individual monsters of a given monster event). +- Don't allow setting an item's or limb's density to 0 (leads to "attempted to apply invalid force/torque" errors). +- Fixed shields blocking projectiles from the user's weapon. Didn't affect any vanilla items, because all the shields are 2-hand items that prevent using a weapon at the same time. +- Fixed ButtonTerminals without an ItemContainer component causing crashes. +- If a mod makes a vanilla item movable/detachable and sets it as being attached by default, attach it to a wall when loading a sub that already had those items placed. I.e. making static devices movable doesn't cause them to deattach in existing subs. +- Fixed monster AI's targeting priorities doing nothing if the threshold is 0 and the target hasn't done any damage. +- Fixed custom ID card tags not working in wrecks. +- Fixed Rope component not attaching to the limb it's fired from in multiplayer (doesn't affect any vanilla content). +- Fixed crashing in multiplayer when there are spectators in the server and someone reaches the final stage of a modded husk affliction that allows remaining in control of the final form. +- Fixed wearables that are equipped into multiple slots (e.g. InnerClothes+OuterClothes) not being visible when worn. + +--------------------------------------------------------------------------------------------------------- +v0.15.23.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed inability to switch subs in multiplayer campaign, unless you opt to switch at the same time as you purchase the new sub. +- Fixed server not loading the previous save, but continuing from where you left off if you return to the server lobby without saving and try to continue. +- Fixed characters who've died and respawned during a round getting a penalty to their skills again on the following round. +- Attempt to fix clients sometimes gaining control of an incorrect character in the multiplayer campaign. + +--------------------------------------------------------------------------------------------------------- +v0.15.22.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed GameAnalytics consent prompt still going outside the window on small resolutions and/or large text sizes. +- Fixed deconstructor not being able to put the items into containers in the output slots. + +--------------------------------------------------------------------------------------------------------- +v0.15.22.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing on startup on some versions of macOS. +- Fixed Kastrull's drone sometimes spawning inside the sub client-side in multiplayer. +- Fixed opening the settings menu resetting the game window, which caused screen capture software to stop capturing the window. +- Fixed certain mods that don't configure the "you are here" circle sprite for the status monitors causing crashes. +- Fixed abilities that give simultaneous skill gain (minor in mechanics, once upon a time in europa, apprenticeship) not giving the extra skill points. + +--------------------------------------------------------------------------------------------------------- +v0.15.21.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed "allow linking wifi to chat" server setting preventing clients without the permission to manage server settings from using their headsets. +- Fixed repair minigame not working correclty if the user has a talent that allows repairing past max condition. +- Fixed "error in Order Pump Water - the number of option names doesn't match the number of options" errors in Russian, Korean and Traditional Chinese. + +--------------------------------------------------------------------------------------------------------- +v0.15.20.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- New submarine: Orca 2. +- Improved monster spawning: different monsters spawn in different biomes and tougher monsters are introduced gradually during the course of the campaign. WIP, probably requires balancing and adjusting. Feedback is welcome. +- Adjusted gardening: the plants now require less continuous attention, making gardening a more viable "downtime activity" that you can focus on when there's nothing else to do, and ignore when you're busy without killing the plants. +- Readded GameAnalytics, a library that allows us to collect gameplay statistics and error reports automatically. Sending statistics is completely optional: when you launch the game, you're asked whether you want to allow the game to send us data or not. If you decline, no data of any kind is collected. The collected data is completely anonymous and doesn't contain any personal information, but only things such as error reports and statistics about the selected game mode, submarine, missions and mods. +- Added a simple QTE "minigame" to the repair interface. Allows speeding up the repairs slightly and hopefully makes repairing feel a little more engaging. +- Characters can climb up ladders faster by holding the sprint key. +- Changed the way purchasable submarines for the multiplayer campaign are selected: instead of choosing them when creating the campaign, all of the server's visible submarines are made available for purchase. +- Diving suits play a different warning sound when low on oxygen (<5% left in tank). +- PUCS doesn't consume oxygen tanks in rooms with oxygen. +- Added "Pump In" option to the contextual "Pump Water" order. +- Added "fuel_percentage_left" output to reactors. Outputs the sum of the fuel rods' condition percentage, as opposed to the total "heating power" of the rods like the "fuel_out" output. +- Powered down reactors don't zap the user when repairing. +- Improved weapon indicators on the status monitor (they now indicate the rotation of the turrets). +- Damaging outpost NPCs when there's a monster or an instigator nearby doesn't turn the outpost NPCs hostile (i.e. accidentally damaging one of the NPCs when you're fighting a hostile NPC doesn't trigger the guards). +- Damaging outpost NPCs when there's a monster or an instigator nearby doesn't lower outpost reputation. +- Adjustments to job gear and diving suit sprites and inventory icons. +- New depth charge tube sprite. +- Added a verification prompt when saving and quitting a campaign round (mp or sp). +- Added options to adjust karma penalty for containing dangerous items in the server settings. +- Made it a bit more viable to take out enemy humans stealthily: if an attack immediately kills/incapacitates the character, others won't be alerted unless they witness the attack. +- Option to end outpost rounds without saving. +- Made sonar transducer consume less power when the sonar is running in passive mode (or when the transducer isn't connected to anything). +- Treatment suggestions in the health interface take items in subinventories into account as well. +- Added tooltips to treatment suggestions to make it more clear the treatments can be applied by clicking on the suggestions. +- Added "condition_out" pin to fabricators, deconstructors and blank loader. +- Added "set_delay" input to delay component. +- Tagged boarding axe and assault rifle as medium items to allow storing them in cabinets. +- Removed "weapon" and "gun" tags from the bike horn and the syringe gun. +- Added a menu to hide submarines in the server lobby, allowing hosts to remove vanilla submarines from the list without replacing the content package. +- Added LOS effect to the server settings. +- Added line break support to the server message. +- Connected the diving suit lockers on the vanilla submarines to the power grid so that they refill the contained oxygen tanks. +- Connected the oxygen shelves on Humpback to the power grid. +- Allowed in-game editing of lamps in R-29. +- Mudraptor shell shields block projectiles and can be destroyed by firing at them. +- Prototype Steam Cannon can damage ballast flora. +- Water detectors treat minuscule amounts (< 1.0 water volume) as 0. +- Improvements to the "infiltration" outpost event: you can talk to any of the clowns to progress, not just the one that spawned 1st, and the clowns head to the airlock when told to leave. +- Medical curtains can be opened and closed. +- Restricted the amount of additional cargo you can choose in multiplayer: max 10 items of a type, max 20 types of items. +- Allow editing item quality in the sub editor. +- Removed stun tools from riot officer loadout, replaced with riot shotgun. +- Burns slowly heal by themselves, adjusted radiation poisoning accordingly. +- Shotguns now spawn with 6 shells, autoshotguns with 8 (a full stack). + +Multiplayer fixes: +- Fixed campaign character resetting if the client, disconnects, rejoins and respawns on the same round after their character has gotten killed. +- Fixed skill penalties not getting applied when respawning during the same round. +- Fixed several issues (namely mission/submarine mismatches and desyncs) when clients take too long to receive an up-to-date campaign save at the start of a new round. +- Fixed "received data without a transfer initiation message" errors when a client disconnects and reconnects while a file transfer is in progress. +- Fixed respawn not triggering during multiplayer rounds if a client disconnects and rejoins after dying. Happened because the server was expecting the client to answer the "respawn with penalty?" prompt, which wouldn't be shown when the client rejoins mid-round. +- Fixed server making Client A switch their character to Client B's when Client B disconnects if the clients have the same connection endpoint (Steam ID or IP, for example when the players are using the same wifi connection), and Client B's character was created after Client A's. +- Fixed items sometimes teleporting from monster to another or dropping when trying to pick them up by double-clicking. Happened when the monster had selected (= grabbed, started to eat) another monster when they were still alive. +- Fixed crashing if you start the round as a spectator, take control of someone with console commands and try to access the tab menu's character tab. +- Fixed empty exploding coilgun ammo boxes exploding client-side when deconstructed. +- Fixed disabling friendly fire preventing buffs from being applied to crewmates, while allowing harmful afflictions to be applied (= the setting basically worked the wrong way around). +- Fixed other clients' characters sometimes appearing to teleport outside the sub for 1 frame when moving from sub to another, leading to further issues if the client has water-sensitive items in their inventory. +- Fixed whitelist controls getting disabled when adding new players to the list if whitelist wasn't enabled when opening the server settings. +- Fixed bots losing their items if you quit the 1st MP campaign round without saving, continue, and repeat that again. +- Fixed playstyle always being displayed as Serious in the server lobby unless you're hosting yourself. +- Reduced the severity and frequency of the "Maximum packet size exceeded" error in the server lobby. +- Fixed context menus not opening when right-clicking player names in the chat and server log. +- Improved the error message shown when a Steam lobby could not be created. + +Talent improvements and fixes: +- Overall balancing to the stats boots from talents. +- Adjustments to some of the ability descriptions to address some inaccuracies/ambiguities. +- Reworked "implacable": now allows the character to stay conscious for 15 seconds after falling below 0 health. +- Reworked "field medic": if you complete a mission and all crew members survived, you gain medical skill. +- Reworked "beat cop": now gives 25% repair speed and increases inflicted stuns by 25% (and the tackle). +- Reworked "reverse engineer": whenever you deconstruct an alien artifact, you have a 50% chance to gain double output from it and gain 8 to a random skill. Small alien artifacts, when deconstructed, give 4 skill instead. +- Reworked "curiosity": whenever you deconstruct an alien artifact, you and another random allied crewmember gains 125 experience. Small alien artifacts, when deconstructed, give 50 experience instead. +- Reworked "expert commando": now gives, to ranged weapons, 70% spread reduction, 40% attack multiplier and 30% attack speed reduction while crouched. +- Reworked "gene therapist": now gives an additional 25% medical item potency, correctly displays as adding a flat 10% to each refined genetic material. +- Reworked "genetic stability": no longer gives 25% repair speed, and instead gives 15 to all skills. Probability of tainting genetic material reduced to 50%. +- Reworked "still kicking": now rapidly heals over a short duration instead. +- Reworked "stand and deliver": assistant skillbook can no longer be used on another character, instead the nearest ally gains 5 to all skills when the book is read by the talent owner. +- Reworked "first aid training": Now gives a flat 35% increase to medical item potency when applied to the character. +- Reworked "evasive maneuvers": now gives 15% more money for nest/swarm missions instead of giving attack bonus inside submarine. +- Reworked "expanded research": whenever you or another allied crewmember deconstructs depleted fuel, they gain 400 experience. This effect can only occur up to 3 times until you finish another mission. +- "Scrap savant" and "scrounger" only spawn the scrap in items with the tag "container" and only if the container can hold scrap. Fixes ability to generate free scrap by placing containers like detonators and portable pumps in the wrecks. +- "Advanced splicing", "optimized power-flow" and "elbow grease" can now only give up to 100 skill bonus. +- Fixed "canned heat" not increasing the quality of fabricated oxygenite tanks. +- Fixed "pyromaniac" applying the buff to the enemy you're damaging instead of your character. +- Fixed server ending the round if the last player alive is an assistant with the "still kicking" talent and said assistant falls unconscious. +- Electrochemist talent doesn't stun the attacker if the attack doesn't apply any harmful afflictions (e.g. if it only applies buffs or gives experience). +- Fixed autofill not working on the new talent items. +- Fixed "crew layabout" applying stat boosts to enemies as well. +- Fixed "expert commando" talent affecting turrets. +- Fixed hardened/dementonite crowbars not opening doors faster than normal ones. +- Fixed unlocking "all seeing eye" preventing you from unlocking further talents until you've gained enough EXP to compensate for the 3 "free" talents. +- Fixed high-quality items with whose max condition is above 100% not being accepted as fabrication ingredients. +- Fixed "tandem fire" crashing the game if there are no other crewmates present. +- Fixed "safety first" talent giving you mechanical skill when you gain electrical skill instead of the other way around. +- Added PreferredContainers to the new talent items to allow the bots to clean them up. +- Rebalanced combat stimulant: now applies faster, but less in total per dose. Healing reduced. +- Dropped type "poison" from chem addiction, making it non-healable (only chem withdrawal can be healed). + +AI: +- New order: Find Weapon +- New order: Prepare for Expedition. +- New order: "Load Items", with options "Recharge battery cells", "Refill oxygen tanks", and "Reload ammo". Bots will take battery cells to be recharged, take oxygen tanks to be refilled, or place more ammo to loaders depending on the order option. +- Added an option to pump in water. Only applicable to pumps that are not automatically controlled. +- Orders that cannot be completed should now be dismissed automatically instead of keeping active but doing nothing. +- The bots should now tell you when they can't follow an order, instead of always replying positively. +- Changes to the default order assignment priorities, which determine the initial order of the orders when multiple is issued. You can still alter the order manually by dragging the order icons. +- Fixed bots getting stuck with invalid paths for too long. +- Fixed AIObjectiveGetItem not working properly when we try to ignore the items that already are in the inventory. In practice, only affects the find better weapons behavior in the combat objective (Fight Intruders). +- Bots don't automatically unequip PUCS when they don't need diving gear. +- Don't allow bots to heal pets (because they are likely to just kill them). +- Fixed bots trying to equip diving gear when they have spliced genes that give pressure immunity and/or remove the need for oxygen. +- Improved the bots door interaction so that they don't slam the door at your face, nor bump into closed doors so often, or keep "smashing the select key" as frequently. There's now a three second cooldown after succesfully pressing a button before next attempt. +- Bots now hold still while waiting a door to open instead of moving towards it. +- Bots now only put oxygen tanks into oxygen generators with the "Refill Oxygen Tanks" order option. +- Bots take previous heals into account when determining when to react to attacks. Fixes deusizine and liquid oxygenite aggroing the bots when using them to treat oxygen loss. +- Bots now treat handcuffed targets as neutralized, unless they are hostiles spawned from events. Fixes e.g. bots killing captured prisoners, but also allows you to submit to the outpost guards by handcuffing yourself. +- Prevent bots from healing the targets that have recently attacked them. Fixes bots healing and shooting you at the same time. +- Fixed rescue order (healing) not working outside of the sub. +- Fixed bots not knowing how to use the Rapid Fissile Accelerator. Also improves on how they use smg, assault rifle, and autoshotgun. +- Fixed unconscious NPCs being able to see you steal. +- Fixed bots sometimes repathing too eagerly while they are on ladders, sometimes causing them to get stuck in places where they should switch from a ladder to another one nearby. +- Fixed hostages in the abandoned outpost rescue mission refusing to follow a player that has some diving gear on they don't have access to. +- Fixed pirates giving redundant orders and consequently talking too much in the chat. +- Fixed pirates not always shooting monsters if there's only a few of them. +- Fixed bots not always trying to press the right button to interact with a door. +- Fixed bots getting stuck when trying to follow a target with some diving gear they don't have access to. Now they should self-dismiss the order instead. +- Fixed bots sometimes deploying Kastrull's drone for no reason. +- Improvements to cave waypoints: should fix bots getting stuck next to destructible ice chunks even if there's a way past them. +- Husks now remain neutral towards characters that are late in the husk transformation, unless they act offensively. +- Reduced Husk and Humanhusk sight from 1 to 0.5. +- Oxygenite shards are no longer oxygen sources and can't be inserted into diving gear or tools directly. They are still a source of liquid oxygenite, which can be used to craft oxygenite tanks. +- Added some dialog for the bots when they are getting attacked outside a friendly sub to tell the player why they are fleeing from an enemy and that they don't have a weapon. +- Fixed combat objective overriding the priority of find safety objective when the combat objective shouldn't even be active, leading to bots sometimes suffocating after combat if they don't have enough oxygen in the currently equipped tank. + +Misc fixes: +- Exploding the abandoned outpost reactor doesn't damage the player sub in missions that require destroying it. +- Hopefully occasional fixed fires/meltdowns at the start of a round. Was caused by the "warm start" logic that simulates 10 seconds of power grid updates at the start of a round: if the reactor wasn't running on auto or was controlled by some custom circuit, it wouldn't adapt to the changes in the grid load during those simulated 10 seconds, which could lead to overloads. +- Fixed blips not disappearing from the sonar when it's been repaired above 100% condition by using talents. +- Fixed Security Officer Uniform's and Gunner Uniform's icons being swapped. +- Fixed RegExFindComponent handling some inputs incorrectly. +- Fixed sprite bleed in the harmonica inventory icon. +- Fixed crashing when equipping a handheld status monitor that spawned outside subs. +- Fixed ruins sometimes extending above the top of the level. +- Fixed submarine editor failing to generate waypoints on stairs. +- Fixed submarine editor failing to connect some of the waypoints around the sub. +- Fixed non-localized list formatting in the "I need [treatment1], [treatment2] or [treatment3]" bot dialog. +- Fixed crashing if a mineral mission fails to find a long enough edge to spawn the resources on. +- Fixed one of the hulls not covering the whole room in the "Alien_MaintenanceTunnels1" module. +- Widen a gap in the "Alien_Entrance2" module to cover the full width of the hole in the wall. +- Removed non-interactable black wire from inside one of the terminals in Alien_Chasm2. +- Fixed pirate subs sometimes not withstanding the pressure in the level in the deeper biomes. +- Fixed diving gear not affecting the depth at which huskified humans' get crushed by pressure. +- Fixed characters with husk genes + husk infection becoming huskified when they die. +- Fixed the ragdolls breaking when characters with a harpoon/guardian spear (or any other projectile) attached to their body exits a submarine/ruin. +- Fixed harpoon rope pulling with excessive forces when the target is on a platform. +- Always snap the rope between the harpoon and the harpoon gun when the harpoon is detached from the target. Possibly fixes cases where physics forces from the rope are still applied when the projectile has dropped. Also applies to fractal guardians. +- Fixed physics glitches with guardian's tail when it switches subs or goes outside. +- Fixed characters sometimes getting teleported to an invalid position when they are exiting/entering the sub and have more than one swarm feeder latched on them. +- Fixed Kastrull and Typhon 2 using different id card tags than the rest of the vanilla sub ("idjob" instead of "id_job"). +- Fixed artifact transport cases not reliably suppressing thermal artifact fires. +- Fixed ability to stack batteries in wrecked charging docks. +- Fixed certain signal components (boolean operators, artihmetic, equals, trigonometric, string) triggering at the start of a round when they're set to a timeframe larger than 0.1 s. +- Fabricator drops the items inside the fabrication materials instead of consuming them (e.g. fabricating a combat suit from a normal one with a tank inside doesn't make the tank disappear). +- Fixed deconstructor destroying items contained in the deconstructed item if they can't fit in the output slots. +- Fixed lights becoming full-brightness for one frame when their color is set using the "set_color" input. +- Fixed turret lights' rotation being wrong for one frame when the light is toggled on +- Fixed shuttles docked to a shuttle docked to the main sub appearing on sonar in PvP. +- Fixed detonator's contained item position. +- Fixed Jovian Radiation bypassing all damage modifiers, including wearable items that protect from radiation. +- Fixed outpost reactors not accepting volatile fulgurium rods as fuel. +- Fixed some ugly first frames when populating certain listboxes (e.g. server list). +- Fixed spineling spikes given by spineling genes launching in an incorrect direction when the character is mirrored (= facing left) in multiplayer. +- Characters don't consume hull oxygen when their need for oxygen has been removed with thresher genes or pressure stabilizer. +- Fixed cigar and captain's pipe giving practically no psychosis resistance. +- Fixed being able to sell items from inventories of characters who are on the player's sub. +- Fixed occasional "Attempted to set the anchor B of a limb's pull joint to an invalid value" errors when dragging someone underwater. +- Fixed oxygenite tanks not being affected by gas vents in caves. +- Fixed items disappearing when trying to combine stacks of partially consumed items. +- Fixed upgrading devices' max condition causing issues with repairing: the repair thresholds were being treated as condition values instead of percentages, meaning that the devices would need to deteriorate more before they become repairable. +- Fixed ability to combine genetic materials in normal deconstructors. +- Fixed harpoon guns spawning with only 5 harpoons and stun guns with 1 dart. +- Fixed "bombscare" outpost event giving the characters xp for a non-existent "engineering" skill. +- Restrict downwards movement when a character has reached the bottom of a ladder to fix phasing through the floor. +- Fixed characters' feet dangling in the air when moving from a ladder to another (e.g. when climbing from the sub to the outpost). +- Adjusted flamethrower and prototype steam cannon particles to get them to match the range of the weapons more closely. +- Fixed most outpost modules being named as airlock and consequently defined as "wet rooms". Fixes bots still slamming doors and hatches on each others face while moving around in the outposts. +- Fixed portable pump consuming batteries when it's not pumping in/out. +- Fixed waypoint connections on Remora drone causing navigation issues for the bots. +- Fixed undocking a drone (e.g. on Remora/Kastrull) permanently breaking the navigation between the shuttle and the main sub. +- Fixed mudraptors and crawlers trying to swim to the bottom of the ocean. +- Fixed structures without a collider not being taken into account when determining which submarines are visible, causing them to vanish if there are only structures without a collider on the screen. +- Fixed Round and Ceil components returning -0 when rounding a negative value to 0. +- Fixed inability to swim up through a small hull on top of another one (e.g. the upper airlock in R-29). +- Fixed skillbooks, oxygenite shards and sulphurite shards not spawning in crates. +- Fixed name of the currently installed turret not being displayed in the submarine upgrade menu. +- Fixed AI gunners not shooting at visible enemies inside the enemy submarine. +- Fixed status monitor's electrical view not showing the power/load values in Korean. +- Fixed bots trying to equip a scooter when their hands are occupied by something that can't be put in the inventory (e.g. a crate), leading to weird twitching when they drop and immediately pick up the carried item. +- Bots stop moving before starting to repair a device. Fixes bots "flying away" when the repair fails, because they'd start the repair while still running at full speed and would keep the momentum if they get stunned because of the failed repair. +- Fixed looking at the sonar sometimes causing a significant performance hit (most often in the abyss). If a path to a marker couldn't be found when determining the distance to the marker, the game would keep trying to find a path every frame. +- Fixed Alien_Entrance3's left opening getting connected to other modules instead of being used as an entrance. +- Fixed coilgun draining ammo boxes at the same rate regardless of the number of linked loaders. +- Fixed some of the artifacts still playing sounds when inside a transport case. +- Fixed inability to put genetic materials into a container inside another container. +- Fixed characters' legs sometimes bending the wrong way around when climbing (seems to happen most often when trying to get on ladders while swimming up-side down). +- Fixed borked "Front E P2" collider. +- Fixed certain wires in vanilla subs being impossible to remove. +- Fixed gaps sometimes getting connected to incorrect hulls between docking ports, preventing water from flowing down from the space between the ports. +- Fixed mudraptor shell armor's sprite depth getting messed up when climbing ladders. +- Fixed drunkenness, opiate withdrawal and chem withdrawal not causing nausea. +- Fixed wire nodes getting misplaced in the sub editor when loading mirrored wires. +- Fixed campaign setup menu going crazy if you try to scroll it with arrow keys. +- Fixed handheld status monitor drawing the water levels and character icons of the previous sub when it's taken outside. +- Fixed spawnitem command not working in the sub editor. +- Fixed alien pistol not having a crosshair. +- Fixed weapon skill above 100 making weapons less accurate. +- Fixed cargo sometimes spawning inside the floor. Happened because the spawn position was determined based on the purchased item's size, instead of the crate the item spawns in. +- Fixed campaign getting "locked" if the submarine undocks immediately at the start of the round (on the first frame, e.g. as a result of some custom docking circuit). +- Fixed deconstructor being unable to combine the output items if they're inside a container in the output slots. +- Fixed misaligned outpost reactor meters. +- Fixed sprite bleed in the outpost computer terminal sprite. + +Modding: +- Fixed inability to override talent trees. +- Item variants try to load sprites from the base item's directory if the path isn't specified. +- Fixed crashing when trying to fire a projectile with no Attack configured with a turret. +- Made memory component's "writeable" field editable in the sub editor. +- Fixed all ruin generation params displaying "RuinGenerationParams" as their name in the level editor. +- Fixed PropertyConditionals with comparison type "And" that check a parent container's tags being very unintuitive to use because they checked the components of the item as well, not just the item object. +- Made several outpost store parameters editable separately for each location type (see locationTypes.xml). +- Fixed crashing when trying to create a non-humanoid that can walk in the character editor. +- Added a randomize button for level editor seed. +- Fixed fabricators without a repairable component crashing the game when activated. +- Fixed overriding a Controller component (e.g. button) resetting its Toggle and State settings. +- Fixed ParticleEmitter's angle not getting mirrored when spawned by a mirrored item. +- Fixed certain explosion flashduration values causing the light to flicker/loop. +- Allow the enemy AI to target using groups in addition to species names. +- Moved the turret ammo box definitions from containers.xml to where the gun and the ammo are defined. +- Fixed hulls' "hidden in game" setting doing nothing. +- Fixed certain items causing the "analyzeitem" and "deconstructvalue" console commands to crash. + +--------------------------------------------------------------------------------------------------------- +v0.15.13.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Remove spawnpoint-based job assignment logic. Previously, the number of job-specific spawnpoints in the sub affected how many players the server would try to assign to a given job, which would often lead to players not getting the job they wanted to. +- Made the captain job optional (i.e. if no-one has captain in their preferences, no-one gets forced to play as one). +- Improvements to the Korean localization. +- Added rewards to side objective missions (hunting grounds, beacon). +- Reduce Pyromaniac's burning damage increase from 40% to 25%. + +Fixes: +- Fixed clients' characters getting reset in the multiplayer campaign if they're spectating at the end of the round. +- Fixed crashing when an event set fails to load any of its sub events. Caused certain mods to crash the game at 42% in the loading screen. +- Fixed crashing on startup when using mods that remove the small icons from job prefabs. +- Fixed bots being unable to find their way to the submarine if the switch to the "find safety" state outside the sub. +- Fixed bots often being unable to find a way to leaks they're trying to weld. +- Fixed crashing when a monster was just about to turn to a husk when the round ends. +- Fixed opened item disappearing when switching to the test mode from the sub editor. +- Fixed Artie Dolittle's ID card not working in the player's sub after he's hired. +- Fixed category labels (sufficient skills to fabricate, requires recipe, etc) disappearing from the fabricator's item list when searching. +- Fixed prisoner's uniform using a wrong texture file. +- Fixed inability to edit pulse laser's power consumption in the sub editor. +- Fixed an exploit in Pressure Stabilizer crafting recipe. +- Fixed an exploit in Fixfoam Grenade deconstruction recipe. +- Fixed crashing when selecting a gene splicer and hovering over its inventory slot in the sub editor. +- Fixed bots being unable to use hardened and dementonite tools. +- Fixed a typo in Tinkering cooldown reduction description. +- Fixed inactive reactors electrocuting low-skill characters when rewired. +- Fixed ignore orders carrying over when switching subs, causing them to target random items in the new sub. +- Fixed dementonite knives being sold in stores. +- Fixed contained items' impact sounds being played when the item they're inside hits the floor. +- Fixed True Potential instant kills not properly giving kill credit (achievements, other talents). +- Fixed Gene Harvester incorrectly checking the owner of the talent's submarine rather than the killer's. +- Fixed certain talents not appearing to have an effect client-side, causing e.g. the high-pressure effects to appear when swimming outside with the Water Prankster talent. +- Fix Scavenger's buff duration multiplier. +- Fixed Insurance Policy not triggering properly. +- Fixed issues with input going through interfaces drawn over inventory slots. +- Fixed bots trying to treat talent afflictions. +- Fixed player-controlled creature attacks sometimes not hitting characters when they should. +- Fixed "x in command room" spam when dragging and dropping orders in multiplayer. +- Fixed pirate missions not being considered completed if any of the pirates have been removed (e.g. eaten or despawned). +- Fixed high-quality items not stacking in the fabricator's output slot. +- Fixed ice shards' colliders taying active after the shard has shattered. +- Fixed bots following the controlled character instead of the order giver in singleplayer. +- Fixed purchased medals spawning on the floor. +- Fixed vision obstruction effect "flickering" when moving the cursor around when an item UI is open. +- Fixed some pumps in Dugong having 0 power consumption. +- Fixed pumps deteriorating when they don't have power. +- Fixed batteries/supercapacitors deteriorating when not charging/discharging. +- Fixed afflictions applying face/body tints on monsters. +- Fixed "select matching items" selecting all gaps if you've selected both a door and its gap in the sub editor. +- Fixed door gaps not being selected if you use "select matching items" on a door in the sub editor. +- Fixed biome ambience loop volume not being affected by the sound volume setting. +- Fixed players wearing a PUCS not using up hull oxygen when no tank is equipped. +- Fixed bots getting stuck on long outpost ladders. +- Restored the sounds for legacy fractal guardians. Fixes console errors when they are spawned/viewed in the editor. +- Fixed Reactor PDA showing hidden and non-interactable reactors. +- Fixed welding tool scale being forced to 0.5. +- Fix crew list content being repositioned when selected character was hovered. + +Modding: +- Made deconstruction recipes' mincondition accept items whose condition equals to the mincondition, not just items whose condition is higher. +- Fixed color values being used incorrectly in explosion flashes. + +--------------------------------------------------------------------------------------------------------- +v0.15.12.0 +--------------------------------------------------------------------------------------------------------- + +- Slightly increased the amount of experience given by missions. +- Fixed crashing when a monster gets huskified. +- Fixed crashing when a client tries to deactivate the husk infection of a character that's been removed. +- Fixed crashing in EnemyAIController.UpdateFollow. +- Fixed console errors when an electrical discharge coil damages a monster that gets instakilled and disappears on death (e.g. swarm feeder). + +--------------------------------------------------------------------------------------------------------- +v0.15.11.0 +--------------------------------------------------------------------------------------------------------- + +- New icons for the new ruin missions. +- Slightly reduced the amount of experience given by missions and increased the amount of experience required to unlock a talent point. +- Made escort missions more common. +- The creature attack keybind is automatically switched from R to the new default keybind F when loading up the new update for the first time. +- Fixes to ruin waypoints. +- Fixes to outdoors pathfinding. +- Fixes to fractal guardians' aiming. + +--------------------------------------------------------------------------------------------------------- +v0.15.10.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed character skills reducing after every round. +- Fixed psychosis artifact doing burn damage when picked up. +- Fixed a bunch of pathfinding issues when bots are trying to navigate out from the ruins and/or return back to the sub. +- Fixed bots not being able to swap oxygen tanks in the ruins. +- Fixed railgun lights having an excessively high power consumption, causing them to immediately drain the supercapacitors. +- Fixed occasional crashes when clearing the item search bar that is already empty in the status monitor. +- Fixed ruin generator sometimes leaving empty space between some of the modules and the hallways connected to them. +- Fixed alien gas vents affecting the monsters inside ruins. +- Fixed background wall not extending all the way to the edge of one of the outpost docking modules. +- Fixed harpoon rope sometimes being drawn when it's already snapped. + +--------------------------------------------------------------------------------------------------------- +v0.15.9.0 +--------------------------------------------------------------------------------------------------------- + +Alien ruin overhaul: +- Overhauled ruins: completely remade sprites, monsters, layouts, items and puzzles. +- New Scan mission: scan an Alien ruin by placing down provided scanners at target locations and take the scanners back to the outpost. +- New Alien Ruin mission: kill the guardians inhabiting the ruin and destroy their pods. +- Added an additional ambience track for the ruins. + +Character overhaul: +- Completely remade character sprites, ragdolls and animations. +- Option to customize the starting crew in the single player campaign. +- More customization options (skin, hair and facial hair colors, more accessories). +- Added a button to randomize character appearance in the character customization menus. + +Health system improvements: +- Streamlined the health interface. +- Allow administering meds by clicking on the "suitable treatments" suggestions in the health interface. +- The health interface displays a prediction of how much a medical item will reduce/increase the afflictions when hovering the cursor over one. +- Certain afflictions can make the characters' face or body change color. +- Physical injuries to the head can cause concussions. +- Improvements to the blood particle effects when a character is bleeding. +- Damage to arms reduces aiming accuracy. +- Crippled legs slow the player down more. + +Talent system: +- The new talent system allows you to unlock things such as special skills, buffs and fabrication recipes in the course of a campaign, with experience points gained from completing missions. +- Three different talent trees for all the character classes. +- Dozens of new items. +- Item quality system: certain talents allow you to fabricate higher-quality versions of items. +- Characters lose some skill points when respawning mid-round. The talent system makes it easier to gain skills and permanent improvements to the character, and this change is intended to balance that out. + +Overhauled status monitor: +- Improved visuals. +- Indicates the locations of the crew's ID cards. +- Indicates the locations of alerts. +- Electrical view, indicating locations and health of junction boxes, reactor and batteries. +- Allows searching for items and indicating the hulls in which they're located. + +Balance changes: +- Reduced loot in wrecks. +- Difficulty affects the amount of loot. +- Reduced the amount of weapons and grenades in wrecks, pirate ships and abandoned outposts. +- Disabled stacking quality-based items (experimental change, feedback is welcome). +- Reduced diving suits damage resistances. +- Buffed vigor and haste. +- Modified characters' base vitalities. +- Adjustments to monster stats. +- Reduced mission experience gains, level difficulty affects mission experience. +- Made welding tools a bit less effective early to compensate for increases to their effectiveness from quality/talents. +- Upgrade system reworked to work better in conjunction with new talents and quality systems. Quality of life upgrades made better or cheaper, hull upgrades are less effective towards the lategame but are better early, reorganized categories. +- Diving suit and human ragdoll damagemodifier changes: the suits now offer less protection, but humans have a bit more natural protection towards physical damage types. +- Adjustments to outpost distribution: natural formations greatly reduced in the 1st zone, cities slightly reduced in the 1st zone, outposts (including specialized ones) increased in the 3rd and 4th zone. +- Made magnesium a little more common in stores and wrecks. + +Additions and changes: +- Gene splicing. You can find alien genetic material inside ruins (and for the time being, wrecks), and use these materials to gain special abilities and buffs. The materials can be processed using a Research Station (which atm can be found in research outposts) and applied on a character using a Gene Splicer. +- Added a new "Return" order for ordering bots to return back to the main submarine. +- Bots can now use level waypoints to help them navigate around when they are outside the submarine. +- Play editor music in the multiplayer lobby. +- Option to specify the amount of items to spawn with the "spawnitem" command. +- Optimized cave vent and ballast flora spore particles. +- Added a 5 second "cooldown" before a junction box broken by overloading can take damage from overloading again. Prevents continuous fires and particles when continuously repairing an overloaded junction box. +- Small monsters don't eat the inventory contents of a character they're eating (the items drop instead). +- Disabled new status monitor features from handheld status monitors. +- Round water and oxygen percentage readings on the status monitor (e.g. 99.999998% shows up as 100% instead of 99%). +- Adjustments to how far creatures can see and hear the submarine and it's devices from. Moving fast now makes more noise, moving slowly less, and the monsters can't see the sub from as far as before. Effectively it should now be more viable tactic to shut the engines down and keep silent. +- Reduce sonar ping's sound range from 10000 to 8000 to make it possible to spot (some) monsters before they target the sub. +- Made a couple of monsters unable to eat characters (hammerheads, terminal cells, leucocytes, molochs, spinelings and watchers). +- Changed default creature attack key to F because R conflicts with the radio keybind. +- Disabled toggling the sonar mode by pressing the Run key. +- Added condition_out pin to various items. +- Bots no longer ignore unconscious targets that regenerate health (i.e. they will finish off downed husks to prevent them from getting back up again). +- Fabricating fuel rods now requires electrical skills instead of mechanical. +- Reactor now requires electrical skills instead of mechanical to repair. +- When the status monitor receives the oxygen/water level for a hull, it registers it on all the linked hulls as well (-> no need to put an oxygen/water detector in all the hulls of a multi-hull room). +- Removed the "burndamage" damage type (not the same as "burn") that was added as a temporary workaround to allow pulse lasers to bypass monster's damage modifiers. +- Changed the look of the skill/xp notifications to accommodate the larger numbers of notifications you can get from talents and skillbooks. +- Added a fabricator and deconstructor to Azimuth and slightly lowered its maximum speed. +- Increased Azimuth's battery out relay max power. +- Temporarily disabled magnesium exploding in water to prevent issues with talents related to it. +- Added "targetlimb" argument to the giveaffliction command (allows applying the affliction to a specific limb). +- Players who wander inside a respawn shuttle don't get automatically killed when the shuttle despawns if they weren't part of the respawning crew. +- Bots no longer ignore severe fires in reactor, engine, or command rooms. The intention for them ignoring the severe fires was to prevent unwanted casualities when the fire can be left untreated and wait for it to fade out when not ordered to extinguish fires. +- Buffs are transferred to AI-controlled husks when a character transforms. +- Projectiles shift to the left in multi-slot loaders when firing. +- Option to make terminals use a monospaced font. +- Player-controlled monsters can now grab and eat bodies. +- Added triangle and sawtooth wave types to oscillator component. +- Added "high_pressure" output to water detector. +- Water detectors round the water percentage output up, so any amount of water will be at least 1%. +- Focus on the password field automatically in the server password prompt and allow submitting it with enter. +- Made pirates a little less accurate when they're operating turrets: they can no longer magically aim exactly at characters inside another sub. +- Biome noise loop volume is tied to sound volume instead of music volume. +- Endworms no longer always bleed to death when their tail is cut. +- Lever state is visualized on its sprite. +- Enabled NVidia Optimus on Windows. + +Fixes: +- Removed duplicate welcome messages from humpack's terminal. +- Fixed start and spectate buttons shrinking in the server lobby every time they're hidden and re-enabled. +- Fixed contained items inside contained items not moving when repositioning a container in the sub editor (e.g. when moving a weapon holder that contains a weapon with a magazine). +- Fixed issues with inaccurate tooltips and incorrectly blocked out order nodes in character-specific command interface. +- Fixed contained items' status effects appearing at the top-left corner of the container if the contained items are not visible (e.g. particle-emitting fuel rods would emit the particles from the top-left corner of the reactor instead of the center). +- Fixed hanging wires not getting selected when selecting the items they're connected to. +- Fixed "divide by zero" console error when scaling construction barrier. +- Fixed ability to wire items between two submarines as long as you stay inside the same sub. +- Fixed crew list background blocking mouse input (again). +- Fixed crashing when the majority of the players are controlling characters belonging to a non-player team while the sub is at the end of the level (e.g. if you're alone in the sub and take control of a monster with console commands). +- Fixed cargo missions sometimes only rewarding the players for 1 crate even when transporting more. +- Fixed the "use as treatment" tooltip showing up when trying to drop an item that can't be used as a treatment on the health interface. +- Fixed characters in the transition phase of a husk infection (i.e. after the stinger has appeared) getting stunned at the start of every round. +- Fixed inability to adjust max mission count in a dedicated server. +- Fixed light components staying powered indefinitely when in a container or inventory (didn't seem to be noticeable on any other vanilla items than sonar beacons, which stayed active indefinitely). +- Fixed some outpost events being possible to activate even if the target NPC is dead. +- Fixed ability to swap contained non-interactable items. +- Fixed crash when loading a container that has no containable restrictions and contains items (e.g. if you put items in a deconstructor and start a new round). +- Fixed bots not swapping oxygen tanks when they are outside and going to a target that is inside. +- Fixed issues with bot combat behavior when outside the submarine. +- Fixed ability to hold 2-handed items with one hand by trying to insert them into an occupied slot in a container that can't hold the item. +- Fixed misaligned nav terminal and status monitor in pirate humpback. +- Fixed inability to install/update mods that have periods in the name. +- Fixed nav terminals "current_position_x" output being in pixels when "current_position_y" is in meters. +- Fixed minerals sometimes spawning in unreachable spots in mining missions (on cells that are next to a cave, but at the wrong side of that cell if there's empty space behind it). +- Fixed items' "allow swapping" property being editable in-game. +- Fixed RegEx components with a non-continuous output always sending a signal out after being loaded. +- Fixed pirate subs sometimes spawning inside floating ice chunks. +- Fixed tracer particles not starting from the position of ranged weapons' barrel. +- Fixed inability to open the pause menu when the cursor is over an inventory slot. +- Fixed handcuffs dropping off from characters' hands when they die or turn into a husk. +- Fixed loadsub command. +- Cap the amount argument of the spawnitem command to 100 to prevent freezing/crashing when trying to spawn a ridiculous amount of the item. +- Fixed "infiltration" event getting stuck on one of the conversation options. +- Fixed signal source being wrong on delayed electrical signals (= signals that were delayed for the next frame after they'd passed through 10 steps). Most noticeably affected status monitors that need to know which oxygen/water detector a signal came from. +- Fixed WifiComponents delaying the signals based on the number of receivers, not how many steps the signal has actually taken, contributing to the previous issue. +- Hopefully fixed an oversight in the sub editor where changing ItemComponent colors with the HSV picker would create an error in the console. +- Fixed paralyzant (and many other meds that don't do direct damage) not triggering guards. +- Fixed sonar monitor's UI being unnecessarily small. +- Fixed contained items inside contained items (e.g. magazines in a rifle on a weapon holder) not rotating in the sub editor. +- The overdosed NPC in the "good samaritan" event can't die until the player has triggered the event (completing the event after the NPC had already died made no sense). +- Fixed console errors when an item a bot has been ordered to target was removed between rounds (e.g. an ignore order targeting a mission item that gets removed at the end of the round). +- Fixes to oxygen generator logic: the generator now periodically recalculates how to distribute the oxygen between the vents, as opposed to doing it once at the start of the round. Just doing it once caused issues if there were e.g. vents or doors that are initially open between the rooms. +- Fixed outpost events always unlocking the same escort mission. +- The hints about flooded rooms and ballast flora aren't shown in ruins, wrecks or enemy subs. +- Fixed "stowaway" event triggering an event cooldown, preventing monsters from spawning at the beginning of the round. +- Fixed clients (excluding the host) always considering friendly fire to be disabled, leading to minor cosmetic desyncs when a player applies afflictions on another one (i.e. there was a brief delay before the afflictions update client-side). +- Fixed inability to apply buffs on the crew when friendly fire is disabled. +- Fixed ItemContainers only applying the StatusEffects from the first matching Containable, even if there's multiple. Prevented the artifact-specific effects of artifact holder from executing. +- Fixed "giveaffliction" command's limbtype argument not working in multiplayer. +- Fixed "linesperlogfile" server setting doing nothing. +- Fixed discharge coils not working when triggered by via a wired button. +- Fixed hatch waypoint and platforms on Remora Drone. +- Memory usage optimizations. +- Fixed bots shooting enemies even when there's a friendly sub between them and the target. +- Bots take their masks off when if they have successfully equipped a suit. +- Fixed a pathfinding issue in Remora caused by too sparse waypoint distribution. +- Fixed disguises not changing the color of a character's name when hovering the cursor over the character. +- Fixed monsters' attack sounds never playing in multiplayer. + +Modding: +- Implemented an item variant system that works similar to the character variants: you can create new items that inherit the properties of another item and only modify specific aspects of it, reducing the amount of duplicate XML code. See "Depleted Fuel Rod" in engineer_talent_items.xml for an usage example. +- Option to configure minimum damage for OnDamage status effects that require a specific type of affliction (see the "vigor on damage" affliction for an usage example). +- Option to make afflictions draw a full-screen overlay when active. +- Option to make property conditionals target contained items using the attribute targetcontaineditem="true". +- Added support for tileable light textures for Structures by using XML element that has the same syntax as does for Items. +- Added "InPressure" property to characters. +- Fixed hidden items appearing in the job loadout preview if there are other items of the same type that are not hidden (didn't affect any vanilla loadouts). +- Removed error message when trying to transfer items to a husk monster and inventory sizes don't match +- Submarine upgrades can be disallowed by category instead of having to do it separately for each upgrade in the sub editor. +- Fixed a modding related crash when trying to apply a property value of a wrong type using status effects. +- Option to create custom husk infections where player control carries over to the transformed creature. +- Display a console warning when an item's deconstruct output defines an out condition and is also set to copy the condition of the deconstructed item. + +--------------------------------------------------------------------------------------------------------- +v0.14.9.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed an exploit that allowed modified servers to send malicious campaign save files to clients. + +--------------------------------------------------------------------------------------------------------- +v0.14.9.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- If multiple turrets have been linked to the same loader, the turrets can't be swapped individually (both need to be swapped at the same time to prevent turrets from getting linked to an incorrect type of loader). +- Emergency lights don't cast shadows by default (they have such a short range that disabling the shadows usually doesn't make a difference visually, but improves the performance of the subs). +- Allow closing the submarine previews with esc. +- Made ballast pumps in Kastrull's drone indestructible (because they're impossible to access without breaking the walls/floors). +- Made exploding coilgun ammo more expensive and increased the capacity of the ammo boxes a bit. +- Made pirate subs immune to ballast flora. +- Security's stun guns spawn fully loaded. +- Reduced escort missions' base commonness. Doesn't have an effect in the campaign because the commonness is defined in the mission events, but fixes escort missions being much more common than other mission types in mission mode. +- Destroying a reactor with explosives depletes the fuel rods. +- Hide the equipment slots and character portait in wiring mode. +- Added platforms behind Remora Drone's hatches. + +Fixes: +- Fixed enemies sometimes not spawning at all during a mission. Happened when the game selected the "stowaway" event to occur during the mission. +- Fixed pirate and escort missions not being available from late-game outposts. +- Fixed occasional "unauthorized multithreaded access to RandSync.Server" errors when starting a pirate mission in multiplayer. +- Fixed crashing with a "E_INVALIDARG" SharpDXException if an ice spire happens to generate on a very short level wall edge. +- Fixed crashing when trying to spawn inventory items for a character who left before respawning during the previous round. +- Fixed batteries always recharging at "full speed" when not full, regardless of how much power is being drawn from the battery. E.g. a battery that's only connected to a lamp drawing 5 kW of power would always recharge at the full 500 kWmin. +- Fixed traitor items sometimes spawning in non-interactable or hidden containers. +- Fixed turret rotation limit widgets working unreliably in the sub editor. +- Fixed barrels being misaligned on scaled turrets in the sub preview. +- Stores don't offer/request sealed supply crates as daily specials. +- Fixed campaign settings (radiation enabled, max missions) resetting when reopening the campaign settings menu. +- Fixed hitscan projectiles not hitting structures outside hulls when the turret itself is inside a hull. +- Fixed inability to swap items between the character's inventory and a container in some situations in multiplayer (when the container was right at the edge of the character's interaction range). +- Fixed bots being unable to repair the pump in Typhon's bottom airlock. +- Fixed crashing when repairing or fabricating something as a husk (or some other character with no CharacterInfo). +- Fixed crashing when reviving someone using CPR as a character with no CharacterInfo (e.g. husk). +- Fixed upgrades using the original value from a previous item when swapping to a new one (e.g. swapping a railgun to a coilgun sets the power consumption to the railgun's power consumption). More specifically, this happened when the campaign was saved and reloaded after purchasing the upgrade, and the item was swapped after that. +- Fixed wrecks sometimes being positioned right side of the exit position. +- Fixed characters not getting knocked down at the last stage of husk infection if they have the Vigor buff. +- Fixed discharge coil triggering when trying to rewire it. +- Fixed some ActionTypes having the same value (e.g. OnFire == OnDamaged). Caused wrong type of status effects triggering in some cases, for example OnDamage effects when an indestructible thalamus organ is on fire. +- Fixed items that are set to be hidden in-game being visible in the sub preview. +- Fixed bots being unable to weld leaks that are too high above them, even if they're actually in reach. Happened because the distance to the leak was calculated relative to the character's position, even though the range of the welding tool is relative to the character's shoulder. +- Fixed cargo mission rewards being displayed incorrectly when there's multiple cargo missions selected and not enough capacity for all the cargo. +- Fixed caret getting misplaced when clicking on a textbox with padding. +- Fixed headset only being able to send signals to each wifi component once. +- Fixed bots sometimes ignoring broken devices. Happened when another bot had selected the device as their repair target, even if the bot was currently repairing something else. +- Fixed nav terminal labels sometimes being draw under linked status monitor HUDs. +- Fixed bots sometimes not fixing airlock doors/hatches. More specifically, doors whose center point was outside a hull. +- Fixed medic bots grabbing the target and never letting go when there's no suitable treatments available anywhere in the sub, or when they're in an outpost and not carrying any suitable treatments. +- Fixed bots suffocating when they run out of oxygen tanks if ordered to wait wearing a suit. +- Fixed ability to select other items when operating periscopes. Didn't cause problems in vanilla subs, but in custom subs where the turret was placed close to the periscope and other interactable items, it was possible to accidentally select something else when trying to fire. +- Made nav terminal's "velocity_in" input change the target velocity, not just the steering input, making it possible to adjust the velocity with signals when using autopilot. +- Fixed text fields in a component's editing menu not refreshing until you've interacted with another component. +- Fixed ruins sometimes overlapping with level walls (when they happen to spawn next to a very large cell). +- Fixed ability to "partially open" the health interface in the sub editor, causing the inventory layout to get messed up when clicking on the character portrait even though the health interface isn't drawn. +- Fixed ability to keep dragging an item from a stunned/ragdolled character's inventory after they get back up. +- Fixed nuclear weapons not damaging ballast flora. +- Fixed normal uniforms deflecting projectiles even though they shouldn't. +- Fixed clients who've opted to spawn with reaper's tax getting a new character if the round ends before the client respawns. +- Fixed occasional crash with the error message "collection was modified; enumeration operation may not execute" when loading mods on startup. +- Fixed ability to keep dragging the previously equipped wire in the sub editor after you equip another wire with the wire hotkeys. +- Fixed characters' sprite depth changing during the "autowalk" towards a bed or chair. +- Require the sub to move a bit faster to crush characters between the sub and a wall. Previously essentially any non-zero velocity was enough to crush a character, even if the sub didn't appear to move. +- Fixed nests sometimes getting placed outside caves. Happened when the game tried to position the nest above an opening at the bottom of the cave. +- Fixed inability to use the health interface on the escorted characters. +- Fixed 1st client (usually the host) always spawning at the same spawnpoint in multiplayer even if there's multiple suitable ones available. +- Fixed stacked partially used items (e.g. stacked explosives that have been damaged) dropping from character inventories at the start of a round. +- Fixed occasional freezing when replacing lost shuttles after purchasing submarine upgrades. +- Adjusted Endworm's colliders so that you can't hit the tail between the armor segments before first breaking the armor (making it less easy to cut the worm in half). +- Fixed hull properties not carrying over when copying hulls in the sub editor. +- Fixed occasional "collection was modified" exception in CargoMission.DetermineCargo. Happened if the client received an updated campaign save while trying to load the sub between rounds. +- Fixed a broken waypoint in Berilia's cargo bay. +- Fixed seeds sometimes vanishing when trying to plant them in MP. +- Fixed planter boxes displaying the "uproot" message when empty. +- Fixed depth charges going through doors and hatches. +- Fixed ability to dock docking hatches to ports and vice versa. +- Fixed camera being able to focus on a turret when a periscope's "position_out" connection is wired to a turret's "power_in" connection. +- Fixed water detectors not detecting very small (water depth < 1px) amounts of water in hulls. +- Fixed duffel bags not spawning at the end of a round if the character hasn't despawned/respawned yet (i.e. if the character's corpse is still present in the sub). +- Fixed wrecked Dugong's distress signal being impossible to receive due to "allow cross-team communication" being set to false on the wifi component sending the signal. +- Fixed fabricator being unable to stack empty items in the output slots, preventing empty tanks from being fabricated when the output slots are occupied even if additional tanks could be stacked on them. +- Fixed messed up "Shuttle Shell A Glass A" sprite. +- Fixed delay components not working if the delay is set to 0. +- Fixed loaders getting slightly misaligned when swapping an empty hardpoint with some weapon. +- Fixed pumps placed in the sub editor being off by default. +- Fixed weapon skill increases not being capped according to the max vitality of the target. Resulted in enormous weapon skill gains when doing massive amounts of damage (more than the target's max vitality), e.g. by shooting a hammerhead matriarch in the egg sack with a nuke. +- Fixed ability to delete vanilla beacon stations and pirate subs in the sub editor. +- Fixed pirate subs sometimes spawning in side paths that are too narrow for the sub to pass through. +- Fixed an exploit that allowed creating game-crashing infinite signal loops using wifi components. +- Fixed a typo in the abyss diving suit description (100,000 m -> 10,000 m). +- Fixed several vanilla sub docking hatches requiring a welding tool instead of a wrench to repair them. +- Fixed "Operate Weapons" order being available when interacting with a turret directly, leading to a crash when trying to do so. +- Fixed missions disappearing from abandoned outposts after finishing the campaign. +- Fixed canister shells refilling automatically between rounds. +- Fixed turrets working with incorrect loader types (e.g. coilgun being able to fire laser bolts when linked to a pulse laser loader). +- Fixed "exterior pressure exceeds diving suit capabilities" hint popping up when carrying a diving suit. +- Fixed biome noise loops still playing after the round ends. +- Fixed detonator rapidly draining condition from flash powder and incendium instead of exploding them immediately (potentially resulting in partially used items). +- Fixed exploit in plastiseal crafting recipe (plastiseal deconstructing to 1 bandage even though 1 bandage can be used to craft 2 plastiseal). +- Fixed RepairTools applying their effects multiple times to items whose bodies consist of multiple fixtures. Caused minerals to get deattached 3 times faster than they should. +- Fixed AFK kicks when staying in any of the campaign UIs (store, etc) or other input-blocking menus for too long. +- Fixed monsters sometimes targeting owners of targeted items although the owner is ignored. +- Fixed some items held in the left hand rendering in front of the character's thigh. +- Fixed characters being focusable through UI elements (e.g. item interfaces), causing accidental interactions when the NPC interaction key is bind to LMB. + +Modding: +- Added support for "additive" event sets which get added on top of another normal event set, allowing mods to spawn additional types of monsters without having to touch the vanilla event sets. See the "transitevents" event set in OutpostEvents.xml for an usage example. +- Fixed subs appearing to disappear after being published in the Workshop, because the content package the sub gets moved to wasn't automatically selected. +- Fixed MaxTargetsToHit not working on hitscan projectiles. +- Fixed offsets not being taken into account when positioning contained items, causing status effects to happen at the position of the container instead of the position of the contained item. Didn't have a noticeable effect in the vanilla game because most contained items are positioned close to the container's origin. +- Fixed spawnpoint's job restrictions being ignored when spawning pirates and escortees. +- It's now possible to use multiple equipped WifiComponents at the same time: instead of finding the first equipped item and seeing if it can receive/transmit, the game now goes through the items until it finds one that can. +- Fixed crashing when trying to pick an item that can't be put in any type of inventory slot from a container. Doesn't happen in the vanilla game because there are no such items in any container. +- Fixed crashing during wreck generation if there's any thalamus organs outside hulls. +- Fixed crashing if a wall whose max health is set to 0 in the sub editor takes damage. +- Fixed crashing if a reactor's maximum output is set to 0 and it's set to be on by default. +- Fixed a crashing due to a null reference exception if a status effect uses "target" instead of "targets" or "targettypes" in the definition. +- Fixed shuttles docked to a wreck undocking during level generation. + +--------------------------------------------------------------------------------------------------------- +v0.14.6.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed "entity not found" errors when receiving attack data for a character that's been removed (most often a terminal cell). +- Fixed occasional "mission equality check failed" errors when starting a round with multiple missions selected. +- Fixed outpost events not triggering in levels with a difficulty between 40-41. +- Fixed hunting grounds missions only spawning endworms. +- Fixed 2nd part of the Jacov Subra event chain not triggering. + +--------------------------------------------------------------------------------------------------------- +v0.14.5.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed deconstructing chaingun/laser ammo boxes not giving back aluminium. +- Fixes certain particles (e.g. flare) "dragging behind" inside moving subs. +- Fixed Typhon 2's railgun not being connected to the loader. +- Fixed occasional "failed to read event for xxx" errors when syncing a pirate's AI state in multiplayer. +- Fixed atan components working unreliably when using the separate x/y inputs. +- Fixed missing prisoner outfit sprite. +- Crates pre-placed into a submarine's cargo containers or ULD's aren't taken into account when calculating the cargo capacity to display in the submarine preview. +- Fixed limbs getting automatically deselected in the health interface when receiving a new affliction (most noticeable when trying to heal an affliction that's being continuously applied on the character, e.g. burns caused by radiation). +- Added a missing hull to beacon station's airlock room. +- Fixed inventory toggle button being rendered in the top-left corner of the screen when grabbing a character with a 0-capacity inventory (such as a hatchling). +- Fixed an exploit that allowed crashing the game using certain looping circuits that involve trigonometric function components. +- Removed underwater explosion particle effect when vomiting underwater. +- Fixed screen noise effect cutting from white to black with no blending when the oxygen low affliction kicks in while the white noise effect (e.g. radiation sickness) is active. +- Fixed ability to set the reactor's turbine output or fission rate outside the allowed range of 0-100 using the "set_fissionrate" and "set_turbineoutput" inputs. +- Fixed crashing when opening the weapon customization menu when there's non-swappable turrets in the sub. +- Fixed misaligned light sprites on nav terminal and status monitor. + +Modding: +- Fixed crashing when trying to create a thalamus when there's no wreck AI configs available in the selected content packages. + +--------------------------------------------------------------------------------------------------------- +v0.14.4.0 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Submarine weapons can be swapped in the outposts. +- Added Pulse Laser and Chaingun. +- Added Canister Shells (a reloadable burst-type munition for the railgun). +- Added escort missions. +- Added pirate missions. +- Option to choose multiple missions per level. +- Made it possible to sell items on the sub through a new store tab in singleplayer. +- Cargo now spawns in crate shelves and "Unit Load Devices" (large containers mostly used in cargo subs). The amount of cargo you can transport depends on the number of the shelves/ULDs, and the cargo mission rewards scale according to the cargo capacity. If there's no shelves or ULDs, you can still transport a small number of crates on the cargo room's floor like before. +- Made upgrades affect all submarines. Old purchased submarines will have their upgrades overridden by the currently loaded submarine's upgrades. +- The previous music track continues playing when the game switches back from the "intensity tracks" to normal music. +- Made it possible to carry diving suits and toolbelts in hands. We could use some feedback on the way this works: is it intuitive, should there be a separate key for picking them up...? +- The ice shards and exploding mushrooms in caves can be destroyed with weapons and explosives. +- Added tracer particles to raycast projectiles (hitscan). +- Increased sonar beacon range. +- Color character names according to the team when using the Health Scanner HUD. +- Allow combining elastin. +- Character orders and ignore orders now persist between rounds and saved sessions. +- Added indicators for the tasks the bots are currently doing when they are not following the orders. +- Revisited the random (monster) events: more Watchers and Tigerthreshers, less Crawlers. Fixed a number of issues. Feedback appreciated. (WIP) +- Numerous fixes and improvements on particle effects. +- Changed how autonomous steering objective works. Captains now idle near the helm instead of standing next to the nav terminal. +- Only show the "Save and Quit" button when the game can be saved. Renamed the button in the lobby to "Quit". Saving in multiplayer is done like in single player: on level transitions and on exit from an outpost. +- Updated sounds for Endworm and the electrical discharger. +- Increased the stun of smg rounds from 0.125 to 0.15 to give it a bit more stopping power. +- Lowered Husks' health regeneration and bleeding reduction. Crawler Husks now regenerate too. Lowered their health a bit to compensate it. +- Hammerhead and Golden Hammerhead: Increased health, added some protection on claws and the tail end. Slightly increase the slow swimming speed and animations. The claws don't break anymore when shot with coilgun. +- Hammerheads and Husks don't avoid gun fire anymore. Pets now avoid gun fire. +- Removed Endworm's weak point in the mouth. +- Most outpost events no longer trigger automatically, but require interacting with a specific item/character. +- Taking items that contain stolen items counts as stealing, so you can't for example put a toolbox inside an outpost cabinet, load it full of items and then take it. +- Added a button for resetting in-game hints to the settings. +- Mention diving suits' depth limits in their descriptions. +- Modified the locked path tooltips to mention the officer in the outpost. +- Reset reactor fission rate, turbine output and temperature to optimal levels at the start of a round. Prevents the reactor from catching fire at the start of a round if it was being operated at a high fission rate at the end of the previous round. +- Removed ability to drag and drop seeds into planters. +- Added ability to load .sub, .xml, .png and .jpeg files in sub editor by dragging and dropping them onto the game window. +- Added new biome-specific background noise tracks. +- Improved the command interface minimap view by adding connector lines between icons and item positions to better visualize which item each icon is linked to. +- Projectiles go through severed limbs. +- Docking ports can't be rewired in outpost levels because it can be abused to force to submarine to depart from the outpost. +- Allow clicking on the main menu buttons when the credits are open. +- Option to adjust motion sensor's update interval in the sub editor. + +Fixes: +- Fixed clients timing out at the start of a multiplayer round if loading the campaign save takes more than 30 seconds. +- Fixed previous missions still being available in outposts that have become abandoned due to radiation. +- Fixed eggs sometimes spawning partially inside walls in abandoned outpost missions. +- Fixed thalamus walls' colliders still being present even if the wreck doesn't contain a thalamus, preventing entering the sub from places where thalamus walls used to be. +- Fixed minerals sometimes not being mineable in outposts. +- Fixed small characters being unable to avoid the edges of the hulls when idling. +- Save submarine and characters' inventories when saving and quitting an mp campaign round in an outpost. +- Marked "control" console command as a cheat. +- Fixed items sometimes disappearing client-side when the server corrects their position from outside to inside. +- The traitor mission to sabotage the engine doesn't require sabotaging shuttle engines. +- Stacks of seeds can't be put into planters. +- Fixed non-repeatable events (e.g. mission events) no longer appearing after completing the campaign. +- Fixed security officers using head set batteries when their stun batons are out of batteries, causing them to be unable to hear or receive orders (#5681). +- Fixed security officers often handcuffing you after one hit with stun baton (#5649). +- Fixed ignore orders not being properly synced when joining a multiplayer game mid-round. +- Fixed abyss monsters not spawning if there's any player sub (including the respawn shuttle) above the abyss. +- Fixed "are you sure you want to depart without a mission" prompt popping up even if there's no missions available. +- Fixed health bars showing up through walls. +- Fixed horizontal docking ports sometimes docking from the wrong side in mirrored subs. +- Fixed mouse wheel zooming the nav terminal view when the server log (or any other UI element) is blocking it. +- Fixed campaign's initial text popup getting stuck if the sub automatically undocks at the start of a round. +- Non-empty items (ammo boxes, fuel rods, etc) can't be recycled. +- Made airlock door assembly behave a bit more reliably. The circuit in the assembly simply toggles the state of both doors, meaning that one of the doors needs to always be closed and the other open for the logic to work correctly. If using the assembly in a respawn shuttle, it'd break when the shuttle leaves and it's doors are forced to close. +- Fixed inability to go through docking ports when the door/hatch at the other side is broken. +- Fixed other entities' sprites disappearing when reloading a sprite in the sub editor. +- Fixed Remora drone's docking hatch being repairable with a welding tool instead of a wrench. +- Fixed some of Remora drone's walls being transparent. +- Fixed rotation of mirrored items getting messed up when saving and reloading a sub. +- Fixed inability to detach items attached outside the sub. +- Fixed items that are inside a hull being difficult to target from outside the sub (docking ports/hatches in particular). +- Fixed crashing when trying to load a campaign save that contains pets that can't be found (e.g. if you've saved while using a mod that adds custom pets and try to load the save in the vanilla game). +- Fixed crashing when trying to change a location's type to a type that can't be found (e.g. if a mod includes custom location types which are configured incorrectly). +- Fixed "Ignore This" order affecting all NPCs. It should only affect the bots in a player team. +- Fixed "Ignore This" order restricting player access to doors. +- Fixed bots targeting same targets when fixing/repairing. +- Fixed monsters sometimes getting stuck "dancing" near the submarine because they try to avoid and target it at the same time. +- Monster events: Fixed many higher difficulty subsets spawning multiple monster events when they should spawn only one. +- Fixed items taken from abandoned outposts sometimes reappearing when returning to the outpost. +- Fixed highlighting items sometimes breaking after dropping a metal crate or some other container whose inventory is always visible when the item is equipped. +- Fixed bots putting minerals in the closest locker instead of preferring those that have been tagged with the "mineralcontainer" tag +- Fixed bots not respecting the access restrictions when choosing a where to put items into. +- Fixed bots being able to take items from secure cabinets if the item is inside another container inside the cabinet. +- Fixes to hull generation between docking ports. Should fix tiny gaps between the hulls that caused characters to briefly teleport outside the sub when passing through the port, and hulls generating incorrectly when the main submarine has hulls at both sides of the docking port. +- Fixed captain's pipe, harmonica and pipe tobacco not spawning in crates when purchased. +- Fixed console errors when trying to overwrite an existing item assembly in the sub editor. +- Fixed the margin calculations that in some cases made it impossible for Bonethreshers (and possibly other monsters) to reach a moving target. +- Fixed abyss monsters sometimes being unable to hit the sub and just keep pushing the sub. +- Define "tool", "weapon", and "provocative" targeting params to be ignored if the creature is not in the same sub as the target. Fixes some odd cases where the monsters e.g. target some item inside the sub when they are outside. +- Fixed occasional excessive camera shake when a large monster is lodged between the sub and the level. +- Fixed ballast flora not getting cleared from respawn shuttles when the shuttle despawns. +- Fixed ability to switch back to a sub you've left behind using the outpost terminals. +- Fixed doors without integrated buttons getting instantly opened by clicking on them when you have access to the button. +- Fixed ability to switch control to the hostages with Z and X keys during hostage missions. +- Fixed abyss and combat suits not getting autofilled with oxygen tanks when placing the initial supplies to a sub. +- Fixed inability to type in the "max players" field in the "host server" tab. +- Fixed item sell quantity sometimes appearing "maxed out" at a quantity less than what the player is actually selling. +- Fixed crashing when the team id argument for the "spawn" console command is formatted incorrectly, mention the argument in the command's help text. +- Fixed bots trying to clean up seeds and put items into bags that were moved to somewhere the bot can't access them, causing the bot to be stuck trying to reach the target. +- Fixed missions sometimes unlocking in paths leading to an irradiated location even if there's a more suitable path available. +- Fixed white rectangle around selected items in the sub editor being slightly off if the item's position/size is not a whole number. +- Fixed "incorrect password" text overlapping with the buttons in the password prompt. +- Fixed z-fighting in Medium Weapons Display Case. +- Fixed inability to drop through broken hatches. +- Fixed sprite bleed in IC-4 block's inventory icon. +- Fixed healthbar and affliction area being clickable even if there's an UI element in front of them, and even if there's no afflictions in the affliction area. Most noticeable when editing an electrical components properties. +- Fixed some incorrect room names in the beacon stations. +- Fixed propeller damage area triggering very inaccurately, particularly on shuttle engines. +- Fixed hull indicators fading in when loading a sub in the editor (they should only get hidden and fade in when editing the ambient light value). +- Fixed gaps sometimes getting linked incorrectly to the hulls between docking hatches, preventing water from flowing down from the lower hull in mirrored subs. Happened in mirrored Kastrull for example. +- Fixed fires in hulls between docking ports never going out client-side. +- Fixed nav terminal's, sonar monitor's and status monitor's selection rectangles being offset from the sprite in the sub editor. +- Fixed mirrored pumps emitting particles from the wrong side of the pump. + +Modding: +- Made it possible to use StatusHUD components in non-equippable items like turrets. +- Fixed scripted event's StatusEffectAction not being able to target ItemComponents. +- Added support for making missions trigger scripted events. +- Option to configure the color of an explosion's flash. +- Option to configure the number of gates between biomes (see MapGenerationParameters.xml). +- Turret's barrel and rail sprites are shown in the sprite editor. +- Made SecondaryUse status effects work with melee and ranged weapons. +- Renamed "Inflitrate" to "CanOpenDoors" and rewrote the tooltip. +- Added "scalemultiplier" (Vector2) for particle emitters so that the effects can be scaled just in one axis instead of both. +- Fixed overriding nav terminals with a mod resetting the changes to the custom interface buttons. +- Fixed status effect conditionals that check a parent container's tags checking the container's components, not just the item itself. Resulted in tag inequality checks always succeeding, because the components don't have any tags. +- Fixed crashing if a scripted event tries to spawn a human prefab that can't be found (i.e. if a mod uses a non-existent human prefab identifier). +- RemoveItemAction can be used to remove tagged items directly, not just items in a tagged character's inventory. +- Replaced "spawnprobability" attribute in monster events with a generic "probability" attribute that can be used for any type of event. +- Option to spawn particles across the ray cast from a hitscan projectile (see "pulselaserbolt"). +- Fixed linked subs included in outpost modules being positioned incorrectly. +- Added "swapidentifier" to SwappableItem definitions. Can be used to restrict which items in a given category can be swapped with each other (e.g. if you want to add custom upgradeable turrets but not make them swappable with the vanilla turrets). +- Made SecondaryUse status effects work with ranged weapons. +- Added "equal" targeting tag to enemy AI. Makes it possible to define how monsters react to monsters with the same combat strength. +- TagAction can be used to tag characters based on the human prefab identifier. +- Fixed a crash in the character editor that happened when a humanoid character had an elbow joint but didn't (yet) have a wrist joint. +- The "avoid gun fire" parameter now defaults to false. + +--------------------------------------------------------------------------------------------------------- +v0.13.3.11 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Adjusted autopilot logic to make it better at keeping the sub afloat when there's extra water on board. The maximum velocity of the autopilot is limited, which previously prevented it from emptying the ballast fully. Now it's only limited if the submarine is heading in the correct direction with enough speed, so if the sub starts sinking due to extra water, the autopilot can compensate and fully empty the ballast. +- Made large monsters immune to sufforin. + +Fixes: +- Fixes to issues that prevented mods installed from the Workshop from getting automatically updated and caused errors when trying to join modded servers. +- Fixed an issue in the voice chat that caused audio crackling when multiple people were speaking at the same time. +- Fixed inability to drag players who've ragdolled themselves with space bar. +- Fixed "failed to send message to remote peer" error spam when a client's internet connection goes down. +- Fixed certain submarines spawning with a non-neutral ballast level (Kastrull seems to have been the only affected vanilla submarine). Happened because the game would determine the neutral ballast level from the first nav terminal it finds in the sub, without checking whether that terminal controls a shuttle or the sub itself. +- Fixed explosions using wall damage value instead of level wall damage when the explosion happens outside a level wall. +- Fixed inability to place oxygenite tanks in oxygen tank shelves. +- Fixed crashing when a bot tries to find a diving suit inside ruins. +- Fixed minor wall draw order issue in Orca's top deck. +- Fixed bots trying to treat nausea even though the only cure for it is to wait it out. +- Fixed status monitor being messed up on mirrored subs that contain shuttles. +- Fixed railgun payloads not exploding. +- Fixed server sometimes assigning players who haven't set any job preferences as the captain, even if someone else wants to be the captain. +- Fixed ancient weapon propelling the character in an incorrect direction when using it underwater. +- Fixed sonar beacons not appearing on the sonar in the sub editor's test mode. +- Fixed "easterbunny" traitor mission failing after the mudraptor hatches. +- Fixed "changes to your character will be applied after the round ends" texts getting drawn behind the tab menu elements. +- Fixed "IsToggle" setting not working on periscopes. +- Fixed "Praise the Honkmother" mission being impossible to complete because it required more items to be delivered than the crate contains. +- Fixed humanhusk's inventory not being visible while controlling one. +- Fixed sub editor's entity list getting cleared when changing the entity category while a container/cabinet is selected. +- Fixed items that have been edited in the sub editor (e.g. recolored clothing) reverting back to default when starting a new campaign round while the item is in a character's inventory. +- Fixed clicking on command interface nodes crashing the game if the key is rebound to primary mouse button. +- Fixed tiling issues in some of the legacy background wall sprites. +- Fixed Spinelings attacking Leucocytes. Spinelings should avoid Leucocytes if they get close. +- Fixed bots being unable to stand on the platform below Humpback's docking hatch, preventing them from repairing the hatch. +- Fixed "beacon station" text and "generating preview..." in the submarine preview window not being translated when playing in a language other than English. + +Modding: +- Fixed console errors when a character with no gender tries to wear clothing that only has separate male and female sprites. +- Fixed crashing if the current style doesn't define a saving indicator. +- Fixed inability to load ragdoll/animation definitions from mods that override a character. +- Fixed ClearTagAction not properly clearing all the tags assigned by a scripted event. +- Fixed crashing if a mod's version number is incorrectly formatted in filelist.xml. + +--------------------------------------------------------------------------------------------------------- +v0.13.0.11 +--------------------------------------------------------------------------------------------------------- + +Campaign changes: +- Replaced "Lair" locations with "hunting grounds" in the connections between levels. Inhabited locations next to hunting grounds have a chance of getting abandoned and habitation can't spread through those levels to adjacent locations. The hunting grounds can be cleared by killing a boss monster in the level. +- Beacon stations are shown on the campaign map. +- Visual changes to the map to make it a bit more intuitive. +- When you enter a level with a beacon station, you always get an optional side objective to restore it even if you haven't selected a beacon mission. +- Added radiation on the campaign map: the intensity of the radiation around Jupiter is slowly increasing, which is forcing Europans to delve deeper under the ice. In practice, the radiation gradually destroys the outposts starting from the left side of the map, making it more dangerous and costly to stay in these areas. The intention behind this is to prevent players from farming resources indefinitely in the low-difficulty areas of the game before proceeding further. +- Gating progress between biomes: you need a certain amount of money or reputation before you can enter the next biome. +- Reworked exit points at uninhabited locations: there's a hole/tunnel above the start/end of the level the sub needs to enter to leave. + +Abyss: +- Reintroduced Endworm and Charybdis. +- Added floating islands that contain caves and rare minerals to the Abyss. + +New player experience: +- Added in-game hints, designed to help with new player onboarding. Can be disabled in the settings. +- Added text highlighting to mission descriptions. +- Player-controlled characters get automatically assigned an appropriate order when the game starts to guide the player on what they should do and to make it easier to find the relevant device(s). +- Changed the camera animation at the start of the campaign to show the entire outpost. +- Display mission difficulty in the available missions list, the info tab, and the round summary. +- Show an indicator when the campaign is saved. + +Changes and additions: +- Added abandoned outposts. +- New mission types for abandoned outposts: destroying the outpost, clearing a nest, hostage rescue and assassination. +- Added entity subcategories to the submarine editor. +- Added interactive submarine previews to the server lobby and "New Game" screen. +- Added respawning mid-round in the multiplayer campaign mode. Respawning gives you an affliction that can be healed for a cost at outposts. You can also choose not to respawn mid-round, and instead wait for the next round to spawn normally without the affliction, just like before. +- Reworked the impacts to the sub when it's hit by monsters. Increased the screen shake and stunning. There's now a 30 second cooldown for getting knocked down. Fixed the impact not triggering if the colliding limb is not big enough. +- Reworked attacks and effects for the following creatures: Moloch, Black Moloch, Hammerhead, Hammerhead Matriarch, and Golden Hammerhead. They now have a bigger impact on the sub when they hit it. Black Moloch's emp damage is halved. +- Added Abyss Diving Suits which slows down your movement speed but offers more protection against pressure and consumes oxygen more slowly than the normal suits. +- Added Combat Diving Suits which slow you down less than normal suits and offer more protection against damage. +- Added black moloch mission variants. +- Moloch's shell now always breaks when shot with a railgun. +- Increased the audio ranges for Watcher and Hammerhead Matriarch. +- Overhauled tab menu: improved layout, added submarine and reputation tabs, current funds are displayed in the campaign mode. +- Recreated waypoints for the vanilla subs. +- Bots can now be renamed through the outpost crew management interface. +- Certain large monsters' (endworm, charybdis, boss variants of molochs and hammerheads) health bars become visible at the top of the screen when you damage them. +- Added EMP effect to nuclear shells. Increased the damage a bit. +- Added a right click context menu option to copy debug console errors to clipboard. +- Railgun shells now explode instead of piercing armor. Physicorium shells still go through armor. Make all railgun ammunition slightly more likely to break limb joints. +- Added multiple current orders: you can assign up to three simultaneous orders for characters and drag the icons to change their priority. +- NPCs (non-bots) speak report related lines less than they used to. +- The bleeding particles are now emitted from the last matching limb instead of the first. Readjusted particle emit frequency and scale. +- Reduced Moloch's bleeding reductions. +- Trying to pick up a diving suit when you're already wearing one swaps the suits. +- Made monster eggs glow to make them easier to spot in caves and abandoned outposts. +- Exploding oxygen/fuel tanks don't make other tanks explode. +- Added a delay to oxygen/fuel tank explosions. +- Disconnect wires from beacon stations instead of deleting the wires completely. +- The probability of disconnected wires in beacon stations is relative to the level's difficulty, and no wires are removed if the difficulty is less than 20. +- Improved server filters: instead of only being able to search for servers that have a certain setting enabled/disabled, the filter can be set to "Any" (thanks someone972!). +- Show whether a server is player-hosted or dedicated in the server list. +- Show whether a server is public or private in the server lobby. +- Added a server setting for locking all default wiring in subs. +- Added favorite button to the server lobby. +- Banning a player who's using Steam Family Sharing will now also ban the owner's account, solving ban evasion using this method. +- Disabled NPC conversations in sub editor test mode. +- Beacon stations' reactors don't deteriorate or consume fuel to prevent the station from going back down when the player is travelling out from the level. +- The output length of all signal components is now restricted to 200 characters by default to prevent performance and networking issues if the output is set to an excessively long value (such as the entire dialog of the Bee Movie). The limit can be increased in the sub editor. +- Stunning still works on friendly characters even if friendly fire has been disabled on a server. +- Made radiation sickness's icon appear before it starts causing burns (instead of working the other way around). +- Made radiation sickness cause nausea. +- Added a screen distortion effect for radiation sickness. +- Added a checkbox to color component that toggles between RGBA and HSV input. +- Fabricators now display remaining time when fabricating. +- Revisited husk animations, movement speeds, and general balance. Husks regenerate a lot and are a bit tougher than they used to be. Human husks can and will easily rise again, unless properly killed. +- Adjustments and fixes on the thresher attacks. +- Revisit mudraptors' attacks. Fixes unarmored mudraptors and mudraptor hatchlings acting weird when attacking characters in water. +- Lower the overall damage of all the hatchlings. +- Added a link to the wiki to the main menu. +- Drop empty/used oxygen tank from diving suit when trying to swap in a new one when the inventory is full. +- When using an equipped item from a stack (e.g. a medical item), another item from the same stack is automatically equipped. +- The mid-round mission messages (e.g. "the monster is dead, navigate out...") are shown in the tab menu's mission tab. +- Make characters grabbable and the inventories accessible after a half a second delay. Fixes abusing the toy hammer to access NPC inventories. +- Allow fabricating fresh fuel rods, welding fuel and coilgun ammunition using depleted ones. +- Restrict the length of the text that can be entered as a sonar beacon's sonar label. + +Fixes: +- Major improvements to the voice chat: higher audio quality, less intrusive radio effect, fixed clicks/distortion. +- Attempt to fix crashes with the error message "failed to generate OpenAL/stream buffer" on Mac. +- Fixed crashing on startup with the error message "unable to load shared library 'freetype6' or one of its dependencies" on some Linux systems. +- Removed outdated steamclient.so file from the dedicated server (no longer needed because it's automatically installed by Steamworks). Should fix inability to host dedicated servers on Linux. +- Fixed clients' job preferences not being respected in all cases where they should, resulting in some clients getting a job that should be give to another client. +- Items can't be stacked in the equip slots (e.g. you can't hold and throw a stack of grenades). +- Trying to pick up a stack of items with a full inventory doesn't pick up the item in both hand slots. +- Fixes/improvements to item position syncing. When trying to pick up an item whose position has gotten desynced, the server should correct the item's position immediately. +- Fixed turrets getting cropped by the "wikiimage" console command. +- Fixed items with nothing but a holdable component (e.g. medical items) being hidden when hiding wires in the sub editor. +- Fixed ban list not displaying ban reasons or the duration of the ban. +- Fixed items appearing misplaced when switching to the sub editor mid-round with console commands. +- Fixed shuttles spawning undocked in certain custom subs (e.g. DOMA Prototype Mk 8). +- Fixed "tried to add a dead character to CrewManager" console error when reviving a character who died of high pressure. +- Fixed skill levels not getting updated in the "my character" tab mid-round. +- Fixed clients not calculating eventmanager intensity, preventing any high-intensity tracks from playing in multiplayer. +- Fixed campaign map being closed with RMB even if the user has inverted their mouse buttons. +- Fixed damage sometimes desyncing when the sub hits walls/spires: happened because damage was also applied client-side, which sometimes caused the clients to damage walls that weren't actually hit server-side. +- Fixed physics bodies between docking ports not getting mirrored in mirrored subs, sometimes causing impassable areas in spots where the docking port used to be. +- Fixed status monitor in a docked shuttle sometimes not displaying the main sub. +- Fixed campaign stores sometimes displaying prices for a previous location. +- Fixed various scaling issues on higher resolutions. +- Fixed monsters fluttering while pursuing other creatures. Only happened while swimming and was not notable on all monsters). +- Fixed mouse cursor being switched to hand even when the spritesheet is not shown in the character editor. +- Fixed monsters with low head/torso torques moving backwards when they try to turn around 180 degrees. +- Fixed regular Moloch not bleeding correctly. +- Fixed Workshop mod download prompt looping and freezing when there's a hash mismatch after a mod has already been installed. +- Fixed ability to walk through the heavy doors in mining outposts. +- Fixed nav terminal ignoring velocity_in signals when the terminal hasn't been operated by anyone during the round. +- Fixed one of the engineer variants having too many items in the toolbelt. +- Fixed "hide incompatible" checkbox in the server browser. +- Fixed characters getting impact damage from collisions with sensors. Caused characters to get stunned when they're thrown around by a monster while touching a level trigger (for instance, the branches in forest caves). +- Fixed bioluminescent cave's hallucination effect never going fully away and made it treatable with haloperidol. +- Fixed bots treating radiation sickness too eagerly (leading to wasted antirad). +- Added missing platforms to abandoned outpost modules. +- Fixed non-interactable items being counted as owned in the store interface. +- Fixed husk's mouth tentacles rendering on top of the left hand. Also fixed a minor texture bleeding on the waist. +- Fixed possible desync when multiple players use the crew management interface simultaneously. +- Fixed a crash when no valid limb was found for an affliction. Probably only happened with characters that already had some limbs severed. +- Fixed non-multiplied damage to limbs effectively always being clamped to 100, which means that no attack could do more than 100 damage per hit unless there's some damage modifier defined on the target limb. +- Monsters now stop targeting characters that are far enough behind level geometry. Fixes them getting stuck while trying to reach targets that are not easily reachable. +- Fixed players getting prompted to download subs when the server has disabled file transfers. +- Fixed command-spawned characters not getting the "job" tag on their id cards. +- Fixed coilguns consuming ammo faster than they should when linked to multiple loaders. +- Fixed wiring interface labels overlapping when using a high text scale. +- Allow engine propellers to do damage inside the sub. +- Fixed new lights being displayed as off in the sub editor until you toggle the lighting. +- Fixed non-ruin artifacts sometimes spawning on top of the sub. +- Fixed terminal's welcome message getting cleared when using the test mode in the sub editor. +- Fixed fabricator displaying the "not enough room in the input inventory" error even if the items fit in the input inventory by stacking. +- Fixed signal check components being unable to output whitespace. +- Fixed inability to edit smoke detector's parameters in-game. +- Fixed smoke detectors outputting empty signals. +- Fixed "engineers are special" outpost event not giving a price discount. +- Fixed clients being unable to vote for subs they don't have. +- Fixed a bunch of non-suitable items (such as devices that can't be deattached) being displayed in the "extra cargo" menu in the server lobby. +- Fixed crashing if you try to press the server log button in the lobby when connection to the server has been lost. +- Fixed item disappearing from the character's hand when you combine it with an item in a container in a way that doesn't fully deplete/remove it. +- Fixed gaps in the "backwall pipes" sprite. +- Fixed dedicated servers restricting player count to 1 less than the MaxPlayer setting. +- Fixed Kastrull's drone airlock not flooding correctly. +- Replaced legacy small pumps with the new ones in Orca. +- Fixed monsters sometimes spawning very close (or even inside) the respawn shuttle. +- Fixed "attempted to set SoundRange to NaN" error when a reactor's maximum power output is 0. +- Fixed wall damage particles sometimes spawning at an incorrect position. +- Fixed black moloch doing only 62.5% of the structure damage compared to the regular moloch. +- Fixes to R-29: fixed top docking port's control circuit, adjustments to pre-placed supplies, adjusted discharge coil power consumption, minor visual fixes. +- Reduced the amount of clown gear in the "Praise the Honkmother" mission to fit everything in the crate. +- Fixed non-repeatable outpost events starting to repeat once all of them have been triggered. +- Fixed inconsistency in the way vertical velocity in/out signals are handled by the nav terminals. Previously "velocity_in" would interpret positive y as upwards, even though "velocity_y_out" outputs a negative value when going up. Now positive is always down (= corresponds with the "descent velocity" value displayed on the terminal). +- Fixed Hammerhead Spawns not targeting decoys. +- Fixed the abyss monsters not targeting "provocative" items, like flares, glowsticks, scooters etc. +- Fixed Hammerhead Matriarch constantly fleeing from divers. It's intentional that the matriarch avoids the divers, but not as much. Now they should flee briefly only when shot by the player, making it possible for the divers to reach it (#5449). +- Fixed camera shaking/vibrating when moving at high speed. +- Fixed monsters being able to attack through ruin walls. +- Fixed overlapping vending machine and light switch in CrewModule_02. +- Fixed respawn shuttle maintaining an incorrect position after getting dispatched. +- Fixed inventory tooltip not changing when the cursor is hovered on the slot and the condition of the item changes. +- Fixed waypoints not being able to find hulls that have been added since the sub was last saved in the sub editor, causing them to appear blue. +- Fixed resizable outpost hallway modules not having waypoints and thus causing navigation issues. +- Fixed water particle effects not showing up when water flows between certain rooms in Remora. +- Addressed the lag spikes occasionally caused by Spineling's spikes when they hit/get stuck to something. +- Fixed logbooks being empty in the wreck salvage missions. + +Bots: +- Bots now warn when you are running low / out of oxygen or welding fuel tanks, turret ammunition, or reactor fuel. +- Bots no longer report dead monsters on the sonar. +- Disabled the dialogue lines about not finding any targets for the given order, since they don't really improve the feedback. Instead they can give a wrong impression that the bot is not following the order when they actually are. +- Bots no longer speak about not being able to reach the diving suit when they fail to get it because it was taken by someone else. They will target another suit like they used to. +- Bots don't extinguish fires when there's ballast flora in the hull. +- Bots only speak about getting attacked when attacked by players. Fixes security bots throwing ultimatums on other bots that accidentally damage them (e.g. while welding). +- Bots that operate an item (reactor/turret) now drop the empty items on the floor instead of placing them back to a container. This saves time and the empty items should be taken care of by the idle bots. +- Fixed bots not seeking more oxygen before the remaining oxygen level drops to zero when they already have diving gear equipped and when they are staying stationary, leading to suffocation when the bot is repairing/operating while already wearing the diving gear and running out of oxygen tanks. +- Fixed bots trying to swap the oxygen tank too early when they are outside of the sub, which in some cases might lead to bugs where they try to get back inside the submarine. +- Improved the feedback by adding dialogues for swapping the oxygen and for not being able to find more oxygen. +- Fixed bots trying to return the diving suit when it's not a reasonable thing to do, but when they actually don't need it. +- Fixed bots failing to swap an oxygen tank from a diving mask to a diving suit when both items are equipped. +- Fixed bots getting confused when they have a mask without a valid oxygen tank inside it and when there's not enough oxygen in the room to be without the mask. +- Bots now react faster in general to all enemies. +- Bots now automatically attack enemies outside of the main sub, if they have a weapon. While docked to an enemy outpost or submarine, the "fight intruders" order now acts as an offensive order to attack the enemies on the connected submarine/outpost. +- Fixed bots following the player when the player is controlling a monster. +- You can now escape from NPCs by going far enough from them while they are pursuing you. +- Fixed bots reacting to attackers that are outside of the submarine. +- Fixed the "reportrange" parameter not working when the character is attacked. In practice only has effect on NPCs. +- Fixed report icons being shown also for other teams instead of just one's own team. +- Bots now target the closest limb instead of the main collider when they aim with the turret. With small creatures, this should now make any difference. With long creatures, it allows the bots to target the extremities of the body instead of always shooting at the main body. +- Fixed non-security bots fleeing the enemy (in defensive combat state) even when they are ordered to fight intruders. +- Bots no longer automatically unequip weapons after combat if they are outside of a friendly submarine. +- Fixed bots having difficulties in leaving the ruins via gaps. +- Allow bots to use gaps also to exit the sub, but only when following a player character. +- Fixed bots always trying to reach the closest item even when it's unreachable. +- Make bots find items faster. +- Fixed bots sometimes continuing their movement (e.g. walking towards a wall) when they fail to find the diving gear they need to continue with the go to objective (e.g. follow). +- Fixed security officers standing idle next to the stunned target and doing nothing when they don't have handcuffs. Only happened while trying to arrest the target. +- Fixed multiple bots occasionally trying to operate the reactor at the same time. +- Fixed bots "stealing" stuff while cleaning up. Happened when the objective changed (= they decided or were ordered to do something else while cleaning up). Idle bots are no longer allowed to take items from purchased containers. +- Fixed bots running headlessly around while trying to find the container for items while following the clean up order. Now they should walk around instead and only run when the target container is found. +- Fixes and adjustments to security officer reactions for damage done by friendlies. +- Fixed bots sometimes yelling that they can't enter an airlock when the sub is docked. +- Fixed bots taking items from fabricators and deconstructors. +- Fixed bots saying "Can't reach target [name]". + +Modding: +- Fixed custom loading screen tips not showing up if the vanilla content package is enabled. +- Fixed crashing when loading a save where a stack contains more items than the maximum stack size for the item/container. +- The hit impact of a monster's attack can now be adjusted with the new "submarineimpactmultiplier" defined in the attack block. Note that this is a multiplier to the actual impact, hence also the force applied on the attacking monster affects the final impact. +- Explosions now have three new parameters: ignorecover, onlyinside, and onlyoutside. +- Fixed crashing/disconnects when preloading content at the start of a round if random events contain character variants. In practice, mods that used character variants in random events occasionally prevented rounds from starting. +- Fixed crashing when attempting to play a music clip that isn't a valid ogg file or if the file is not found. +- Fixed crashing when trying to spawn a character variant with custom inventory contents. +- Renamed the ai parameter "Threshold" as "DamageThreshold". +- Replaced "spawndeep" with "abyss" spawn type (defined in random events). +- New parameters StayInAbyss and StayInsideLevel that define the area where the creature tries to keep inside while not attacking. +- The creature disable distance, which totally disables the creature, is now exposed in the character parameters. The distance for triggering simple physics, which disables all the limbs and keeps only the main collider updated, is half of this distance. Increased the default from 22 000 to 25 000 (pixels). +- New attack pattern: Circle (around the target). Used by the abyss creatures. +- The aim speed and accuracy of NPC characters can now be adjusted in the npc (spawn) definition. The Aim speed also affects melee attack speed. +- Fixed OnSevered status effects launching also on the limb that the severed limb was attached to. +- Added "bleedingnonstop" affliction, which is just the same as normal bleeding but it never wears off. +- Added and option to target the last matching limb instead of the first (StatusEffect.TargetType.Limb). Implemented targeting other limbs even when the status effect is triggered from the limb, which was previously only implemented for status effects that targeted character. See Endworm for an example. +- Fixed hidden limbs not being ignored in many cases where they should, which potentially could cause issues with some custom monsters. +- Added "bleedparticlemultiplier" parameter in character definition, which can be used to increase/decrease the general amount of bleeding for the character in question. +- Added an option to always ignore an ai target if it's not inside the same sub as the character. +- Attacks can now "blink" limbs when they attack (Endworm). Blinking is a generic way to rotate limbs so that they "animate" (see Watcher's eye). +- Added AITrigger that can be used to trigger an ai state using the status effects (See Charybdis). +- Turned IsTraitor into a property so it can be accessed by status effects. +- Changed husk affliction's type to "alieninfection" because using "huskinfection" as both the identifier and type makes it impossible to add custom husk infections and reference just the custom one in conditionals or statuseffects. +- Fixed affliction statuseffects targeting NearbyItems or NearbyCharacters causing a crash. +- Corpses don't spawn in wrecks that contain no waypoints/spawnpoints. +- Monster events don't spawn monsters in wrecks that don't contain enemy spawnpoints. +- Fixed afflictions caused by status effects being multiplied by deltatime even when setvalue="true". The only vanilla statuseffect affected by this was incremental stun, which would stun the player for 1 frame instead of 1 second, but this may have affected some mods as well. +- Fixed errors when trying to load a beacon station with no reactor. +- Fixed level editor crashing when it tries to place a wreck that contains linked subs in the level. +- Added "onlyplayertriggered" condition for status effects. Currently only implemented for OnDamaged. +- Fixed crashing if you try to create a decal with incorrect casing. +- Fixed affliction's periodic effects being unable to reference afflictions defined later in the affliction xml. +- Fixed crashing if you save a campaign with a large map and try to load it with map generation parameters where the map is smaller. +- Fixed explosions not damaging level walls if their structure damage is set to 0. +- Fixed inability to load more than 5 wires per connection even if the connection is set to allow more. +- Allow to define afflictions (types or identifiers) to trigger the OnDamaged status effects only from certain afflictions and not all that do the damage. If the afflictions property is not defined, no restrictions are used (works as it used to). + +--------------------------------------------------------------------------------------------------------- +v0.12.0.3 +--------------------------------------------------------------------------------------------------------- + +- Fixed inability to permanently ban players who are currently in the server. +- Fixed scrap items failing to load in saves done prior to v0.12. +- Fixed bandage/plastiseal crafting exploit. +- Fixed crashing if a bot tries to operate a turret that's linked to some other item than a loader. + +--------------------------------------------------------------------------------------------------------- +v0.12.0.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed console errors when hatchlings spawn. +- Fixed beds causing injuries instead of healing them. +- Fixed diving suit holder not filling up oxygen tanks. +- Fixed messed up frozen seed display sprite. + +--------------------------------------------------------------------------------------------------------- +v0.12.0.1 +--------------------------------------------------------------------------------------------------------- + +- Adjustments and balancing to monster spawns. +- Modified meds, buffs and poisons fabrication times. +- Potential fix to occasional disconnects with an "index was outside the bounds of the array (ENTITY_POSITION)" error message. Happened when lots of items and characters were being created and removed in rapid succession, for example when using turrets against large numbers of enemies. +- Fixed a rare crash caused by an "index out of range" exception in Hull.Update after loading or mirroring certain custom submarines. +- Fixed submarine class not affecting the depth at which a submarine starts taking pressure damage. +- Linked subs inherit the submarine class of the parent sub. Fixes drones/shuttles on deep diver subs getting crushed in the late game levels. +- Fixed nav terminal displaying pressure warnings when the sub is past the crush depth of a non-upgraded sub. +- Fixed character variants not having inventories. +- Fixed monsters sometimes spawning inside floating ice chunks. +- Logbooks now longer spawn in secure steel cabinets in wreck missions. +- Crystal and rock caves can appear in cold caverns. +- Show cave entrance markers on the sonar during mineral missions. +- Allow using some the new client-side console commands without command permissions in multiplayer. +- Fixed empty container indicators being animated on nearly all item. +- Fixed incorrect contained state indicator on flashlights. +- Display target item name in the tooltip for orders which have no options but have target item icons. +- Decreased the amount of burn on first patient in medic tutorial. +- Removed the deals groups from the store interface when there are no deals set for the current location. +- Fixed wrecks sometimes blocking cave entrances. +- Fixed Kastrull drone flooding when undocking using the button next to the hatch. +- Fixed wire/component placement grid having a too high opacity. +- Fixed bots being unable to shoot ice spires if the point on the spire that's closest to the turret is outside the turret's rotation limits. +- Fixed ancient weapon being sometimes unable to damage ruin walls. + +--------------------------------------------------------------------------------------------------------- +v0.12.0.0 +--------------------------------------------------------------------------------------------------------- + +Cave improvements: +- New cave types and improvements to cave sprites. +- New cave hazards: exploding mushrooms, gas vents that drain oxygen and fuel tanks, sharp crystals that inflict bleeding and lacerations, hallucination-inducing plants. +- Made the caves more narrow. +- Position caves and ruins closer to the main path so the players won't have to swim hundreds of meters just to get to the entrance. +- Completing a nest mission turns adjacent empty locations to "Explored". +- Monster spawns are delayed up to a certain limit when most of the human players are exploring a ruin, wreck or a cave. +- Show a sonar marker at the cave's entrance in nest missions. +- Added some nest-specific level objects. + +Additions and changes: +- Implemented stacking small items. +- Decreased toolbelt capacity to 6 slots. +- Rebalanced level events to have a better difficulty curve. +- Further improvements and balancing to the way locations change to other types of locations. +- The owner of a duffel bag is shown when hovering the cursor over one. +- Increased vanilla drones' range to 400 m. +- Nerfed stunning. The effect is now incremental: for example, a few hits from a stun baton only slows the target down, but a full stun requires several hits. +- Allow laying on beds. +- Added mudraptor, thresher and crawler hatchlings. +- Removed vision obstructing effects from diving mask and diving suit. +- Added "quickstart" console command. +- Added "setfreecamspeed" console command. +- Zoom more slowly when holding Ctrl in freecam. The speed can be adjusted with the "camerasettings" command. +- Added "CauseSpeechImpediment" attribute to afflictions that stops huskaffliction from causing a speech impediment when set to false. +- Added "sendmessages" attribute to affliction prefabs. When set to false it prevents husk affliction from sending messages on the screen. +- Increased the steps in the aim assist slider to make it possible to set it more precisely (there's a big difference between 0% and 10%). +- Show a "waiting for the campaign to start" text for clients without campaign management permissions in the game mode panel when campaign is being set up. +- Disable all the non-campaign-related elements in the server lobby when a campaign or campaign setup is active. +- Added some diving suits to outpost modules. +- Made engine's propeller damage indicator in the sub editor match the damage radius. +- Invert nav terminal velocity_x output and applied engine force for flipped subs. This should make it so that the sub will go forward when the engine is in "forward" state, instead of going to the right which is the default forward direction. +- Made cabinets waterproof. +- Nav terminals display a warning then the autopilot detects an ice spire. +- Modified oxygen tank, welding fuel tank, underwater scooter and duffel bag densities (they don't sink or ascend as quickly as they used to). +- Reduced skill requirements for rewiring. +- Restrict Concat Component's output length. +- Welding tools can now be used to destroy ballast flora. +- Made floating ice chunks easier to destroy. +- Ballast flora can be damaged by explosions and tools even when it's submerged. +- Select the items/structures in an assembly when placing one in the sub editor. +- Fertilizer no longer increases water consumption on plants. +- Replaced fuel rods for uranium in fertilizer recipes. +- Allow adjusting sound volumes at 1% increments. +- Allow opening Command Interface's manual assignment when using hotkeys or "clickless" mode. Can be done by holding Shift (same key used to open the contextual interface) when navigating to the assignment phase. +- Added new editable property "NonPlayerTeamInteractable" for Items. Prevents players or the bots in their crew from interacting with the item, but still allows outpost NPCs to interact with it. +- Made outpost reactors non-interactable for player team characters. +- Monsters can spawn at both sides of the level during PvP missions, as opposed to always spawning near the sub on the left. +- Disable trying to edit human heads in the character editor, because it would break. +- Monsters can now use doors for fleeing and they should be able to break doors that are in the way to the escape target. However, if the target they are fleeing from is in the same room, they still "panic" and just try to run away from the target. +- Previously the swimming speed of monsters was halved. Now it's clamped. This fixes slow monsters like husk swimming really slow inside the submarine, but it also affects the others. +- Added a diving knife in one of the security item sets, so that the security officers always have a lethal weapon and won't have to keep bashing the creatures with a stun baton. +- Added a medic crate for medical items that are bought from an outpost. Previously the medical items were spawned inside a chemical crate. +- Changed the sounds heard in psychosis depending on whether the character is inside or outside of a submarine. +- Husks can now operate doors and hatches. They can also climb ladders and break doors, which they can't open. +- Added ability to set custom background images in sub editor. +- Added a checkbox to skip localization to item labels. +- Made changes to ignore icon visibility: they can now be seen from further and won't fade out when you move close to them. +- Made item selling prices adjust based on the store balance: as the store balance decreases, the store will offer less for the items you are selling. +- Added "wikiimage_character" command, which generates an isolated image of the currently controlled character. +- Added "wikiimage_sub" command, which generates an isolated image of the currently loaded submarine. +- Renamed memory component's "signal_store" input as "lock_state". +- Added visual snap grid into submarine editor and "togglegrid" console command to toggle it. +- Relay's toggle input ignores "0" signals. +- Only allow attaching one wire to a reactor's power_out connection, because more leads to power issues. +- Made motion sensor's IgnoreDead, Offset and Target properties editable in-game. +- Entering the sub while docked to an outpost doesn't make the music switch from an outpost track to a normal one. +- Restricted pet name tag to 32 characters. +- Instead of a static starting wallet of 2500 marks, the players get 8500 minus the price of the starting sub. +- Replaced existing skill progression feedback with skill increase popups. +- Added new music track, "Extraterrestrial Broadcast". +- Fruits now float on water. +- Added a HSV color picker in sub editor that can be accessed by clicking the small color preview rectangle in the property editor. +- Ctrl+V keybind in sub editor now pastes on the position of your cursor instead of at the center of the screen. +- Holding Alt and dragging the mouse now brings up a measuring tape in sub editor. +- Added "bindkey", "unbindkey" and "savebinds" console commands that can be used to assign console commands to keys. +- Disabled hotbar slot keybinds when holding the Windows Key on Linux. +- Allow banning players who've left the server by clicking on their name in the crew list or server log. +- Husks now ignore incapacitated characters. They also know how to crouch to reach stunned/ragdolled characters lying on the floor. +- Improved the waypoint generator. +- Added store-specific Daily Specials and Requested Goods that change as the game progresses: Daily Specials are cheaper to buy and Requested Goods are more profitable to sell. +- Added store-specific price variance: every store has its own small price factor that affects all item prices. +- Hammerhead spawns are no longer afraid of being shot with sub's turrets. They also try to get in more aggressively. +- Readjusted the flame particle positions on the welding tool and the plasma cutter. +- Lowered the electrical skill required for wiring oxygen tank shelves and diving suit lockers. +- Mission cargo items are now marked with the red hand item. Taking them is considered stealing. +- Added glowsticks. +- Added an option to change the text scale. + +Bots: +- Bots report ballast flora when they see it. +- Bots operating turrets now report what they see. They also call "firing" a bit less frequently. +- Bots using a coilgun/railgun report which kind of enemies they see. +- Fixed medics sometimes not letting go of the character they're treating after running out of medical items. +- Fixed medics not ignoring targets that they can't heal, because they don't have the items for it, which caused the medics to be trapped in a looping behavior. +- Outpost NPCs can arrest or kill players who try to cause leaks in the outpost. +- Changes to how the bots operate repair tools, so that they won't fail so easily when the water forces kick in. +- Bots (only the crew) now tolerate a bit more damage from repair tools before reacting. +- Bots should now properly respect ignored targets also when they are already targeting the item when you tell them to ignore it. +- Fixed bots not equipping diving gear when the oxygen level is low and there is no leaks/water in the hull, causing them to suffocate. +- Fixed bots "forgetting" autonomous operate (operate reactor or steer) orders if the objectives happen to fail. +- Fixed bots sometimes incorrectly abandoning a movement objective, when the path requires a diving gear. +- Bots should now know how to get back inside through gaps in the hull. +- Fixed NPCs not being able to repower the reactor if the player somehow manages to unpower it. +- Bots now run when they are ordered to clean up things. +- Bots now ignore mudraptor eggs (to not foil your evil plans by cleaning them up). +- AI Pathing: Fixed a huge penalty given to stairs causing characters to choose weird paths to avoid stairs. +- Fixed bots running towards a door when they can't find a path while following a target, which was not the intended behavior. The bots should now stop moving and wait in place instead. +- Fixed docking port not always being properly connected to a door, causing a missing link between the waypoints and making it impossible for the bots to access the port on some subs. The accepted distance is now relative to the docking port's sprite's height so that all doors inside the sprite should be treated as close enough. Additionally you can manually link a door to a docking port in the sub editor. +- Fixed bots thinking that they need a diving suit to access certain drones/airlocks on subs that the creator haven't manually removed the waypoints on the ladders outside the airlock door. There's no need to remove those waypoints anymore, although it shouldn't matter if you do. +- Bots should now always heal players when ordered to. They still use a threshold for targeting other bots, but it's now slightly higher (90 instead of 85). This only applies when the bots are ordered, not when they act on their own. +- Bots now speak about not having any targets after a 3 sec delay. Fixes bots sometimes complaining that there's no targets even when there are. +- Fixed bots not properly ignoring non-interactable containers. +- Fixed bots dropping off from ladders when they first try to go up using a ladder and then down using another ladder right next to the first ladder. Happened especially in Kastrull. +- Fixed bots taking items from mission cargo containers (e.g. clean up or rescue). +- Fixed bots not properly checking the line of sight while trying to extinguish fires. +- Bots don't anymore drop empty oxygen tanks in the sea, if they have room in the inventory. +- Bots should now take oxygen tanks with less than 80% either to an oxygen generator or an oxygen tank shelf. Secondary places for non-empty tanks are the diving and the supply cabinets. +- Bots should now take battery cells with less than 80% to a battery or charging dock (added "batterycellrecharger" tag for these items). +- Bots don't yell anymore that they need more oxygen when they are running out of oxygen and have a non-empty oxygen tank(s) in their inventory. +- Fixed bots not respecting the Wait order inside ruins. +- Bots now shoot ice spires when the sub is moving towards them or if they are very close to the turret. +- Bots steering the sub now report ice spires they spot on the sonar. +- Bots now switch batteries when operating scooters. They also unequip the scooter if they run out of batteries, instead of just swimming with it. +- Bots now know how to switch batteries to the stun baton. +- Bots don't drop empty welding tanks or ammunition in the sea anymore, if they have room in the inventory. +- Fixed bots not shooting through turrets that block the line of sight. + +Modding: +- Fixed mods not being sorted correctly until changing the order through the settings. +- Fixed mod load order not being restored correctly when leaving a server. +- Status effect definition attributes are now case insensitive. +- TriggerEvent in StatusEffects now supports inline events and the event tags have been renamed to "statuseffecttarget" and "statuseffectentity". +- Added support for defining a contextual name for an order (e.g. "Wait" and "Wait Here"). +- Added support for IntegerInput elements (with "min" and "max" attributes) for the CustomInterface component. +- Option to define character variants that override some parts of another character. See the "Content/Characters/Variants" folder for some usage examples. +- Fixed a number of crashes in custom repair tools, especially if they operate on their own without requiring a user. +- Added "needsair" attribute to husk affliction, when set to true it disables low oxygen resistance granted by husk affliction. +- Fixed crashing when a StatusEffect targets a removed limb. +- Fixed conditional "And" comparisons not always working correctly when targeting items (the conditional needed to be true on the item and all it's components). +- Added support for overriding textures on character variants. Only supports overriding the entire texture, not separate textures per limb. +- Added support for overriding animations on character variants. +- Added min and max conditions (in percentages) for preferred containers. +- Added support for randomized deconstruction output: Deconstruct elements now support "chooserandom" and "amount" attributes, Item elements support "commonness" attribute. +- Added ClearTagAction that removes the specified tag from the event. +- Added CheckAfflictionAction that can be used to check if a character has an affliction. +- Added "InWater" property to characters. +- Planter component now triggers "OnPicked" status effects when interacted with. +- Allow items with a kinematic physics body to have a connection panel component. +- Fixed HasStatusTag conditionals only checking the first active status effect. +- Fixed multiple characters spawning when a character infected with multiple different types of husk afflictions dies. + +Bugfixes: +- Fixed desync when entering a new level when there's a logbook with a very long message in the sub or in someone's inventory in the multiplayer campaign. +- Fixed very large numbers of submarines in the "Submarines/Downloaded/" folder causing excessive loading times, freezes and high memory usage. +- Delete submarines from Submarines/Downloaded when launching the game and hide downloaded subs from menus. The folder is now essentially a temporary folder for storing a server's submarines during a game session, not a place for persistent storage. +- Fixed crashing when trying to "select matching items" when right-clicking a linked sub in the sub editor. +- Fixed filename case issues and using backslashes instead of forward slashes in mod file paths causing errors on Linux and Mac. +- Fixed crashing when trying to respawn a bot in the multiplayer campaign. +- Fixed server list only showing up to 50 servers. +- Fixed connections that have the same start and end location sometimes getting generated on the campaign map, leading to a crash when trying to load the campaign save. +- Number input boxes don't clamp the value until the input box loses focus or enter is pressed. Fixes clamped values being very difficult to edit. +- Fixed a crash in GetDisguisedSprites. +- Mission events unlock the mission even if the conversation gets interrupted. +- Fixed lights on turrets rotating around the origin of the item, not the origin of the barrel. +- Fixed nav terminal's "velocity_in" input doing nothing. +- Fixed newly placed coilguns and searchlights not rotating the light sprite in sub editor. +- Fixed R-29 cargo lights not toggling on. +- Fixed missing waypoints in Berilia. +- Fixed docking ports' DockingDistance not being affected by the scale of the item. +- Fixed KarmaManager's MaxStructureDamageKarmaDecreasePerSecond not working as intended, allowing karma to decrease more than it should when doing lots of structure damage in a short time (e.g. when using explosives). +- Fixed engine's propeller hitbox not being moved or scaled when the engine is rescaled. +- Fixed holes in walls becoming non-see-through when starting a new round in the campaign. +- Fixed corrupted/invalid content packages whose xml file can't be loaded being added to the list of content packages, leading to a crash. +- Fixed devices failing to receive power if connected directly to a docking port's power connection without a junction box or relay in between. +- Fixed "disallowed upgrades" field not being taken into account in the upgrade UI when using prefab identifiers. +- Fixed level generation sometimes failing to generate the complete path to the destination. +- Fixes to docked subs being placed on the wrong side of the docking target in some cases (namely, when neither of the ports is connected to a door). Also added "ForceDockingDirection" setting to docking ports to enforce the direction if the automatic logic still fails due to some weird port setup. +- Fixed "velocity invalid" error if a monster that's indoors eats a corpse that's outdoors or vice versa (e.g. if you drag a corpse through the airlock while a monster is eating it). +- Fixed diving suit not giving any protection for radiation sickness. +- Fixed conversation prompts not disappearing if the controlled character dies when executing subactions (for instance, when the clowns are approaching the players at the beginning of the "clown relations" event). +- Fixed crashing when taking control of a black moloch with console commands. +- Fixed character editor creating tiny limbs if the mouse cursor goes outside of the sprite sheet area when the user is drawing a new limb. Drawing new limbs is no longer restricted to the sprite sheet area (it still works in display screen space!). +- Fixed husks and humanhusks targeting turrets when they are inside the submarine. +- Fixed monsters sometimes choosing weird paths when the hulls are flooding. +- Fixed assignment tooltip sometimes being displayed on command interface when it shouldn't be. +- Fixed ability to open manual assignment for orders targeting all characters. +- Fixed player characters' orders not being reset in between multiplayer rounds. +- Fixed "unignore" icons being displayed in multiplayer. +- Fixed crew list background blocking mouse input. +- Fixed order icons being always displayed over container when the order target is contained. +- Fixed CustomInterface component's UI text not reflecting the actual signal when changed by another player in multiplayer. +- Fixed inconsistencies in meds when fired from a syringe gun. +- Fixed thalamus spawning too many leucocytes in wrecks (particularly on higher difficulties). +- Fixed ability to choose a campaign save filename that's illegal on Windows when hosting a server on Linux or Mac, preventing Windows players from joining the server. +- Fixed workshop item download prompt not fitting on the screen when trying to join a server that has a large number of mods installed. +- Fixed being able to hear ready check ticking when the popup wasn't visible. +- Fixed an occasional lag following a crash when there's Spinelings present in the game (#4453). +- Fixed autopilot trying to steer away from connected subs that aren't directly docked to the main sub (e.g. drone docked to a drone docked to the main sub). +- Fixed a crash in the character editor when editing a limb's source with "adjust collider" enabled and if the source rect's size is zero or negative. +- Fixed docking ports not locking client-side if hulls fail to generate between the ports (e.g. if the thing docking to the sub doesn't have hulls). +- Fixed subs with a tall shuttle docked on top sometimes spawning partially inside the level's top wall. +- Fixed melee weapons being able to hit through walls/doors as long as the origin of the item is on the same side of the wall/door as the user. +- Fixed ballast flora jamming doors permanently if it dies while trying to drown a player in the ballast tank. +- Fixed pets not spawning at the position of the owner. +- Fixed rare "failed to generate a wall (not enough vertices)" error when generating a level. +- Fixed ability to see inside secure steel crates without appropriate access by swapping them with a normal crate. +- Fixed welded doors staying stuck and nav terminal not getting reset when redispatching a shuttle. +- Fixed mudraptor shells spawning outside the mudraptor's inventory. +- Fixed recovered shuttles disappearing if you quit during the round immediately after purchasing shuttle recovery in multiplayer campaign. +- Fixed logbooks always spawning in the same cabinet in a given wreck. +- Fixed items with a physics body disappearing when they are outside hulls during saving. +- Fixed items attached to walls (e.g. signal components) deattaching when resetting them to prefab values in the sub editor. +- Fixed characters that have been turned invisible by psychosis staying invisible when you switch to them. +- Fixed crashing when selecting a client who's controlling a monster in the tab menu. +- Fixed "where no man has gone before" achievement being impossible to unlock due to the depth being calculated incorrectly. +- Fixed submarine switching deleting all upgrades in multiplayer. +- Fixed Hammerhead Matriarch often not being able to break the sub's walls when hitting it. +- Fixed Hammerhead Matriarch's head deforming incorrectly (this fix may affect any modded content using conditional sprites with deformations). +- Fixed crash in sub editor when copying a linked submarine that you lacked the original file to. +- Fixed turrets and searchlights having incorrect light rotation when minimum rotation limit was the same as maximum rotation limit. +- Fixed popup messages preventing you from steering on the navigation terminal. +- Fixed inability to start a server when there's a very large number of subs installed. +- Fixed XP messages flying away when inside a moving sub. + +--------------------------------------------------------------------------------------------------------- +v0.11.0.10 +--------------------------------------------------------------------------------------------------------- + +- Fixed monster missions causing a disconnect in multiplayer mission mode. +- Fixed bots getting removed from the crew when starting a multiplayer campaign, returning to the lobby during the first round and then reloading the campaign. +- Fixed crashing when entering a new level in the campaign when an inactive pump has been infected with ballast flora. +- Fixed ballast flora branches respawning instantly if they're destroyed while they're growing towards a target. +- Fixed crashing when attempting to place components outside of the submarine in test mode. +- Fixed inability to rewire beacon stations when rewiring is disabled on the server. +- Fixed repair tools that aren't held causing a crash upon use (only affects modded items). +- Fixed raycast weapons (revolvers, shotguns, SMGs) sometimes not hitting monsters in specific areas outside the sub. +- Fixed submarine's price field being difficult to edit in the sub editor due to the value getting clamped above the minimum price while typing in the box. +- Potential fix to certain projectiles (e.g. harpoons, spineling's spikes) sometimes causing erratic physics behavior and errors (ragdolls going crazy, submarine getting launched off at a high velocity...) when they stick to the submarine or to characters. +- Fixed occasional crashes when swapping to another character's ID card with a mask or diving suit on. + +--------------------------------------------------------------------------------------------------------- +v0.11.0.9 +--------------------------------------------------------------------------------------------------------- + +- Fixed operating a pump manually causing a disconnect in multiplayer. +- Fixed ruins sometimes spawning partially inside level walls. +- Fixed the game occasionally failing to generate a crash report when it crashes. + +--------------------------------------------------------------------------------------------------------- +v0.11.0.8 +--------------------------------------------------------------------------------------------------------- + +- Fixed monsters being hard to hit with ranged weapons when far from the players in multiplayer (e.g. when operating a drone far away from the sub). +- Fixed occasional console errors when loading a submarine with a ballast flora infection. +- Fixed ambient lighting not affecting the submarine's outer walls. +- Fixed wire nodes getting messed up between campaign rounds if the wire was mirrored horizontally while placing it. +- Fixed ruins sometimes spawning with some of the wires disconnected. +- Fixed ice spires sometimes spawning too close to the start/end of the level. +- Render egg sprites in front of minerals. +- Fixed dancing coilguns. + +--------------------------------------------------------------------------------------------------------- +v0.11.0.7 +--------------------------------------------------------------------------------------------------------- + +Environment overhaul: +- Remade textures. +- Branching level paths. +- More varied level layouts. +- Added small explorable caves alongside the main path. +- Made the floating ice chunks destructible. +- The areas outside the traversable path are solid instead of hollow, so it's no longer possible for monsters to spawn "outside the level" or for the sub to get lost at the wrong side of the level walls. +- Ice spires: tall, protrusions that cut holes in the submarine if you hit them. +- Piezo crystals: environmental objects that drain power from the submarine when you get too close to them. +- The biomes further on the campaign map are deeper down in the ocean, meaning that crush depth starts higher up in the level. The biomes near the end of the map require hull upgrades to traverse safely. +- Improved resource (minerals and plants) spawning: resources now spawn in clusters which can contain multiple instances of the same resource. +- Made thermal artifacts a bit more manageable: they now start a fires periodically, not continuously. + +New missions: +- Nest missions where you need to enter a cave to destroy a monster nest. +- Beacon missions where you have to repair and power up a "beacon station". +- Mineral collection missions where you have to locate and mine a mineral cluster. + +Additions and changes: +- Added ballast flora, a plant-like organism that can infect the submarine and leech power from junction boxes and batteries. A ballast flora infection may be contracted by passing through a colony of ballast flora spores (which are faintly visible on the sonar). +- Added a new monster, "Spineling". +- Adjustments and balancing to the way locations change to other types of locations: habitation now spreads faster as the player explores the campaign map further. +- Added new military outpost music track. +- Submarine hull upgrades increase the submarine's tolerance to pressure, allowing it to dive deeper without getting crushed by pressure. +- Deep Diver subs can dive 20% deeper than other subs without getting crushed. +- Added mineral scanning functionality for sonars: enabled by default for handheld sonars, can be enabled for other sonar devices in the Sub Editor with Sonar component's "HasMineralScanner" property +- Added concatenation component (a signal component that joins two inputs together). +- Added a ready check that can be used to check if everyone is ready to depart from an outpost in multiplayer. +- Added "ignore" order that can be used to prevent bots from using/repairing/taking specific items or devices. +- Discharge coil's range can be visualized by holding space while one is selected in the sub editor. +- Level difficulty affects the way outpost events are chosen (the more difficult events don't occur until later in the campaign). +- Non-wiring-related items become transparent in the sub editor's wiring mode. +- Improved turret range visualization in the sub editor. +- Made skill checks in outpost events probability-based: a low skill doesn't mean you'll always fail, just that you're less likely to succeed. +- Reworked bonethresher's behavior and attacks. Tigerthreshers now protect Bonethreshers with a low priority. Minor tweaks to the ragdolls and animations. +- Added water percentage output to water detector. +- Reduced scrap spawn rates in wrecks. +- Removed the explosive cargo mission variant where one of the explosives spontaneously explodes. +- Split combat missions into a separate game mode. +- Added a toggle for transparent wiring mode. +- The "Leaving Start Location" track isn't played at outposts. +- Increased default KillDisconnectTime to 5 minutes. +- Added pet food item. +- Added support for defining sonar icon colors in XML. +- Neutralize ballasts in submarine test level. +- Items can be attached to level walls. +- Fixed watcher's gaze causing severe effects inside the submarine. +- UI: Moved the navigation controls to the right side of the sonar view and readjusted the layout. +- Moved the cleanup order to the last in the maintenance category. +- Flagged certain parts of the nose and tail of the vanilla submarines as non-targetable, because the monsters tended to go inside the nose/tail parts too often. +- Increased the sound ranges for Tigerthresher, Leucocyte, Terminal cell, Mudraptor, and Crawler (should make them more audible). +- Crawlers, Tigerthershers, and Spinelings now avoid being killed by the engine (more or less). +- Adjusted the avoiding behavior for monsters. + +Bots: +- Bots don't anymore clean up other diving suits when they have one equipped already. +- Bots don't anymore take diving suits off inside outposts (unless they have to). +- Fixed bots getting stuck on ladders when their body is near the floor. +- Fixed bots equipping diving gear too eagerly when the oxygen level drops in the room. +- Fixed all npcs and bots using the "Passive" idle behavior. Changed the guard idling so that they now more and prefer longer distances. Also other crew members should now move slightly more than previously. +- Increase combat priority of some tools so that the bots prefer those to toy hammer. +- More descriptive bot dialog when they can't find items they're looking for. +- Diving suits the bots have dropped in an outpost are automatically moved to the cargo bay when departing from the outpost. +- Outpost security allows "stealing" diving masks and suits if the outpost is flooding. +- Bots keep more distance to the player while following underwater and outside the sub. +- Fixed a rare crash in AIObjectiveIdle.Wander method. +- Bots now defend themselves (if possible) also when they are being attacked outside of the submarine. +- Bots should no longer hoard fuel rods. +- Fixed bots getting stuck while swimming near the submarine, because they kept switching between different steering modes. +- Fixed bots not avoiding other submarines connected to the submarine they are heading to while swimming around the submarine using waypoints. +- Fixed broken walls near hatches/doors sometimes preventing characters from entering the sub/outpost through the hatch/door. +- Fixed security or bots that have been ordered to fight enemies first fleeing from the enemies. +- Fixed bots sometimes failing to put out fires in multi-hull rooms. +- Fixed bots not being able to clean up items that occupy both hands (like the fire extinguisher). +- Fixed bots having issues with empty items while operating the reactor or the turrets, causing them e.g. to not knowing how to load the target item. +- Fixed outpost NPCs sometimes "cleaning up" the spawned toolbox in the event "clownrelations1". +- Fixed bots loading more rods to the reactor when the load is too high, even if the current amount of fuel is already enough to maximize the output. + +Modding: +- Added "IgnoreWhileInside" and "IgnoreWhileOutside" parameters on character targeting parameters. +- Added ranged projectile attacks for monsters. See Spineling for an example. Note that there are five different rotation modes for the projectile aiming: Fixed, Target, Limb, MainLimb, and Collider. +- Added a "sweep attack", which makes the creature sinuate while closing to the target instead of moving straight towards it. Used on Spineling. +- Added limb hiding (permanent or temporary) with status effects. Used on Spineling. +- Added limb breaking with status effects. +- Allow characters to move full speed after attacking, when the cooldown is active. The property is found in the attack definition. +- Allow to use the idle behavior (wandering) after attacking, during the cooldown. +- Added "OnlyOutside" and "OnlyInside" attributes for status effects. Affects only the targets of the effect. +- Fixed particle's "LoopAnim" property doing nothing. + +Bugfixes: +- Fixed occasional "missing entity" errors caused by the server failing to write an ID card's data in a network message. +- Fixed a bug that sometimes caused power to desync in multiplayer: when connecting the second end of a wire to a device other than a junction box, the server would sometimes not register the wire as being connected. +- Fixed previous messages disappearing from terminals and logbooks when transitioning to a new level in the campaign. +- Fixed sprite depths in dockingmodule 2, should prevent z-fighting. +- Fixed crashing when a bot abandons AIObjectiveCombat due to the target being in a different sub (e.g. if a character the outpost security is chasing moves from the outpost to the sub). +- Fixed undocking enabling all disabled nodes instead of just those that were connected to the docking port in question. +- Fixed EventManager to always choosing the same events from identical event sets in a given level. Meaning that if a level for example had 3 monster spawns that spawn either a crawler or a mudraptor, and the first event spawned a crawler, the rest would as well. In practice this lead to there being less variation in monster spawns than intended. +- Kastrull: Added more waypoints around the drone so that bots know how to get around it when it's docked to the main sub. Also fixed the airlock waypoints not being linked to the doors, causing the bots not being able to operate them. +- Fixed Health Scanner HUD showing a disguised character's true identity. +- Fixed health interface showing the original face and occupation of disguised characters. +- Fixed changelog layout getting messed up in the main menu after changing the resolution. +- Fixed some structures turning into wrecked versions when reloading the core content package with the "reloadcorepackage" console command. +- Fixed vent output being calculated incorrectly in multi-hull rooms. +- Fixed switch state being toggled when selecting them in the sub editor's wiring mode. +- Fixed engine not being affected by low power unless the voltage is low enough to turn it off completely (in practice meaning that there's not benefit to supplying the engine more than 50% of it's power consumption). +- Fixed characters getting healed between campaign rounds in single player. +- Fixed atan component output being inconsistent: the output was only correct if the y input was received after the x input during the same frame. +- Fixed crashing if a character's hands get severed while repairing something. +- Fixed stored non-shadow-casting lights being subtracted from the shadow-casting light count in the sub editor. +- Fixed autocalculated submarine price not being saved if the player doesn't touch the price field in the sub editor's save dialog. +- Fixed OnContained/OnNotContained StatusEffects not running if the itemcomponent is not active. In practice prevented oxygenite shards from supplying power until someone moves them. May have caused some other issues as well. +- Fixed console error when deconstruction Bufotoxin. +- Fixed reputation loss when "stealing" fire extinguishers from outposts when there's a fire. +- Fixed periscopes outputting rotation values incorrectly when connected to something else than a turret (e.g. camera). +- Fixed resetting game settings reloading content packages, causing items to disappear if the settings are reset when a round is running. +- Fixed pet's hunger/happiness values and inventories not getting saved between rounds. +- Fixed pet name tags disappearing client-side between rounds. +- Fixed empty oxygen tank not triggering the warning sound of a diving suit's oxygen supply. +- Fixed StatusEffects targeting "NearbyItems" only being able to target the Item instance, not the ItemComponents. +- Fixed "deceased" text wrapping in the health interface on small resolutions. +- Fixed open subinventories remaining visible on screen when using a railgun, coilgun or periscope. +- Fixed zoom getting stuck whenever exiting a railgun, coilgun or periscope and instantly hovering on an inventory slot. +- Fixed turret range upgrades not increasing the range of the turret's spotlight. +- Fixed all monsters spawned by the same monster event having the same sets of items. +- Fixed disconnected, hanging wires sometimes appearing at the wrong end of the wire. +- Fixed progress bar saying "welding" instead of "cutting" when cutting open a welded door. +- Fixed explosion damage to items not being diminished if there are obstacles between the explosion and the item. +- Fixes to flamer particles going through walls. +- Fixed items that are included in multiple categories (e.g. oxygen tanks, battery cells) not appearing in the sub editor's entity list unless using the search bar. +- Fixed psychosis sounds affecting all players. +- Fixed fabricators and deconstructors deteriorating even if they're not running. +- Fixed crashing when selecting a fabricator linked to a deconstructor or vice versa. +- Fixed "hide offensive server names" tickbox working the wrong way around in the server browser. +- Fixed console errors when setting an engine's max force to 0. +- Fixed in ability to damage huskified crew members if friendly fire is disabled. +- Fixed prototype steam cannon particles going through walls. +- Fixed "engineers are special" outpost event not giving XP when successfully helping the NPC. +- Fixed "propaganda" and "clown outbreak" outpost events not triggering. +- Fixed wires not appearing in some item assemblies placed in the sub editor until the sub is saved. +- Fixed decorative sprites being positioned incorrectly on mirrored items (such as pumps and fabricators). +- Fixed rotation limits being incorrect on turrets that have been mirrored before saving the sub. +- Fixed crashing when a bot is left to idle inside ruins. +- Fixed deconstructing an SMG magazine causing an SMG round to drop on the ground. +- Fixed empty SMG magazines not deconstructing to plastic. +- Fixed SMG magazines in character's inventories spawning SMG rounds at the start of a round (again). +- Fixed console errors in StatusEffect.GetPosition when applying a delayed status effect on a removed character. +- Fixed the latching behavior on Crawlers. +- Fixed latched creatures not releasing the sub when the submarine moves fast enough (defined in the latching behavior definition). +- Fixed outpost events sometimes triggering on dead/unconscious players. +- Fixed wifi component accepting input from chat regardless of the "link to chat" setting (the setting only determined if the component outputs the messages to the chat of the player holding the item, making it only useful for headsets). +- Fixed an issue that caused freezes when opening the server browser. +- Fixed "there is not enough room in the input inventory" error when placing a legacy medical fabricator in the sub editor. +- Fixed picking up a captain's pipe selecting it, preventing aiming until the item is deselected. +- Fixed hitscan projectiles briefly dropping out of the weapon client-side when fired. +- Fixed inability to play the campaign from the same local network when hosting with the dedicated server. +- Fixed crashing when clicking "spectate" in the server lobby after connection has been lost. +- Fixed occasional "too much data in network event" error messages. +- Fixed clients assigning different initial location reputations than the server, causing the round summary to display random reputation loss/gain when leaving the first outpost. +- Fixed "No AI Target" property not working properly. +- Fixed a rare crash when crawlers latch to a submarine. +- Fixed the vanilla submarines not always having any wrenches, which causes the bots not being able to fix mechanical items if they don't have a wrench in their inventory. Also made sure that all engineers have a wrench when they spawn. +- Fixed recovering and repairing a shuttle not removing the wall damage client-side. +- Fixed crashing when a hull smaller than 16x16px is painted or becomes dirty. +- Fixed characters not being visible when viewing an area far away from the player with a drone in multiplayer. + +--------------------------------------------------------------------------------------------------------- +v0.10.6.2 +--------------------------------------------------------------------------------------------------------- + +- Adjusted pets' item production rates and hunger/happiness thresholds. +- Fixed inability to pick up chitin chunks. +- Fixed event manager considering pets to be enemies, leading to monster spawns being delayed or disabled altogether when there are pets inside the sub. +- Fixed bots having difficulties in entering/exiting the airlocks. +- Fixed doors not obstructing waypoints after docking. +- Fixes to pet syncing. +- Fixes to pets disappearing when transitioning between levels. +- Removed small crawler egg (was only intended for testing). +- Kastrull: Fixed the airlock waypoints not being linked to the doors, causing the bots not being able to operate them. + +--------------------------------------------------------------------------------------------------------- +v0.10.6.1 +--------------------------------------------------------------------------------------------------------- + +- Added sounds for pets. +- Most fruits can be fed to pets. +- Increased the time it takes for pets to get hungry. +- Decreased pets' item production rate. +- The number of monsters now increases the event intensity more than previously, which should spawn monsters less frequently. +- Added some unarmored mudraptors to low-difficulty levels. +- Fixed crashing when a character takes damage from something else than another character attacking them (e.g. volcanoes). +- Fixed some steering issues where bots would return to the last waypoint instead of continuing with their current path when they should. +- Fixed occasional "velocity invalid" error messages when a character gets hit by a very fast projectile (e.g. coilgun bolt). +- Fixed severed tiger thresher heads doing the "death wiggle" animation. +- Fixed water flow sounds not disappearing over time. +- Fixed throwing an item that has no status effects (such as a flare) causing a crash. +- Fixed chitin helmet spawning in armory cabinets. +- Fixed event intensity going down immediately when the situation gets less intense instead of gradually returning to normal. Should make it happen less that more monsters are spawned soon after the player survives the previous wave of monsters. +- Fixed monsters using the Escape state when they should use the Flee state. +- Fixed Threshers not dying after being beheaded. +- Fixed heads or other extruding limbs being severed also when their root body takes damage. +- Fixed bots trying to get inside outposts (from outside) that they can't and shouldn't be able to enter to. +- Fixed very small creatures getting stuck on waypoints. +- Test changing the assignment logic for maintenance/operate orders: if the player doesn't specify the target character, use the bot who already is following the same order. The intention is to make it easier to change the target item of the order. The draw back is that ordering multiple bots to man the turrets now requires an extra step: specify the target character. + +--------------------------------------------------------------------------------------------------------- +v0.10.6.0 +--------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Reworked Watcher. +- Added pets (can be obtained by buying eggs from outposts). The pets produce items that can be used for crafting if they're kept happy and well-fed. +- Added a new AI behaviors: Observe, Follow and Freeze. +- Added toolbelt (a wearable container with a capacity of 12 and it's own dedicated slot) as a replacement for the toolbox. +- Improvements to the effects caused by psychosis: the affliction icon is not visible to the psychotic character, the fake fires and floods are a bit more convincing, the affliction plays random sounds and can cause other characters to become invisible. +- Added capture group support to RegEx component. +- Added black and white paint. +- Added optional "forbidden word filter" to the server browser. The filter is off by default. The list of forbidden words can be modified by editing the file "Data/forbiddenwordlist.txt" in the game folder. +- Increased the damage of 40mm grenades. +- Misc improvements to the tutorials. +- Added undo and redo functionality to the submarine editor. +- Added animations and lights to pump, fabricator, deconstructor and engines. +- All explosions now inflict explosion damage instead or in addition to lacerations. +- Nerfed the mudraptor slightly: the head and the tail armor should now break more easily; increased the cooldown of some attacks. +- Mudraptor's armor now explodes when destroyed. +- Added an unarmored variation of mudraptor. +- Bonethresher's head is now vulnerable to gunshotwounds and lacerations. +- Adjusted the appropriate jobs for bots. +- Changed the automatic crew selection logic for orders. +- Only show either electrical or mechanical repair order for the contextual selection, depending on which skills the item requires. +- Previous order icons of the same type are no more created, no matter if the target was different than the current. +- Tigerthreshers can now attack inner walls of the submarine. They still need help to get inside. +- Changes to the Tigertherthresher's main collider that should improve the overall movement. +- Option to make particle emitters modify the color of the particles. +- Set a limit to how many bots you can hire in the campaign (currently 16). +- Explosions caused by sodium, potassium, magnesium and lithium being exposed to water don't trigger additional explosions (e.g. oxygen tanks don't explode if they happen to be next to a sodium explosion). +- Pumps and relays placed in the sub editor are on by default. +- Added sounds for the nausea affliction. +- Nausea now inflicts a minor stun and internal damage when the character throws up. +- Monsters now stop fleeing after a while, if they are not being chased and can't perceive the target anymore. +- Implement spread, speed, and rotation for the spawn item status effects. +- Minor damage (less than 1 hp) doesn't spawn particles anymore. +- Rebalanced upgrade parameters, allowing for more noticable benefits. +- Allow closing the splash screens with esc. +- Added more copper to chalcopyrite and bornite deconstruct recipe. +- More calcium for aragonite, adjusted prices. +- Made large monsters immune to paralyzant (mudraptor is the largest affected monster). +- Use player name instead of server name for the server owner when hosting a server. +- Don't draw turret range indicators in the sub editor when the turret isn't selected. +- Adjusted Hammerhead's posture. +- Minor adjustments to Mudraptor's animations. + +Modding: +- Added Scale and Offset to Light Sprite's parameters. +- Fixed the Constant Torque parameter not working right. +- Allow to enable/disable tail angles per limb. Previously the angle was only applied to the first limb of type Tail. +- Added per limb multipliers for sine animations (fish tail movement). +- Exposed the fleeing and avoiding times on the monster AI parameters. +- The Light Sources on characters can now be defined with conditionals. +- Added HealthMultiplier parameter that can be used in StatusEffects like SpeedMultiplier. + +Character Editor: +- Fixed a number of issues with the joint limit widgets. Also allowed to set a joint to rotate clockwise, which inverses the widget direction. Useful for heads or other limbs that extrude right from the main body. +- The colliders of the hidden limbs are now hidden in the game view. +- Changed the hotkey for toggling the parameter editor from "Tab" to "F1" and fix the inability to toggle the editor when a text field is selected. +- Fixed load and save interfaces being broken on lower resolutions. + +Sounds: +- Added 2 new background music tracks +- Added a new, separate sounds for opening and closing the alien doors +- Added a new sound for medium-sized fires +- Added new heartbeat sound for suffering from low oxygen +- Added new sounds for the hull creaking +- Added a new sound for a broken pump +- Added a new sound for tinnitus after an explosion +- Added a new sound for alien artifacts +- Added a new sound for electrocution +- Added a new sound for husk footsteps +- Added new misc. UI sounds +- Added a new variations for some existing sounds +- Improved some existing sounds +- Exposed GUI sound definitions in the sounds.xml file + +AI improvements and fixes: +- Added a new AI behavior and order: cleanup items. +- Fixed severe performance hit when damaging outpost NPCs with a weapon that does continuous damage (for example a flamer). +- Reworked the contextual "Wait" order: the order now targets a position instead of an entity. +- Bots are now allowed to more things even they are not inside the player sub. For example they can be told to extinguish fires in the outpost or rescue crew members inside a wreck (when they are at the same place). WIP. +- Bots now try to put oxygen tanks to oxygen tank containers, before the oxygen generator or supplycab. +- Bots now re-equip hats, helmets, and other clothing that they have unequipped for being able to wear diving gear. +- Bots now use the underwater scooter when they have one in the inventory. +- Bots should now be slightly smarter when putting off fires. +- Bots don't anymore retaliate if they are being shot while there is an enemy around. Fixes #3840. +- Fixed a number of cases where bots would get stuck or fail to fix a leak. +- Fixed bots with steering order targeting the shuttle nav terminal instead of the main nav terminal. +- Fixed NPCs getting aggroed by certain drugs (e.g. anaparalyzant). +- Fixed bots not prioritizing the wall mounts for containing the extinguishers. +- Fixed monsters targeting inner doors when they shouldn't (#3891). +- Fixed outpost guards attacking the player for defending themselves against the aggressors on the event "mediator". +- Fixed NPCs not reacting when the player is attacked. +- Fixed AI considering characters on the opposing combat mission team as friendly. + +Misc fixes: +- Fixed clients always getting the generic "could not connect" error message when connecting to a server fails, even if there's a specific reason to the connection failing (e.g. disallowed symbols in the player's name, mismatching content packages or game version). +- Fixed yet another cause for "missing entity" errors. Occasionally happened in monster missions when a monster happened to get assigned the same ID as an item in a player's inventory. +- Fixed clients spawning a respawn shuttle in non-campaign missions even if the server has disabled respawning, leading to "missing entity" errors. +- Fixed planters dropping removed seeds after a save is reloaded. +- Fixed plants not updating the health after being fully grown in multiplayer. +- Fixed decal syncing working unreliably in multiplayer. +- Fixed "level doesn't match" errors after leaving a shuttle/drone behind in the multiplayer campaign. +- Fixed painted/dirty walls going to full opacity when transitioning to a new level in the campaign. +- Fixed crashing when trying to render a light whose range is less than 1 pixel. +- Fixed crashing when using a repair tool causes an explosion (e.g. when killing a terminal cell with a plasma cutter). +- Mudraptor: Adjusted and fixed the animations. +- Fixed irrelevant damage modifiers (like bleeding) affecting the damageemitter's particles. In practice, this caused damagemodifiers with bleeding modifier 0 not spawn any particle effects when the limb was hit. +- Fixed extinguish fires not working with extinguish fire orders if the room has not enough oxygen. +- Fixed the user set state of the crew list not being respected; autohiding/showing shouldn't change the state set by the player. +- Fixed significant lag spikes at outposts with many NPCs. Caused by too frequent pathfinding calls, when an NPC can't find a path to the target. +- Fixed AIState.Protect throwing exceptions when an attacker has been removed. +- Fixed status effects targeting nearby characters/items failing to launch, unless they used the "Active" effect type. +- Fixed crashing when trying to crouch while swimming in the character editor. +- Fixed pause menu being togglable during level transitions, causing errors if quitting the game during a transition. +- Fixed wire disappearing from the character's inventory and from the walls when getting shocked from attaching the 2nd end of a wire in multiplayer. +- Fixed airlock warning light in Kastrull not turning off when the airlock door is closed. +- Made plants non-combineable. +- Fixed random submarine selection setting for servers occasionally selecting non-submarines. +- Fixed dedicated servers still showing up as "playstyle-less" in the server browser. +- Fixed sounds defined in affliction status effects not working. +- Require at least 1 kick vote before kicking someone, no matter how low KickVoteRequiredRatio is set to. +- Fixed gaps being misplaced on certain wall structures, preventing certain walls from leaking in some subs (for example the wall above Typhon's junction compartment). +- Fixed "Select Matching Items" crashing in the editor when used with submarines with a linked submarine. +- Fixed hull above Kastrull's drone not being connected to the rest of the hulls, preventing oxygen from flowing between the drone and the sub when docked. +- Fixed junction boxes' signal connections passing power/load information. +- Fixed crash when trying to clone a linked sub that you don't have the submarine file for in the sub editor. +- Fixed incorrectly scaled items in the diving gear cabinet/locker assemblies. +- Fixed inability to sell faraday artifacts when the condition of the artifact is 0. +- Fixed monsters not fleeing if the attacker is a bot. +- Fixed OnImpact statuseffects not launching if the impact was negative (e.g. when a moving sub hits an item that's below the sub). +- OnDamaged status effects now launch only when there's any damage. Not when the damage is zero. +- Fixed health bar pulsating even when no damage is done by an attack/status effect. +- Fixed affliction probability not having any effect when used in status effects. +- Fixed EventManager crashing if there are no event sets configured for the current location type (only affected mods that add new location types without adding any events for them). +- Fixed items held in the left hand being drawn in front of the characters. +- Fixed ability to drag and drop items into outpost reactors. +- Set terminal's maximum message length to match maximum chat message length (otherwise chat-linked terminals work differently in multiplayer). +- Fixed diving suit's low oxygen warning beep not following the player wearing the suit. +- Fixed "propaganda" and "clown outbreak" outpost events never triggering. +- Fixed "clown brutality" event getting stuck after the NPCs have been spawned. +- Fixed "impromptu engineering" event giving only one coilgun ammo box despite the text saying 2. +- Fixed "black market" event always giving the player the alien pistol. +- Fixed incendium bars exploding when pressing the Use key while holding one. +- Fixed outpost security not reacting to players throwing items that explode on impact (e.g. flash powder or nitroglycerin). +- Fixed outpost security reacting to raptor bane extract injections with lethal force. +- Fixed mantis' animation. +- Fixed multiple wire nodes occasionally getting placed with one click when rewiring. +- Fixed fire and water flow sounds staying active when returning from a multiplayer session to the main menu. +- Fixed previously discovered map tiles becoming undiscovered when saving and loading a campaign. +- Fixed 1st shot from SMG magazines spawned with console commands doing nothing. +- Fixed calyxanide not damaging huskified humans or crawlers. +- Fixed explosives exploding when combining them results in one being removed. +- Fixed items that don't flip horizontally being positioned incorrectly in mirrored subs. + +--------------------------------------------------------------------------------------------------------- +v0.10.5.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed clients not receiving a message of their character dying if they die far away from the position they were last spectating, causing them to get stuck to a state where they appear alive but can't interact with anything. + +--------------------------------------------------------------------------------------------------------- +v0.10.5.0 +--------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Added gardening: four different growable plants that produce specialed fruits which can be crafted into different items, or just thrown about and splattered on the hulls of the sub. +- Added cleaning: decals are now persistent and water gradually dirties up the submarine's walls. The dirt and the decals can be cleaned with a special tool that can also be used to paint the walls. +- New submarine, the heavy transportation ship R-29. Original design by "Rav2n". +- Overhauled mudraptor: new sprites, more varied attacks and heavier armor. +- Option to change the channel on the headset, making it possible to do things like secret communication on another channel or devices that react to commands sent on a specific channel. +- Added a verification prompt when trying to handcuff yourself. +- The inventory of handcuffed players isn't hidden completely, just locked (with a tooltip that explains why it's locked). Hiding the inventory was confusing to many new players, and it was easy to mistake it for a bug. +- Added directional markers that show the locations of the interactable NPCs in outposts. +- User's helm skill affects engine output. +- The game is paused when the campaign map is open in the single player campaign. +- The campaign map is automatically closed if the submarine gets too far from the end of the level while the map is open in multiplayer. +- Clients are allowed to view the campaign map even if they don't have the permissions to select the destination or the mission. +- The docking confirmation prompt is only shown when attempting to redock to the outpost you just left from. +- Wrecks are now properly initialized when spawned with "spawnsub" console command. +- Readjusted the attacks for the Husk and the Humanhusk. +- Added the option to select the minimum number of players required on the server for traitors to become active to the server settings menu. +- Log when clients modify the properties of an item (e.g. light colors, signal component settings). +- Allow selling items as long as their condition is over 90%. +- ID cards can be sold (as long as they're not in the player's own ID card slot). +- Disallowed selling items in equipment slots. +- Added cancel button to the "reconnecting to server" message box. +- DockingPort, Turret and LightComponent toggle connections ignore 0 signals. +- Traitor victims get a message saying they were killed by a traitor. +- Stack chat message popups when the chatbox is hidden instead of just showing one at a time. +- Switches now have lights that indicate whether they're on or off. +- Added "fuel_out" output to reactors. +- Added "set_light" connection to turrets. +- Made stun gun darts craftable from any type of wire. +- Outpost generator uses the first module type defined in the outpost config as the 1st module instead of forcing it to "airlock" (making it possible for modders to create outposts with another type of entrance module). +- Mission rounds end automatically if there are more living players inside the outpost than outside it, even if the sub is not at the end of the level. +- Made togglehud command usable in the sub editor for nicer screenshots. +- Characters don't gain helm skill when the sub isn't moving. Prevents grinding the helm skill when the sub is docked or maintaining position. +- Improved the way solid obstacles reduce explosion damage. Non-broken doors and walls nullify the damage almost completely. +- Fabricator continues fabricating when transitioning to a new level while it's running. +- Hid movement orders from the contextual command interface when there are orders of another type available. +- Made improvements to store interface tooltips. They now include the item name and should be displayed more consistently. +- Disabled automatic crew list sorting. The order now remains the same throughout the round. +- Added a second previous order icon to the crew list. +- Added character godmode, renamed mainsub godmode command to 'godmode_mainsub'. +- Increased sub editor auto save slots from one to 8 by default. +- Made logbooks sellable. +- Equipping a weapon activates it's reload time (capped to a maximum of 1 second), preventing bypassing the reload times by swapping between multiple weapons. +- Hide campaign NPC icon when the NPC is dead or incapacitated. +- Bots now prioritize stunning melee weapons based on their damage if they run out of battery. +- Made antidotes cheaper and easier to fabricate. +- Location reputations are shown when overing the cursor over a location in the campaign map screen. + +Modding improvements and fixes: +- The order of all installed mods (not just the enabled ones) is now saved into the config file. +- Workshop mods can now be downloaded and installed automatically before joining a modded server. +- Disabled the Executable content type due to issues with cross-platform support. +- Fixed Unsubscribe button sometimes failing to delete mod content. +- Fixed a crash when attempting to modify the currently selected core package when other core packages aren't available. +- Fixed a modding-related crash at startup. +- Increased the "SeverLimbsProbability" cap (for items) from 1 to 10. The value is multiplied together with the joint setting "SeveranceProbabilityModifier", and limiting the value to 1 makes it impossible to boost the probability of some weapons/attacks. +- Fixed negative rotation speeds not working on decorative sprites. +- Fixed ItemPrefabs loading after AfflictionPrefabs. +- Previous enabled mods are restored when leaving a server. +- Added support for "periodic effects" (effects that execute every x seconds) to Afflictions. See the new "nausea" affliction for a usage example. + +AI improvements: +- Using the fire extinguisher when there is a fire is no longer considered stealing by the NPCs. +- NPCs now spawn an oxygen tank if they can't find any. They don't spawn diving gear though. +- NPC guards now spawn more handcuffs if they don't have any and are trying to arrest a target. +- NPCs now spawn a welding fuel tank, if they can't find any. They don't spawn welding tools. +- Some adjustments to the logic on when a diving gear is required and when it's not. +- Bots now avoid idling in narrow hulls. Instead of taking the whole hull volume into account, they now give weight only for the width of the room. +- Bots should now avoid idling in flooding hulls even when they have proper equipment. +- Medics don't anymore try to rescue targets that are fixing leaks. +- Medics now try to replace empty oxygen tanks for their targets before dragging them into safety. They should also take the suit off when it's not needed. +- Security officers and those who are ordered to fight intruders now actively seek new weapons if they have a poor weapon or run out of ammo. +- Bots don't try to move while grabbed by a friendly character. +- Bots now detect and ignore leaks that other bots are targeting. +- Bots don't anymore try to decontain diving suits when the path to the cabinets is flooding. +- All crew members now try to keep the reactor running, unless the player orders someone to shut if down or turns it off manually. +- Bots shouldn't anymore try to operate items that other bots are targeting (previously they used to walk next to the device and only then continue). +- Removed the following autonomous objectives from medic and the security officer: fix leaks, repair systems, and pump water. +- Bots should now give a high priority on items that they are currently repairing, no matter if the decision to repair that item was made by them or the player controlling the character. +- Bots that operate/fix should now wait a few seconds before heading on their business (previously only in idle state). They are not allowed to wait in some circumstances, like when they are underwater or when there's a threat around. + +Bugfixes: +- Fixed items that are added outside hulls not getting saved in the sub editor. +- Fixed "missing entity" errors in multiplayer if the respawn shuttle despawns after its walls have started leaking. +- Fixed submarine upgrades, hired bots and purchased items disappearing if the round immediately after the purchases ends due to returning to the server lobby or the crew dying. +- Fixed characters spawning with a 100% husk affliction on the next round if they've become huskified during a multiplayer campaign round. +- Fixed dedicaters servers not setting a play style. +- Fixed servers with no play style showing up as "Serious". +- Fixed attachable items teleporting back to the player's inventory in multiplayer if they first equip it and then attach it immediately. +- Fixed duplicate saves in the multiplayer campaign's "load save" tab when the server is running on the same machine as the client. +- Fixed broken junction boxes carrying signals from other junction boxes. +- Fixed bots disappearing from the campaign save when loading a save that was done in a level between 2 uninhabited locations. +- Fixed mp campaign sometimes loading an outpost level with no outpost and forcing the player to the map view. Happened when a campaign save that had been done in a level between 2 natural formations was loaded, which would mess up the save and cause the bug when quitting and reloading the save. +- Fixed submarine voting not working in the server lobby. +- Fixed outpost events repeating more often than they should. +- Fixed dedicated servers always being public. +- Fixed right mouse button not behaving correctly in the campaign UI when using left-handed mode. +- Made endpoint checks in the banlist more robust. +- Certain audio errors no longer crash the game. +- More Fabricator syncing fixes. +- Fixed molochs bleeding when they take any damage on the brain/main body. +- Fixed attacks never being able to do more than 100 hp damage per affliction, which resulted for example nuclear explosions and railgun shots being too weak -> re-adjusted railgun and explosion damages. +- Fixed bots failing to get an item if their inventory is full. +- Fixed bots sometimes running towards a wall after extinguishing fires. +- Fixed Husks trying to target floors/ceilings. +- Fixed the security not reacting when being attacked by a friendly character with the husk stinger. +- Fixed the Husk infection not progressing properly in multiplayer (#3673.) +- Fixed taking more husk damage reducing the Husk infection when its strength was higher than 50 (#3673). +- Fixed creatures in the group "human" not being considered friendly, which prevented creating friendly non-human characters. +- Fixed bots not always prioritizing the selected (contextual) targets first when ordered. +- Fixed incorrect priority calculations for repair objectives that causes bots to make weird decisions on what to repair. +- Fixed latched monsters ignoring decoys. Also changed the latching logic a bit, which has some minor implications on the gameplay. +- Fixed a crash when "money" cheat command was used used in the main menu. +- Fixed bots suffocating in diving suits, because they were unable to take the suit off when they should. (#3333) +- Fixed bots sometimes being unable to hit with melee weapons, especially in the "arrest" mode or when the target is down. +- Fixed bots sometimes getting stuck when they are fixing leaks while they are a bit too far from the target. +- Fixed bots insisting on equipping the diving suit before accessing Kastrull's drone. +- Fixed bots rapidly turning left and right when they are positioned between a wall and another bot in the idle state. +- Fixed one of the Thalamus spawn organs always dying because the hull was not flooding in Wreck1. +- Fixed bots failing to take account all the items in the inventory. Addresses cases where bots are confused because there are some empty/broken items and some full/functional items in their inventory. +- Fixed bots getting stuck in the find safety state when they can't find any safe hull (e.g. all the hulls are flooding and they don't have a suit). +- Fixed bots avoiding lethal pressure in some cases even when they have a diving suit. +- Fixed bots being unable to get the diving gear when some of the hulls in the path are flooding. +- Fixed bots failing to switch oxygen tanks when the tanks are empty. They don't yet know how to use the oxygen generator for refilling the tanks (coming later). +- Fixed many AI objectives not resetting properly, causing many separate issues. +- Fixed bots trying to use stabilozine to treat internal damage even though it only treats poisonings. +- Incapacitated bots now forget what they were doing. Fixes bots shooting at the player when revived after being shot by the player. +- Fixes and improvements on NPC/bot reactions when being attacked by the player. +- Fixed the devotion not working right for the subobjectives of looping objectives. Should fix cases where the bots keep switching repair/fix targets, resulting in looping walking behavior. +- Fixed coils not triggering in some alien ruin rooms. +- Fixed misaligned oxygen tanks in the oxygen generator. +- Fixed misaligned railgun shells being in the single loaders. +- Fixed explosives not triggering inside depth charges. +- Fixed damage modifiers overriding each other instead of stacking, causing some protective items to make the characters less protected. +- Fixed skill checks in the "sound in the vent", "mediator" and "big brother" events always failing. +- Fixed conversation prompt staying open after finishing either of the "Mike the Idiot" events. +- Fixed attacks never being able to do more than 100 units of damage per affliction, making some weapons less effective than they should be. +- Fixed inability to override item assemblies with mods. +- Fixed items contained inside another item in an item assembly not getting saved in the sub editor. +- Fixed links between entities not getting saved in item assemblies, causing doors to create a duplicate gap when the assembly is placed. +- Fixed stabbing with a syringe bypassing the medical skill check. +- Fixed piercing coilgun bolts going through level walls. +- Fixed particles sometimes going through walls (example case: Typhon's ballast pumps). +- Fixed SMG magazines always spawning a bullet at the start of a round even if there's already one inside the mag. +- Fixed respawn shuttle sometimes spawning with upwards velocity. +- Fixed mining outposts sometimes failing to generate, causing the game to use one of the old pre-built outposts as a fallback. +- Fixed "acid party" traitor mission causing a crash if there's only one player on the server. +- Fixed ruins sometimes spawning close to the beginning/end of the level, blocking the way to the outpost. +- Fixed crew members that have been removed during the round (e.g. despawning, turning into a husk) reappearing on the next round. +- Fixed round summary displaying "new hire" instead of the status of recently hired characters who've died during the round. +- Fixed monsters often spawning behind the submarine even if there are valid spawnpoint ahead of it. +- Fixed duct blocks in vanilla subs being repairable with a welding tool instead of a wrench. +- Fixed giveperm, revokeperm, giverank, givecommandperm and revokecommandperm not working when executed on a player with spaces in their name by a client. +- Fixed occasional crashes at the end of the round due to a race condition where SteamManager tries to check for damaged walls while the sub is being unloaded. +- Fixed mudraptor eggs never hatching. +- Fixed the "giveaffliction" command not accepting the affliction identifier as a parameter in multiplayer. +- Fixed the contextual repair order being shown even if the item was not in need of repair. +- Fixed a networking bug that caused "index out of bounds" and "missing entity errors" (although there are probably other bugs remaining that can cause these error messages). Happened in multiplayer campaign when a purchased or player-owned item happened to take the ID of an existing structure during the start of the round. +- Fixed inability to give Operate Weapons order when there's only 1 turret. +- Fixed store total not updating properly when location reputation changes. +- Fixed bots not being able to reach leaks that are behind intact walls. +- Fixed pause menu staying open when clicking "Save and quit" in an outpost level. +- Fixed all saves getting hidden from the "load game" menu when deleting a save. +- Fixed projectiles staying active if picked up mid-flight, causing them to hit the character when dropped from the inventory. +- Fixed a crash when taking control of a previously player-controlled character that has turned into husk. +- Fixed attacks working unreliably when controlling a monster in multiplayer. +- Fixed grenade launcher's muzzle flash causing items' OnFire effects to trigger. +- Fixed clicking on the job name not selecting the job as a preference. +- Fixed bots running back and forth after reaching the target waypoint if there's nothing telling them otherwise. Now the bots should continue running towards the target as intended. +- Fixed "sound in the vent" and "giving directions" events not giving any rewards. +- Fixed prices not refreshing in the store screen if the crew's reputation changes while inside the outpost. +- Fixed characters not getting stunned when failing to repair an oxygen generator. +- Fixed missing fire extinguisher in securitymodule_03. +- Fixed secure steel cabinets not requiring a key card to open in securitymodule_01 and 02. +- Fixed campaign setup menu sometimes randomly selecting an invalid sub when opening the menu. +- Fixed monster attacks not working inside ruins. +- Fixed doors not working in AlienDoorAssembly2. +- Fixed ability to link hulls to each other multiple times. +- Fixed bots triggering the campaign map by undocking from outposts. +- Don't allow the current location or the destination to change it's type at the end of a round (i.e. an uninhabited location can't turn to an outpost as you're entering it). +- Bots don't try to power up the reactor unless ordered to in outposts. +- Fixed "invalid docking port network event" error if the ID of the port has changed after the event has been created (e.g. if one of the clients happens to have an item with the same ID in their inventory). +- Fixed changes to spawn point's text properties not saving in the sub editor without pressing enter. +- Fixed ability to "bypass" sonar disruptions by switching to passive sonar before the active ping reaches the disruption. +- Fixed incorrect diving suit deconstruction recipe. +- Fixed faraday artifact not playing the explosion effect in multiplayer. +- Fixed ability to bypass vote kicks by changing your name before you get kicked. +- Fixed killing a character with morbusine not unlocking the "Poisoner" achievement. +- Fixed killing a moloch that's the target of a mission not unlocking the "Killed a Moloch" achievement. +- Fixed Berilia's and Typhon's docking ports not being connected to the power grid. +- Fixed contained item positions not being updated if they're inside a non-equipped item in a character's inventory (e.g. a sonar beacon inside a toolbox). +- Fixed sonar beacon staying active after running out of battery. +- Fixed stationary batteries being able to provide power when broken. +- Fixed pumps being impossible to adjust manually after they've received a signal through the "set_targetlevel" connection in multiplayer. +- Fixed sub names and save times disappearing from the "load campaign" menu in the server lobby after deleting a save. +- Fixed autopilot being turned on automatically at the start of a round on nav terminals that control a shuttle/drone remotely. +- Fixed names not being color coded according to job in the server lobby when a round is running. +- Fixed non-mission artifacts sometimes spawning inside level walls. +- Signal components don't output anything if the result of an arithmetic operation is undefined (square root of a negative value, division by zero, inverse trig function outside the defined range). +- Fixed handcuffs becoming unequipped client-side on successive campaign rounds. +- Fixed copypasting a single docking port/hatch or a wire in the sub editor placing it very far from the submarine. +- Fixed characters not dying, but still being unable to move, if they get crushed by pressure when they have the vigor affliction. +- Fixed crashing if a turret receives a NaN signal in the position_in connection. +- Fixed crashing when trying to reselect the current preview image as the preview image for a workshop item. +- Fixed shadow-casting convex hulls being calculated incorrectly on hatches with windows (only affects mods that add hatches with windows). +- Fixed custom items disappearing when saving a sub if the sub is both the items and the sub are configured in the same content package. +- Fixed nullref exception if a client joins or disconnects when tab menu's crew tab hasn't been initialized. +- Fixed Dugong's oxygen generator being rewireable with a wrench instead of a screwdriver. +- Fixed particles not being emitted when cutting ores. +- Fixed unwired lamp in EngineeringModule_01. +- Fixed tunnel background being interactable in ResearchModule_02. +- Fixed inability to interact with hidden linked containers in multiplayer. +- Fixed undocked linked subs being positioned incorrectly when entering a new level in the campaign. +- Fixed players not getting notified about shuttles being left behind when docking with an outpost in the campaign. +- Fixed salvage missions not completing if the item is inside a subinventory (for example a toolbox). +- Fixed rejoining clients not gaining control of their previous character if they've changed their name. +- Fixed healthbar being positioned incorrectly on large resolutions. +- Fixed fabricator's hover text saying it's repairable with a screwdriver. +- Fixed last hit from a stun baton doing nothing. +- Fixed diving suit lockers that have been recolored in the sub editor reverting to default color when a suit is placed inside them. +- More reliable syncing of doors' stuck state. Should fix doors appearing usable client-side even though they're actually welded server-side or vice versa. +- More reliable memory component and text display syncing. +- Fixed events that require a specific item not taking items in subinventories into account. +- Fixed events where the player has to pay for something being possible to complete even if the player doesn't have enough money. +- Made "goodsamaritan" and "huskcultist" events remove the items from the player immediately after opting to give/use the item. Otherwise it's possible to keep the item by dropping it from the inventory before dismissing the conversation prompt. +- Fixed events that increase the medical skill giving the character a duplicate medical skill entry. +- Fixed light sprites not rotating when rotating an item. +- Fixed contained items not rotating when the container is rotated. +- Fixed legacy railgun controllers being fired with the Use key instead of the Shoot key. +- Fixed XP popups not showing up in multiplayer. +- Shuttle batteries can't be damaged by explosions because they can't be repaired. +- Fixed text overlapping with the icon in the "purchased supplies have been delivered" popup. +- Fixed mission notification appearing in front of the round summary. +- Fixed crawler walking/running animations when the creature is facing left. +- Fixed irrelevant damagemodifiers affecting the final damage when multiple damage modifiers exist. + +--------------------------------------------------------------------------------------------------------- +v0.10.4.0 +--------------------------------------------------------------------------------------------------------- + +- Localization fixes. +- Fixed piercing coilgun ammo boxes never running out. +- Fixed end round button having no text when leaving an outpost. + +--------------------------------------------------------------------------------------------------------- +v0.10.3.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed SalvageMission not spawning the item if the mission has been attempted previously, causing an "attempted to pick up a removed item" error when trying to pick up the artifact/logbook. +- Fixed bots going to operate the reactor/navterminal in the main sub when they are inside the outpost. Now they should only be allowed to do this when ordered to. +- Fixed mechanic tutorial getting softlocked if the oxygen tanks are put in the deconstructor without putting them in the player inventory first (e.g. by putting them inside a diving mask and moving them from there to the deconstructor). +- Fixed "failed to spawn item, component index out of range" error when an item that originally spawned in a container has been moved inside another container whose ItemContainer component doesn't have the same index as the previous one (e.g. when moving items from cabinets in a wreck into a toolbox). +- Fixed dialog prompts in the "clownrelations1" and "engineers_are_special" events being displayed to all players in the server. +- Fixes to localization issues (text overflows, some texts being displayed in English regardless of the selected language). +- Prevent selling items contained inside an item equipped in Head, OuterClothes, or Headset slot (should prevent accidentally selling your headset batteries or oxygen tanks in your diving mask). +- Fixed changes during the last campaign round not being saved. +- Fixed campaign character being recreated on every round start after modifying it via the tab-menu during a campaign. +- Fixed crashing when clicking the "close" button in the end credits in multiplayer campaign. +- Reset stores and unlocked missions when finishing the campaign. +- Fixed open subinventory slots staying visible during the campaign end cinematic. +- Fixed talk icon not disappearing from NPCs when another client finishes the conversation. +- Made end round button more noticeable. +- Added a missing platform to Wreck1. +- Added burn and lacerations resistance for assistant clothes, removed gunshotwound resistance. +- Raised explosive and piercing coilgun ammunition prices, reduced quantity by 25%. +- Limited availability of piercing and explosive rounds at cities to 1 box. +- Fixed bots getting stuck on ladders when there are two ladders next to each other and no non-ladder waypoint between them. +- Outpost medics won't anymore try to heal NPCs that are turned hostile by an event. +- Fixed OnActive StatusEffects not working on Vent components. +- Fixed clients crashing if they can't find a preview image for a campaign sub. +- Fixed characters not getting slowed down when walking/running in a partially flooded hull. +- Fixed end biome being used in sandbox/mission modes. +- Fixed event prompts not having a scrollbar if the first message is too long. +- Made chemical and explosive crates water proof to make it possible to use them for transporting water-sensitive materials. + +--------------------------------------------------------------------------------------------------------- +v0.10.2.0 +--------------------------------------------------------------------------------------------------------- + +- Balanced monster spawns (less mudraptors in the low-difficulty levels). +- Made levels in the Cold Caverns and Europan Ridge biomes a little smaller. +- Gray out upgrades on the UI if the user lacks campaign management permissions. +- Disable elements in crew hiring menu when lacking permissions. +- Idling bots don't try to steer away from each other if there are characters standing on both sides. Fixes groups of bots "spazzing out" in small spaces. +- Fixed all clients seeing the mission-related conversation lines. +- Fixed last conversation the huskcultrelations event showing up for all players. +- Fixed mission notifications being appended to whatever conversation prompt a client has active. +- Fixed Dugong not receiving power through the docking hatch. +- Fixed unwired junction box in ResearchModule_01. +- Fixed occasional "connection index for mission out of range" errors when unlocking missions in multiplayer campaign. +- Refresh upgrade store when granted manage campaign and manage round permissions. +- Fixed client's character data not getting saved in the multiplayer campaign if they disconnect but their character doesn't get killed by the disconnect timer. +- Fixed tiny buttons in wrecks. +- Fixed crawler mask not showing up on characters. +- Fixed returning to lobby not triggering a proper reload of the campaign save when continuing. +- Fixed SmokeDetector's Output and FalseOutput properties doing nothing. +- Fixed some locations sometimes not being connected to the rest of the campaign map (example seed: JKPNeh4f). +- Fixed characters being able to play instruments while stunned. +- Attempt to fix the game process sometimes staying active after the game is closed. +- Fixed mining outposts sometimes failing to generate. + +--------------------------------------------------------------------------------------------------------- +v0.10.1.0 +--------------------------------------------------------------------------------------------------------- + +- Fixed inability select other locations on the campaign map when a mission has been selected in one of the locations. +- Fixed purchased items not spawning if the crew dies and the previous save is loaded in the multiplayer campaign. +- Fixed clients not seeing subs they don't have in the campaign setup's purchasable sub selection. +- Clients who die due to a disconnection in the multiplayer campaign get to keep their character when they rejoin. +- Fixed submarines with spaces or commas in the name breaking campaign saves. +- Fixed favorite and recent server queries causing errors if there's a very high number of them. +- Fixed audio not working on some systems. +- Fixes to incorrectly sized item colliders. +- Fixed monsters not spawning in the first few levels of the campaign. +- Fixed store interface switching to the Buy tab after receiving a campaign state update in multiplayer campaign. +- Gray out items on store lists when the player doesn't have the relevant permissions. +- Putting outpost items into crates and toolboxes now gets the guards riled up. +- Fixed "kill" not being marked as a cheat command. +- Alarm buzzers and sirens turn off if they're deattached and picked up. +- Fixed wire that's connected between two docking ports becoming visible and interactable when leaving an outpost. +- Fixed subinventories being drawn on top of campaing interfaces. +- Fixed selecting purchasable submarines not working on non-host clients with campaign management permissions. +- Fixed ResearchModule_01 not being fully powered. +- Fixed initial campaign cinematic being shown to clients who join mid-campaign. + +--------------------------------------------------------------------------------------------------------- +v0.10.0.0 +--------------------------------------------------------------------------------------------------------- + +Improved campaign mode: +- Explorable, procedurally generated outposts. +- Interactable NPCs: things such as hiring, unlocking missions and purchasing supplies are now done by interacting with NPCs instead of just a menu. +- Multi-step, branching scripted events in outposts. +- A reputation system that affects how outposts and factions relate to you and your crew. High reputation can make NPCs give you discounts for supplies or unlock special events and event outcomes, while low reputation may turn outposts hostile towards you. +- Items can now be sold in outposts. +- Persistent bots in multiplayer campaign. +- Bots can be hired in multiplayer campaign. +- New campaign map. +- The end location is now reachable (do note that the ending is still not completely final). +- Submarines can be upgraded: for example, you can increase the durability of the walls and make devices more powerful, less prone to malfunctions or less power-hungry. +- Submarines can be purchased and switched during the campaign. +- Improved end-of-round summary. + +Miscellaneous changes and additions: +- Overhauled most structure and item sprites to make the artstyle more consistent. +- Balanced economy (item prices, hiring costs). +- The currency is now called the Europan Mark instead of credits. +- 4 new background music tracks. +- Tons of new decorative items and structures. +- Sittable chairs. +- Allow characters to hear messages sent through the radio when within speaking range of the speaker, even if the characters don't have functional headsets. +- Made organ damage non-limb-specific. +- Hostile bots now take stunning into account when evaluating the weapons. I.e. switch from stun baton to diving knife if the target is stunned and back to stun baton if it's not. +- Sodium and lithium explode in water. +- Item sprites can be rotated in the sub editor. +- Purchased adrenaline glands spawn in crates. +- Allow changing audio output device in the game settings. +- Added "Is On" property to pumps to make them easier to turn on in the sub editor. +- Tuned difficulty of level events, now with a less severe difficulty curve and more account taken of intensity. +- Numerous quality of life and visual improvements for stock subs. +- Mission specific creature variants. +- Node based event editor. +- Crawlers tuned to be considerably more dangerous. +- General creature balance improvements. +- Creatures avoid targeting the same targets as other characters of the same swarm/type. Should considerably reduce the "stacking", where multiple creatures attack exactly the same target. +- Bots can rescue/heal targets when they are inside wrecks/outposts.They are not allowed to switch submarines during the objective. +- Molochs' skirts are now fully severable and collide with the sub instead of floating through the walls. +- Grenades and syringe guns can be put inside toolboxes. +- Headsets no longer consume battery power + +Bugfixes: +- Steam networking fixes and additional logging to address issues with some clients being unable to join servers. +- Ignore ballast tanks when calculating flooding in EventManager. Fixes intensity going up when a submarine with large ballast tanks dives. +- Fixed gaps generating incorrectly on sloped walls that have been mirrored vertically (horizontal gaps when they should be vertical and vice versa), preventing water from getting through the wall when it's damaged. +- Fixed sub MD5 hash not getting recalculated when saving a sub, causing a mismatch when trying to host a server without restarting. +- Fixed item highlights being visible in the generated sub preview images. +- Fixed cargo spawning partially inside walls in Azimuth. +- Fixed ragdoll going crazy when trying to run a wire past the maximum length. +- Fixed LOS effect "twitching" when the cursor is close to the character's position. +- Fixed handheld sonar pinging and quickly draining the battery when holding E. +- Fixed PowerContainer's charge indicator going outside bounds if the charge is set higher than the capacity in the sub editor. +- Fixed sub editor's entity list resetting when pressing esc. +- Fixed reactors degrading all the way to 0% condition and exploding when submerged. +- Fixed dumptofile command not including error messages. +- Fixed salvage missions not considering the item to be salvaged if it's inside a container in a character's inventory. +- Fixed ragdolls going crazy when moving directly from the sub to a ruin (e.g. when parking the sub so that the airlock is right against the entrance to the ruins). +- Fixed audio staying disabled when disconnecting and reconnecting the audio device. +- Fixed inability to detach an item the same round it's attached if it's been loaded from a save as a part of a character inventory at the beginning of the round. +- Fixed trying to give an order to a character who can't hear you when using the quick-assignment on the command interface. +- Avoid giving different campaign locations the same name. +- Fixed bots sometimes getting stuck in the "get item" objective, if the item was specified with a reference instead of identifier. +- Fixed bots getting stuck in broken hatches when they climb in ladders. +- Fixed a bug where a waypoint lost all the references when it was selected and the user pressed over an UI element, like the save button. + +--------------------------------------------------------------------------------------------------------- +v0.9.10.0 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Added 2 new moloch variants: Black Moloch and Moloch Pupa. +- Reworked Moloch. +- Overhauled level layouts and events (longer and more difficult levels). +- Added two new afflictions: medical items and poisons cause organ damage instead of internal damage and explosions cause deep tissue injuries. Both are functionally identical to internal damage, and treated with the same items. +- Added DXT5 texture compression to reduce memory consumption. Slightly increases loading times; if you're not short on memory, you may want to disable the compression from the game settings. +- Added partial dismemberment for live creatures. Currently enabled only for non-humanoids. (Dismembering dead bodies was already in the game). +- Destructible shells/armor -> Moloch's shell can now be destroyed. +- Added a new monster AI state: Protect. +- Increased the threshold for limping and changed the calculations. +- Added limping for non-human characters. +- Modded servers show up as purple in the server list. +- Added 4 new background music tracks. +- Added parameter autocompletion to the "spawnsub" command. +- All content types except UI styles are now hotswappable. +- Made smoke detector logic more accurate (no size restrictions on the size of the fire, the fire doesn't have to be inside the same hull). +- Added "Output" and "FalseOutput" properties to smoke detector. +- Option to define ambient light values for individual hulls in the sub editor. +- Characters float in place instead of sinking when staying still underwater. +- Improvements to water flow forces: flowing water can push characters around much more heavily now. +- Balanced item prices and fabrication/deconstruction recipes. +- Balanced medical items. +- UI layout improvements when using an ultrawide resolution. +- Added "set_channel" input to wifi components. +- Added "power_value_out" and "load_value_out" outputs to reactor. +- Added search/filter boxes to content package list in the settings menu and item lists in the Workshop menu. +- Added submarine filter to the server lobby. +- Detonators are only triggered by non-zero signals. +- The state of toggleable controllers (= switches) can be set in the sub editor. +- Made toolboxes purchaseable. +- Added a warning to keep the drone door closed in Remora. +- All Thalamus cells die when the Thalamus dies. +- Removed "hold fire" option from the "operate weapon" order, display turrets on minimap as icons instead of text. +- Added some logic to prevent the game from modifying/deleting any vanilla content in any situation. +- Readded legacy Carrier (doesn't spawn naturally but can be spawned with console commands). +- Modified Typhon 2's coilgun rotation limits a bit so it isn't possible to hit the walls when firing at enemies near the airlock. +- Hulls can be multiedited in the sub editor. +- Placed down wires can now be re-equipped in the sub editor by double clicking a loose end. +- Added charging docks to Remora. +- Adjusted how pixel sizes are converted to meters (which are used to display the submarine's dimensions and distances on the navigation terminal). Previously 100 pixels corresponded to 1 meter, now it's 80px -> 1m, making the human characters about 1.75m tall. +- Distance calculations on the navigation terminal take the shape of the path into account instead of just using the direct distance to the target. +- Made improvements to the manual order assignment by adding always visible name labels, displaying indicators for characters' current orders, and repositioning the nodes. +- Reduced the damage range of fires, characters don't take damage from fires if there's a closed door or a wall in between. +- Always draw steering indicators at the center of the display instead of the center of the sub. Fixes indicators getting offset (sometimes even outside the display) during docking. +- Added option to give all command perms with the "givecommandperm" command by using "all" as the parameter. +- Wrecks with no predefined Thalamus items can no more be infested by Thalamus. Allows to create wrecks that always spawn without Thalamus. +- The "shut down" reactor order now allows the bot to continue doing other things after powering off the reactor, instead of just standing next to the reactor. +- Removed the "initiative" skill -> all bots should now react better when there's something to do. Note: this doesn't mean that they always react on everything. It's just the end of individualism. At least for now. +- Reduced the physical forces applied on characters when they are hit by melee weapons, harpoons, or frag grenades. Adjusted stun for crowbar and harpoon. +- Disabled retreat/escape behavior for the bots when they take damage from items or explosions. They still escape/fight back when attacked by other characters. +- Refactor the medic priority calculations/logic: Bots should never treat others autonomously, unless they are medics or ordered to rescue. Bots should always give a high priority for treating themselves, unless there's a medic on board. +- Adjusted the flipping logic of non-humanoids to make them flip less frequently. +- Monsters won't anymore target nasonov artifact unless it is inside the player submarine or in the player inventory. + +Modding: +- Made it possible to use repair tools with StatusEffect's UseItem. +- Made pressure deaths more moddable. Dying because of high pressure isn't hard-coded anymore, the characters are just given the barotrauma affliction which (by default) kills them. +- Added "HideConditionBar" property to items. +- Fixed wearables staying on the character when the item is removed by a status effect. +- Character light sprites can now deform. The cells of Thalamus (Leucocyte and Terminal cell) now use the deformable light sprites. +- Creature flipping parameters are now exposed. Adjusted the flipping for all creatures. +- Allow to define character joints as weld joints in addition of normal revolute joints. Weld joints don't rotate. +- Allow sound definitions to ignore the muffling effect. +- Exposed the "scatter" value and added new "offset" attribute for monster events. +- Added support for status effects in limb definitions (ragdoll file). +- Status effects defined in the character definition can now also target limbs. +- Added ActionType.OnSevered status effect for limbs. +- Creatures can now be set to disrupt sonar. +- Player attacks can now also use the conditionals (i.e. when player is controlling a character). Previously only the AI used the conditionals. +- Conditional sprites don't anymore require a texture definition. +- Conditional Sprites can now be non-exclusive -> Draw more than just one sprite at a time. +- Fixed conditional sprites not being able to target limbs. + +Bugfixes: +- Fixed crashing when opening the tab menu when there are clients present with no job preferences set. +- Fixed "ColdCavernsMaze" levels sometimes being extremely short. +- Fixes to level generation when playing with a very large submarine. +- Fixed bots being unable to shoot at enemies from another room/hull. +- Fixed bots being unable to get items from dead bodies. +- Fixed submarines being unable to move vertically in the submarine test mode. +- Fixed crashing when starting a new round with no audio device (speakers, headset) available. +- Improvements to shadow/LOS rendering. +- Fixed double click being ignored if it's been less than 0.4s since the last double click. +- Fixed all servers sometimes not showing up in the server list (showing only the servers in the same/nearby region). +- Fixed "lone sailor" achievement not unlocking in single player. +- Fixed "Gaze in to the Abyss" achievement sometimes unlocking as soon as the round starts. +- Fixed characters sometimes being unable to exit the submarine when outside the borders of the level. +- Fixed ruin/wreck monsters not spawning if the submarine is too close to them. +- Fixed ruin items sometimes getting saved as a part of the main submarine in the campaign. +- Fixed rare "item with the same key has already been added" errors when starting a round (particularly when playing with a submarine with very large numbers of items/structures). +- Thalamus entities can't be selected in the sub editor when they're hidden. +- Fixed "spawnsub" console command not working. +- Fixed projectiles, welding tools and plasma cutters hitting destroyed Thalamus organs. +- Fixed reactor not shutting down if the turbine/fission rate are controlled via signals even the power switch is toggled off. +- Fixed reactor sliders not moving when they're controlled by signals. +- Fixed level triggers sometimes affecting entities that have left the trigger. The most noticeable effect was characters getting burn damage indefinitely after they've been close to a hydrothermal vent. +- Made flamers fire proof to prevents the flames from blowing up the fuel tank inside it. +- Don't allow harpoons to stick to very small limbs (such as mudraptor's "mouth tentacles"), because it lead to physics glitches. +- Fixed the husk infection crashing when turning the character, if either the non-husk or the husked variation has no inventory defined. +- Fixed characters getting weapon XP after using a turret, until someone else operates the same turret. +- Fixed characters being able to crouch when their pose is controlled by a controller (e.g. periscope, modded chair). +- Fixed bots being unable to aim correctly when operating a turret in another submarine (such as a remotely controlled coilgun in a shuttle). +- Fixed bots sometimes taking too much time to interrupt their current objective when the room they're in floods, causing them to get crushed by pressure. +- Fixed bots sometimes letting go of ladders too soon, preventing them from reaching certain areas (such as the upper platform in Berilia's cargo bay). +- Fixed multiple bots sometimes trying to treat the same person. +- Bots stop grabbing the character they're treating after they're done. +- Fixed harpoons going through doors. +- Fixed depth charges going through level walls. +- Fixed husks attacking human husks wearing a diving suit. +- Fixed first shot from a firearm that uses a magazine/clip not doing anything. +- Fixes to waypoints in Kastrull, Berilia and Remora. +- Fixed chat-linked wifi components not working in single player. +- Fixed chat-linked wifi components not working in multiplayer outside of combat missions. +- Fixed Azimuth using tutorial junction boxes instead of normal ones (the tutorial variants are indestructible and don't have signal connections). +- Fixed autopilot not being able to navigate past wrecks. +- More reliable syncing of door's breaking state. Fixes doors sometimes being impassable or impossible to repair client-side, particularly when joining mid-round. +- Fixed repairing doors getting interrupted at 50% when the door's collider is re-enabled and the character pushed out of the doorway. +- Fixed items getting used in the health interface when dropped on a subinventory slot in front of the interface. +- Fixed dedicated servers letting clients join with an invalid name when there's no server owner. +- Fixed server letting clients join with a name that's already taken. +- Changed "creating hulls between docking ports failed" from errors to warnings. Allows creating exterior docking ports that aren't next to a hull without having the console pop up every time the port is used. +- Fixed changing resolution not updating character inventory slot sizes properly, causing invalid spacing in dead characters' inventories. +- Don't allow detaching signal components when rewiring is disabled or the item's connection panel is locked. +- Fixed misaligned hull next to Wreck1's airlock. +- Fixed "attempting to remove an already removed item" errors when mass-deleting items. Happened because removing items a wire is connected to removes the orphaned wires automatically. +- Fixed multi-part subs (example case: The Aeche III) getting teleported to oblivion when flipped. +- Fixes to bots getting stuck or killed for no apparent reason when the player is very far from them, due to the bots switching to a "simple physics mode" which prevents them from doing certain kinds of interactions. +- The explosive cargo mission that places a block of Volatile Compound N in one of the crates no longer requires delivering the volatile block to the destination. +- Disabled crush depth in the submarine test mode. +- Fixed monsters staying invisible if they die far away from the camera view. +- Fixed very small limbs (mudraptor's mouth tentacles, husk appendages) launching off at a very high velocity, leading to glitchy physics behavior, when hit by a non-raycast projectile or an explosion. +- Allow subs to be saved to subdirectories of the "Submarines" folder (e.g. "Submarines/Downloaded"). +- Fixed a couple of waypoints in Berilia that prevented bots from using the ladders. +- Fixed Husked Crawler bleeding red blood. +- Fixed the priority of the operate order being 69 when it should be 70, which sometimes caused bots to get stuck between two objectives (like repairing or fixing leaks). +- Fixed enemies always using the priority defined for "room" when they should use the priority for "sonar". +- Fixed monsters not being able to drop down from platforms/hatches etc. In practice they still have difficulties in getting down from the hatches when they don't swim because they are so big. +- Fixed bots ignoring themselves as a target when they are rescuing others. +- Fixed numerous issues in the monster behavior when simple physics is enabled. e.g. Ignoring targets or not being able to attack or eat them. +- Fixed hitting damage modifiers emitting a ridiculous amount of particles. +- Fixed some cases where bots fail to open the door that they should be able to open (because they skipped a waypoint without checking the doors). +- Fixed monsters not keeping inside the level. +- Fixed a crash when the command interface button was pressed while the player is controlling a custom monster that didn't have character info but was able to speak. +- Fixed monsters sometimes ignoring their target after attacking. + +--------------------------------------------------------------------------------------------------------- +v0.9.9.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed bots being unable to fire turrets due to the visibility raycast hitting the turret's collider. +- Fixed submarine's version number resetting to 0.0.0.0 when saving in the sub editor (didn't affect the actual saved sub file, only the in-game metadata that got fixed by restarting the game - so there's no need to do anything to fix the sub files you saved with the previous version). +- Fixed server list occasionally crashing when trying to filter based on game mode. +- Fixed an issue in multiplayer campaign that occasionally caused clients to get kicked with a "missing entity" error message. +- Fixed clients occasionally crashing when joining a server mid-round. Happened when the client tried to execute the attack of a monster that has already despawned server-side. +- Fixed local changes an user has made to a mod getting overwritten when the item gets autoupdated. +- Changed the hotkey to toggle the entity list in the sub editor from Q to the "toggle inventory" keybind to make it a little more user-friendly on AZERTY keyboards. +- Fixed corpses in wrecks being considered dead members of the crew in SteamAchievementManager, preventing "lone sailor" from unlocking and making it possible to unlock "last man standing" with just one character. + +--------------------------------------------------------------------------------------------------------- +v0.9.9.0 +--------------------------------------------------------------------------------------------------------- + +- Added wrecked submarines to levels. +- Reimplemented carrier (now called Thalamus). +- New submarine, Azimuth. +- Miscellaneous performance optimizations. +- Improvements to traitor missions (slightly simpler, with clearer instructions). +- Reduced the skill requirements for mechanical repairs. +- Reduced the damage when a mechanical repair fails. +- Rebalanced mission rewards. +- New water ambience sounds. +- Speed up despawning when there are lots of bodies inside the sub, enemies despawn x2 faster. +- Salvage missions can be completed by taking the artifact to the start outpost (the descriptions don't specify which outpost to return it to). +- Characters with insufficient skills can fail at mechanical repairs, causing minor injuries. +- Gaps that are inside a hull don't flood the sub, a warning icon is displayed on those gaps in the sub editor. +- Added submarine test mode to the sub editor. +- Moved the entity filter panel and "previously used" panel in the sub editor to the top left corner of the screen. +- Pressing enter after modifying the value of a text field in the sub editor is no longer required. +- "teleportsub" console command can be used to teleport the sub to the position of the cursor. +- The engine vibrates and plays a loud sound when it's damaged to indicate more clearly that it needs repairs. +- Added animated lights to alarm buzzers and sirens. +- Sonar beacon's label can be edited in-game. +- Assistants gain skills faster than other characters. +- Skills increase faster during non-campaign rounds. +- More noticeable particle effects on damaged devices. +- Added "itemdamage" parameter to the explosion command. +- Huskified characters turn to the final stage faster. +- Using the "dumptofile" and "findentityids" commands doesn't require a permission from the server. +- Added Scale and Color properties to DecorativeSprites. +- Added OnDamaged status effect type. +- Added lights that indicate the state of a docking port. +- Significantly increased the item damages of all explosives. +- Replaced the old husk stinger with tentacles (similar to Husked Crawler). +- Minor adjustments to Husk, Human Husk, and Husked Crawler. +- Modding: Added "probabilitymultiplier" attribute for damagemodifiers. Can be used to make items/armor affect the probability of getting an affliction. +- Diving suits now give some protection against husk infections. +- Light components can be set to flicker in the sub editor. +- Fixed odd movements when pressing the ragdoll button while stunned. +- Made it easier to interact with doors that are overlapping with a docking port/hatch. +- Option to disable bot conversations in multiplayer in the server config file. + +Submarine editor improvements: +- Removed character mode. All the functionality of the character mode is now supported in the default mode. +- It's possible to modify the properties of multiple selected entities at the same time. +- Autosaving (the submarine is automatically saved to a temporary file which can be recovered if the game crashes). +- Added hotkeys for a bunch of actions (the hotkeys are visible in the tooltips). +- Pressing F focuses the camera on the selected entities. +- Control + A to select/deselect everything. +- Hold shift to ignore the grid when placing / resizing. +- The outlines of all wires are shown in wiring mode. +- Orphaned wires are deleted automatically. +- The content of the search box isn't reset when switching entity categories. +- Mouse middle mouse dragging is now 1:1, previously the view moved too fast. +- Linked submarines now have visuals when dragging. +- Holding down arrow keys now continues to move the entity after a small delay. +- Changing the background color by shift right clicking. + +Antigriefing improvements: +- Players can be kicked/banned/muted/votekicked and their ranks changed by right clicking the name in the crew list or chat. +- Karma penalty for stunning: gets progressively more severe the more stuns a player causes. +- Stealing weapons or ID cards from stunned/unconscious characters reduces karma. +- Added karma category to server log. + +Tab menu improvements: +- Improved layout. +- Show the roles of the players (moderator, admin, host) in the player list. +- Characters can be muted/kicked/banned from the player list. +- List the players who have joined/left the server. +- Display spectators in the list. +- Show player pings in the list. + +Command interface improvements: +- Contextual commands: characters can be ordered to operate/repair/use specific items by holding shift while enabling the command interface. +- Job icons are shown in the command interface to make it a little faster to differentiate between characters. +- Added separate orders for repairing electrical and mechanical devices. + +VOIP improvements: +- Added a keybind for local voice chat (= it's possible to only speak to players next to you without everyone within headset range hearing it). +- Added an adjustable delay for cutting audio capture after the push-to-talk key has been released. +- Fixed audio being suppressed when someone speaks even if VOIP volume is low or completely muted. + +Workshop improvements: +- "Enabling" a mod through the ingame Workshop screen is no longer a thing; subscribing to a mod is all you need to do for the game to install it once it's downloaded. +- Loading preview images and installing mods is done asynchronously (= no lag spikes). +- Added notifications to the main menu to indicate when mods are being downloaded and have been installed. +- Files are automatically added to the Workshop item publish menu as they're added to a to-be-published content package's directory. + +Bugfixes: +- Fixed achievements not unlocking. +- Fixed positions of artifacts spawning in caves and on level walls getting desynced between the server and clients. +- Fixed new wire node being created at an item client-side if connecting the wire fails due to an electric shock server-side. +- Fixed clients executing console commands they don't have permission to use. +- Fixed enablecheats command not being relayed to server. +- Fixed light component and alarm siren/buzzer states occasionally getting desynced. +- Fixed inability to enter the sub through very small hulls. +- Fixed antibiotics not giving husk infection resistance when shot from a syringe gun. +- Fixed text overflows in the player management panel in the server lobby in languages other than English. +- Fixed searchlight toggle doing nothing. +- Fixed hulls that have minuscule amounts of water in them (too small to be even rendered) being able to trigger InWater effects and water footstep sounds. +- Fixed pumps dicarding the previously received set_targetlevel signal after 0.1 seconds, preventing manual control systems from working if the pumps aren't receiving a continuous set_targetlevel signal. +- Fixes to occasional crashes when rendering alien artifacts. +- Fixed radio chat key not working. +- Fixed reconnected clients not gaining XP. +- Fixes to sprite depth issues in Berilia's decorative fin structures. +- Fixed bots with an active order not switching to idle state when they have nothing to do, causing them to stand in place or walk against a wall. +- Fixed docking ports without a door sometimes getting linked to an incorrect door, preventing the door's linked gap from working correctly. +- Fixed monsters not spawning in ruins if the submarine hasn't left the starting outpost. +- Fixed freezing caused by SoundManager.InitStreamThread. +- Fixed generic Powered components (= charging dock) always using the default power consumption value defined in XML even if the power consumption is changed in the sub editor. +- Fixed last traitor objective's end message not being shown. +- Fixed command interface showing non-interactable devices as valid targets. +- Fixed dragged characters sometimes getting stuck on staircases. +- Fixed serious performance issues triggered by bot's combat and rescue objectives when there are no safe hulls left. +- Fixed characters being grabbable through walls. +- Potentially fixed a crash in GameMain.WindowActive caused by voice chat capture when the game is exiting. +- Spawn cargo above the floor structure of the cargo room, not above the bottom of the cargo hull. Fixes items spawning partially inside structures where the hull extends below the floor. +- Fixed all monsters bleeding red blood. +- Fixed light sprite's scale not being taken into account in light culling, causing lights with a large scaled-up light sprite to disappear before they're off-screen. +- Fixed damageable items not taking damage from repair tools. +- Fixed hitscan projectiles not hitting items. +- Fixed the short freeze when switching to the sub editor. +- Fixed sprites not being included in the xml element when using "copy to clipboard" in the particle editor. +- Fixed clients being able to use the number inputs in the multiplayer campaign store without the appropriate permissions. +- Fixed ability to buy more than 100 items of a kind despite 100 being the limit of how many purchased items of a kind can spawn. +- Fixed handheld sonar pinging when LMB is held, quickly draining the battery. +- Added some checks to prevent character sounds from crashing the game when audio playback is disabled. +- Fixed character collider's angular damping getting set to 0 if the character gets frozen, which caused the character's swimming animation to get wobbly. +- Fixed private messages not having the [PM] tag when dead. +- Fixed inability to open the health interface when hovering the cursor over another character, even if the character's health interface is inaccessible. +- Fixed bots being inactive when far away from all player characters. +- Fixed some particles (like muzzle flash) not being drawn on top of structures that are outside hulls. +- Fixed enemies being unable to target entities outside the submarine if they are inside it. +- Fixed oxygenite shards and tanks causing characters to move at turbo speed. +- Fixed waypoint links to gaps, doors, and ladders etc being removed when linking waypoint to another in the sub editor. Allow to remove links between waypoints. +- Fixed "teleportsub" console command teleporting also the connected outposts. +- Fixed characters getting stuck on platforms that extend outside the sub. +- Fixed diving suit lockers that have been recolored in the sub editor switching back to the default color when a suit is placed inside them. +- Coilgun/railgun loaders don't deteriorate if launching the turret fails. Fixes loaders deteriorating rapidly if the turret is receiving a continuous signal. +- Fixed rendering glitches on the surface of water when there's steep angles on the surface. +- Fixed inability to fire ranged reapons from sub to another through docking ports. +- Fixed inability drag characters from sub to another through docking ports. +- Fixed bots trying to shoot targets inside the alien ruins. + +--------------------------------------------------------------------------------------------------------- +v0.9.8.0 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Added husked Crawler. +- Re-worked Crawler. +- Moloch: Changed behavior. Added attacks on the tentacles. Fixed some behavior and targeting related issues. +- Improved eating animations. +- Rebind monster attack to "R", because the middle mouse button is now reserved for the command interface. Fixes attacking while controlling a husk or some other monster. +- Calculate the direction from the limbs separately when attacking. Fixes some issues when an attack applies forces on multiple limbs. +- Added damage protection on Hammerhead Matriarch's and Moloch's skirts/tentacles. +- Changed the ai target calculations for characters. +- Adjusted the AI targets for: navterminal, sonar, flashlight, diving suit, underwater scooter, flare, fire extinguisher, and many weapons. +- Husk infection progress is now a bit different: The thresholds are different, and the damage is taken only in the final phase before turning. + The final phase now causes minor twitching in the body. +- Husk faces are now only visible on fully turned (human) husks. +- Fixed rapid turning into husk when taking a a lot of damage from husks. +- Monsters with "flee health threshold" defined now only flee when they are being chased. +- Adjusted Bonethresher's attacks. +- Adjusted the AI priorities for Hammerhead Spawn, Husk, Tigerthresher, Moloch, Mudraptor. +- Mudraptors don't flee anymore when on low health. +- Improvements and fixes on the medic AI. +- Add medical autonomous objectives for also other jobs than medics. +- Improvements and fixes on the extinguish fires behavior. +- The bots don't anymore report about low priority issues while fighting or fleeing. Also fixes bots always reporting theirself as the target for the required treatments. +- Movement speed modifiers now adjust the swimming animations and steering forces too. +- Removed deprecated Molochboss. The boss will be reimplemented later. +- Forced aggressive behavior for creatures that are spawned as mission targets, make an exception with the Matriarch. +- Pressing enter is not required after changing values in text fields in the sub editor. + +Modding: +- Husk affliction mechanics now fully support different species. +- Added "Visibility" parameter for the characters (similar to Noise). +- Added "Attack Force Multiplier" for all limbs. +- Implemented per joint and per limb scaling. +- New LimbType: "Jaw". Used for eating animations. +- Added "Attack Distance" parameter, which is currently only used for Aggressive and PassiveAggressive behaviors. +- Added "Constant Angle" and "Constant Torque" for keeping a limb constantly rotated in a desired orientation. +- Allow to define world forces for the root movement in three phases of the attack: start, middle, end. Set the main collider position to the main limb position when the attack ends to fix the rubberbanding behavior after the attacks. +- Implemented "After Attack Delay": A property for adding a delay after the attack has hit the target, before starting to update the after attack behavior (e.g. falling back). +- Renamed "AttackContext.NotDefined" to "AttackContext.Any". +- Added "Retreat" parameter for attacks. When enabled, the character tries to steer away from the target while attacking it. +- Accept the plural "requireditems" when overriding items. +- Replaced "identifiers" with "items" on "RequiredItems" elements. Both strings are handled in code -> no functional difference. Fixed just for clarity. + +Bugfixes: +- Fixes to crashes when autoupdating Workshop items during startup. +- Fixes to disconnections with the error message "expected old event" when loading a round takes a long time. +- Fixed crashing if the selected core content package contains errors (missing files, invalid XML files). +- Fixed splash screen causing a crash on some Mac systems. +- Fixed corrupted save files causing the game to crash during loading. +- Fixed clients being able to run the "enablecheats" command client-side without the permission to use the command. +- Fixed AI inputs not being synced with clients, preventing clients from seeing when the bots aim/shoot/attack. +- Don't allow using the "flipx" console command while playing online. +- Fixed portrait area & health bar being clickable (despite being hidden) when grabbing another character. +- Fixed a case of characters getting stuck facing one direction. Happened when you switched a character when the command interface was enabled. +- Fixed previous order disappearing from the crew list on resolution change. +- Fixed text not being colored according to message type (default/radio/pm/dead) in the chat input box. +- Fixed "collection was modified" exception if drawing a subinventory causes highlighted inventory slots to change. +- Fixed coilgun/railgun projectiles occasionally hitting the wall next to the turret when launched. +- Fixed text overlays "vibrating" when using the Health Scanner HUD while the sub is moving. +- Fixed level editor not saving level generation parameters that are inside an element. +- Fixed job icons overflowing from the job selection panel when using mods that add more jobs. +- Fixed clients being unable to cancel file transfers. +- Fixed StatusEffects with a delay or a duration "transferring" to another target when the same effect is applied on another entity (for example when using the same stabilozine syringe on multiple characters). +- Fixed particles spawned in StatusEffects only copying the emission angle of the parent item, but not the rotation when CopyEntityAngle is set to true. +- Fixed terminals not sending any outputs server-side. +- Fixed bots unequipping diving suits when they shouldn't. Only happened while doing a low prio objective. +- Fixed retreating bots attacking with adhoc weapons like tools. If the bots retreat, they shouldn't use weapons at all. +- Fixed the priority calculation for the rescue all objective. Should fix bots refusing to treat seriously injured characters and also fixes the priority of the targets. +- Fixed occasional rapid flipping (usually noticeable only in debug draw mode) when a bot has no valid path or the path has ended. +- Fixed bots sometimes not being able to climb ladders because they skip a node too early. Happened especially in Katrull. +- Fixed some cases where bots fail to release the ladders when they should. +- Fixed bots occasionally disgarding an autonomous objective with low priority after starting to follow it. +- Fixed bots ignoring unsafe hulls (= any threats) when they shouldn't and consequently heading into danger. +- Fixed some monster attacks causing internal damage instead of bitewounds. +- Fixed Hammerhead Matriarch's head damage modifier ignoring bitewounds. +- Fixed latched creatures not reacting on being damaged. +- Fixed monsters flipping constantly while swimming. +- Fixed Husks not regenerating health properly. +- Fixed AI targets not being decreased on inactive items. +- Fixed fire extinguisher definition (xml): the identifier and the tag shouldn't be the same string. +- Fixed monsters sometimes moving slower than they should when walking inside. +- Fixed charge indicator not being flipped in horizontally/vertically flipped batteries. +- Fixed fabricators occasionally getting stuck to the active/inactive state client-side when the fabrication is paused due to insufficient power. +- Fixed ancient weapon not cutting through holes in walls. +- Fixed ambient light being brighter in the submarine editor than in-game. +- Fixed walk speed not being affected by speed reductions. +- Fixed all enemies ignoring the speed modifiers. +- Fixed wires appearing as loose items on the floor after saving and reloading if they've been disconnected from both ends. +- Fixed non-stackable status effects with a duration having no effect. + +--------------------------------------------------------------------------------------------------------- +v0.9.7.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing when attempting to publish Workshop items. + +--------------------------------------------------------------------------------------------------------- +v0.9.7.0 +--------------------------------------------------------------------------------------------------------- + +UI/UX improvements: +- Graphical and functional overhaul of all user interfaces. +- Cursor changes according to what it's hovered on (hand icon when on a button, caret icon when on a textbox, etc). +- New loading screen. +- Better feedback on shooting. +- Double clicking on an item moves it to the equipped inventory (e.g. ammo to the equipped weapon). +- Periscopes can be deselected by pressing esc. +- Fabricators can pull ingredients directly from the user's inventory without having to place them in the fabricator's input slots. +- Lock the on/off switch in the pump interface when the state is controlled by signals, same with the engine slider. +- 1 second cooldown before doors can be opened/closed after someone else has opened/closed them. Makes it less likely for doors to be opened/closed accidentally when multiple people are trying to use them at the same time. +- Show a warning if trying to start a campaign for the first time without playing the tutorials. +- Diving suits and fire extinguishers are not automatically picked up from the lockers/brackets when clicking on them to make it less likely to accidentally pick them up. Instead, clicking on them opens the inventory of the container, the same way when interacting with e.g. a steel cabinet. +- Subinventories (= inventories inside items, toolboxes for example) open/close faster and cannot be interacted with until fully open. +- Contents of toolboxes and crates are shown in the tooltip when hovering the cursor over the slot. +- In-game message boxes (mission/traitor notifications) close automatically after 15 seconds if not interacted with. +- Right-clicking in the sub editor opens a context menu that can be used to remove, cut, copy and paste entities (making it possible to remove them when using a keyboard that doesn't have a delete key). +- Hide cursor when aiming with a turret or a ranged weapon. +- Hide inventory when operating a turret. +- Added filtering to sprite and particle editors. +- Added a "Decorative" category to the submarine editor. +- Made docking indicators more visible on the sonar. +- Show mic input level also when Push-to-Talk mode is selected to make it easier to adjust the level without having to switch the mode to Voice Activity. +- Pressing the up arrow brings up previously sent chat messages, making it easier to resend them. +- The filter in the sub editor only searches from the currently selected category. + +Optimizations: +- Major physics optimization. Most importantly, the physics are now multithreaded, making the game perform much better when there are large numbers of characters active. +- Item optimizations. Items that don't currently have any components active are not updated, which significantly improves the performance especially in large subs with lots of items. +- More aggressive character culling (characters stop being rendered as soon as they exit the camera view). +- Dead bodies despawn after a few minutes (or when the character respawns in multiplayer). The despawning character's items are placed in a duffel bag and dropped near the body. Prevents performance issues when lots of bodies start to accumulate in the submarine. +- Preload necessary monster assets at the start of the round to prevent lag spikes when a monster spawns. +- Fixed serious performance issues when creatures are on the borders of the sub (some issues still remain). +- Improved the performance of human AI (bots). + +Additions and changes: +- Added Korean translation. +- Added an improved version of Typhon. +- Reworked Berilia. +- New shuttle, "Hemulen". +- Merged Selkie and Bunyip into a new, improved shuttle (just called Selkie now). +- Increased level sizes. +- Rebalanced monster spawns. +- Balanced skill levels and skill gains. +- Skill gain values are now moddable (see Content/SkillSettings.xml). +- Added a few new artifact missions. +- The job gear variants are not just visually different versions of the same item, but completely separate items. The job variants now allow the players to choose what kind of gear they want to spawn with, not just the look of the uniform. +- Attachable items and wire nodes can now be freely placed around the character instead of always being placed at the position of the character. When attaching items/wires, there's a placement grid that makes it much easier to neatly attach/wire things mid-round. +- The submarines now get automatically outfitted with a semi-random selection of supplies when starting a campaign. The items that have been manually placed in the submarine editor are kept as-is. +- Split internal damage into multiple subtypes: blunt force trauma, lacerations and bite wounds. The new afflictions are functionally identical to the default internal damage affliction, but can be used to identify the source of the injuries. +- Humans are more resistant to gunshot wounds, lacerations and blunt force trauma than monsters. The intention is to allow making weapons more effective towards monsters without making killing your crewmates with them too easy. +- Added a "terminal" item that can be used to send and display textual signals. Could be used for things such as terminals that send commands to devices or display some data received from devices. +- Added muzzle flashes to small firearms. +- Added a crosshair when aiming with small firearms. The crosshair also indicates the spread of the weapon. +- Increased the skill requirements to operate the reactor. +- New background music for editors. +- Characters with an insufficient electrical engineering skill may get electrocuted when rewiring powered devices. +- Added holes in the level walls next to the outpost at the end of the level, so the player doesn't have to backtrack through most of the level if they approach the outpost from the wrong side of the level wall. +- Added heavy water currents at the sides of the level to make it more obvious that you're not supposed to go that way. +- Added subtle chromatic aberration & blur when suffering from heavy bloodloss. +- Nerfed hull damage from plasma cutter and welding tool explosions. +- Removed repair thresholds from items; any device that's not in perfect condition can now be repaired. +- Rebalanced medical items: stat-boosting effects last much longer. +- Modified vigor buffs from steroids and hyperzine to be intantaneous instead of delayed. +- Tweaked opiates. They now do less overdose damage, produce a lower addiction for skilled users, but produce a serious addiction for unskilled users. +- Bandages now have 3 uses. +- Removed oxygenite shards as a product of deconstructing liquid oxygenite to prevent production loops. +- Screwdrivers can be used as shivs! +- Fuel rods now always return their steel on deconstruction. +- Constructing fuel rods now requires lead. +- Mouse button names are now translated. +- Improved tiger thresher texture and lights. +- Replaced the legacy ladder, stair and docking port sprites. +- New alarm buzzer sprite that actually looks like an alarm buzzer. +- New (smaller) small pump sprite. +- Decreased the range and brightness of the "halo" around the players. +- Exposed pump's MaxFlow parameter in the sub editor. +- Added a lot more oomph to nuclear explosions. +- Added damage particle effects that are rendered on top of the characters (also under water). +- Split internal damage into categories: gunshot wound, blunt trauma, lacerations, monster bites, and internal damage. +- Gunshot wound is no longer a bleeding affliction. +- Humans are more resistant to damage caused by weapons (means we can increase the damage on monsters without making the weapons too lethal on humans) +- Added damage protections on some clothes. +- Major SMG buff: larger magazine, less spread, more damage, but slightly lower fire rate. +- Minor Shotgun buff: more damage and stun. +- Slightly decreased the stun effect from revolver ammunition. +- Modding: Removed all texture paths from limbs where they are not required. Fixes issues when trying to create a copy with a custom texture based on an existing character. Note that the "Copy Character" functionality does not automatically replace texture paths that have been defined in limbs, because that could lead into issues. If there are texture paths in the limbs, you'll have to handle it manually. The texture paths defined in limbs are limb specific overrides to the common path defined in the ragdoll's properties. +- Use "weldingequipment" tag instead of "weldingtool" identifier when seeking the equipment for fixing the leaks to enable support for custom welding equipment. +- Use "cuttingequipment" tag instead of "plasmacutter" identifier as required items for collecting minerals to enable support for custom cutting equipment. +- Artifact mission markers are shown on the sonar even after the artifact is on board to make it harder to lose the artifact. +- Made monster mission markers more imprecise. +- Made the "name contains illegal symbols" error message more descriptive (with instructions to change the name to something else). +- CPR damage can be modded by editing the affliction xml. +- A warning when attempting to start a campaign that was saved with different mods than the ones that are currently active. +- Switched from .NET Framework 4.5/Mono to .NET Core 3.0: + - Improves general stability, especially on macOS and Linux. + - Lowers number of dependencies, simplifying the installation process. + - Introduces features that will translate into further stability and performance improvements in the future. +- Switched from MP4 to WebM to minimize bloat and dependencies on patented tech. +- Cap the framerate to 200 FPS when VSync is off to prevent overloading the GPU. The cap can be adjusted by changing the "framelimit" attribute in config_player.xml. +- Wifi components in the respawn shuttle can't communicate with components in other submarines/shuttles. +- Power consumption of damaged devices doesn't increase as much anymore. +- Made tonic liquid purchasable. +- Added combat priorities to alien weapons to allow bots to use them. +- Improved name tag hiding. +- Give job items to humans spawned with the "spawn" command. +- Slightly increased the view range of the coilguns and railguns. +- Continue playing the main menu and editor music from the previous position instead of restarting when switching between screens. +- Marked "editsubs" a cheat command (so you can't just switch to the sub editor, spawn whatever you need and go back to the game without enabling cheats). + +AI: +- Bots can now undock the sub. +- Humanoids now use the "group" property like non-humanoids. This allows non-humanoid creatures to be treated as friendly/neutral subjects by the bots. +- Replaced the generic "cannot reach target" messages with context-specific and more descriptive messages. +- Bots now take the other bots into account when they evaluate the importance of the tasks. Fixes multiple bots going to fix the same leaks or repair the same items. +- Bots should now abandon the combat objective only when not fleeing from an enemy. If they fail to flee from an enemy, they will fight (or avoid) instead. +- Fixed bots loading the turrets only with the default ammunition. +- Fixed multiple bots trying to navigate the submarine at the same time. +- Fixed pathfinding applying 10x more penalty on vertical distance when the host is outside (should only apply inside). +- Fixed bots starting the path from obstructed waypoints or waypoints that are inside when they are outside or vice versa. +- Fixed issues when bots are trying to enter the airlock from outside. +- Fixed bots getting stuck in the combat mode (with 100 priority) when they try to retreat to a target that cannot be reached. +- Fixed two-handed items like ammoboxes not being visible when the bots carry them. +- Fixed issues when the bots try to equip items or contain them inside other items. +- Fixed bots sometimes going to repair leaks/fix things without a mask or a suit. +- Fixed bots being unable to put diving suits into lockers when there already is a diving suit in the targeted container. Instead of dropping it on the ground, the bots now try to find a new place for the suit before abandoning the objective. +- Fixed bots seeking paths through doors when they have a crowbar/wrench equipped. +- Fixed bots sometimes being unable to put off fires and dying while trying to do it (because of a failing raycast). +- Fixed bots not shooting hostile submarines. + +Monsters: +- New behaviors: avoiding, passive-aggressive, and aggressive. +- Adjusted Bonethresher, added a berserker attack when the creature is low in health. +- Revised Matriarch's behavior: Matriarchs now spawn in swarms, protected by other Hammerheads, and they try to keep the distance to the submarine. Boosted the explosion and increased the Spawn count. +- Added new missions about Hammerhead Matriarch. +- Revised all the creatures using the new behaviors. +- Changed how "attack when provoked" works. The previous state is now reset when the target changes. Also fixed several relate issues. Rename the property (requires action if custom characters use it). When a creature is attacked and "attack when provoked" is false and the attacker is not found in the predefined ai targets, the creature flees by default instead of just ignoring the attacker. +- Refactored the eating behavior: fixes small creatures not being able to eat significantly larger creatures. +- Adjusted the commonness and the reward of the Thresher swarm mission. +- Improved the indoors escaping behavior. +- Reduced the linear velocity when not facing the movement direction. Should fix monsters moving unnaturally when abruptly changing directions. +- Increased the swimming speeds of all monsters and adjusted the animations accordingly. +- Improved the path steering while swimming inside the submarine. +- Halved the swimming speeds inside the submarine. +- Increased the attack ranges for Hammerhead and Hammerhead gold to help them reach the targets. +- Don't allow large creatures like Bonethreshers or Hammerheads enter the submarine, because they easily get stuck and it's glitchy. +- Fixed characters that cannot enter the submarine still trying to target the inner walls. +- Fixed Tigerthresher and other creatures that can't attack the submarine bumping on the doors. +- Fixed characters occasionally getting stuck while trying to reach the last known position of the previous target. +- Fixed a crash when the creature is set to attack when provoked and when the damage source is null. +- Fixed extra creature being spawned when using the elements in the monster mission definitions. +- Fixed Hammerhead Matriarch's skirt going throught the walls. +- Fixed performance issues when creatures are trying to find a path out from the submarine while escaping. Also improved the escaping behavior in general. +- Fixed Mudraptors sometimes squeezing themselves towards doors without being able to attack them. +- Fixed monsters not reacting to being fired with turrets unless they can target the attacker. +- Fixed minor slipping in Mudraptor's walking animation. +- Weapons and tools now have ai targets that are only activated when the items are used -> shooting monsters should make you much more attractive target than just swimming peacefully around. + +Multiplayer: +- Fixed a bunch of bugs that caused "missing entity" errors. However, there are many different reasons the error can occur, so even though we have not run into the issue anymore during out testing rounds, there is still a chance it may occur in some situations. +- Fixed inventory items occasionally getting mixed up in the multiplayer campaign. +- Fixed a bug that caused clients to get disconnected with an "invalid object header" error when a character has a large amount of different afflictions. +- Fixed collider tunneling when client is slow to send inputs. Caused characters to occasionally noclip through walls when the connection or framerate is poor. +- Fixed server owner occasionally timing out if loading the round takes too long. +- Fixed server owner's character occasionally being killed due to round start timeouts. +- Fixed players not getting notified in any way when their connection to the server has timed out, allowing them to keep playing without being able to interact with anything. +- Made giveperm/giverank commands suck less by allowing names, endpoints and SteamIDs instead of clientlist id, and allowing users to skip question prompt by adding rank or perm as a second parameter. +- Fixed multiplayer campaign saves appearing in the single player "load game" menu if they're placed in the singleplayer save folder (leading to a crash if a player starts to load the save). +- Fixed server not sending condition updates for inactive items, potentially causing the condition to get desynced when all of the components of the item go inactive. +- Fixed clients only being informed of the reason for their ban the moment they're banned, but not if they try to rejoin. +- Fixed clients not attempting to reconnect to the server automatically when the connection is lost, forcing the client to rejoin the server manually. +- Fixed clients sometimes being able to noclip through walls when the framerate or connection is poor. +- Karma system can be enabled/disabled in the "host server" menu. +- Option to set the number of password retries before a ban. +- Fixed voice chat indicators not working in the in-game crew list. +- Moved "End Round" button to the pause menu. +- Added a separate server log category for wiring. +- Fixed clients not relaying console commands that don't exist client-side to the server (i.e. custom commands implemented by a server mod can now be used by clients). +- Added "killdisconnectedtime" command that can be used to set the time after a disconnected player's character gets automatically killed. +- Increased default killdisconnectedtime to 2 minutes. +- Player cap can be adjusted in the server settings. +- Made "showseed" console command usable by clients. +- Fixed lobby command (which switches to the single player lobby) being usable in multiplayer. + +Bugfixes: +- Fixes to render order oddities (structures with a depth > 0.5 always rendering behind all items, inconsistent render order between sub editor and in-game). Now structures with a depth of >= 0.9 are always behind everything (and visible through the LOS effect), and item's sprite depth is capped to 0.9. +- Fixed background structures that are resizeable on both axes always being drawn behind other background structures regardless of the sprite depth. +- Fixed Kastrull flooding when the drone undocks. +- Fixed ballast pumps deteriorating in Kastrull's drone despite being unreachable by the players. +- Fixed sonar transducers consuming no power. +- Fixed EventManager intensity being calculated incorrectly in multiplayer, causing monster spawns to be more sparse in multiplayer than in singleplayer. +- Fixed autopilot overshooting and compensating too heavily when attempting to maintain position, causing it to never fully stop on the target position. +- Fixed charactes being unable to get through multi-layer walls from inside the sub (for example the walls above Humpback's command room). +- Fixed plasma cutter not cutting through holes in walls. +- Fixed melee weapons not working inside ruins due to the colliders that block subs from entering the ruins. +- Fixed fabricator cancellation failing to be communicated under certain circumstances. +- Fixed fabricator and deconstructor operating faster when run on overvoltage, making it possible to fabricate/deconstruct things almost instantaneously by using relays. +- Fixed camera position "twitching" when moving the cursor around while unconscious. +- Fixed crashing if there's no audio device available. +- Fixed texts in mission/traitor notifications occasionally overflowing outside the border of the message box. +- Fixed subinventories not opening when trying to heal an unconscious character. +- Fixed engines causing crashes if MinVoltage is set to 0. +- Fixed small "twitch" when a character enters or exits a submarine. +- Fixed starting a combat mission with just 1 player counting as winning the mission. +- Fixed linked shuttles occasionally spawning at the wrong side of a sub's docking port. +- Fixed clients being assigned as traitors in combat missions even if there's no-one else in their team. +- Fixed server lobby screen not scaling correctly after changing to a bigger resolution. +- Made the screen distortion effects caused by afflictions change less abruptly when the condition of the character changes quickly. +- Fixed items being swapped from slot to another when combining an item with one that has a higher condition. +- Fixed lights in deviced bleeding through characters and blurry black "shadow" around characters. +- Fixed '+' and '-' signs in number input fields being misaligned in Chinese and Japanese. +- Fixed Workshop item descriptions only showing the first 256 characters. +- Fixed reactor highlight effect extending outside the reactor sprite. +- Fixed ID-restricted doors only taking the first ID card in the inventory into account. +- Fixed crashes in the character editor when creating a humanoid with incomplete limb definitions. +- Fixed the character editor crashing if no textures were found. +- Don't allow to save invalid texture paths in the character editor. +- Decreased the range of some of the motion sensors inside alien ruins to prevent certain rooms from being nearly impossible to get past without getting zapped by an alien coil. +- Fixed excessively large tonic liquid collider. +- Fixed accordion collider. +- Fixed doors not blocking hitscan weapons. +- Fixed sonar showing everything around the sub when sending out a directional ping and immediately switching to passive. +- Fixed inability to drag characters from room to another in alien ruins. +- Fixed crashing if a modded UI style contains multiple child styles with the same name. +- Fixed wire nodes getting misplaced when flipping wires in the sub editor. +- Fixed groups of items that include wires sometimes not getting placed at the position of the cursor when pasting them in the sub editor. +- Fixed currents heavily slowing down the submarine regardless of the force or direction of the current. +- Fixed some held items vibrating/twitching when moving. +- Fixed turrets emitting muzzle flash particles in an incorrect direction (the rotation of the particle was correct but the direction it flew towards not, which isn't noticeable with the non-moving vanilla particles). +- Fixed "skip tutorials" returning to the main menu instead of opening the correct tab when starting a new game. +- Fixed all items being highlighted in the multiplayer campaign store menu when another player buys something. +- Fixed setting the number of items to buy by typing a number in the text box being practically impossible in the multiplayer campaign store. +- Fixed grenades exploding multiple times if you throw one, pick it up before it explodes and rethrow it. +- Fixed bots occasionally letting go of ladders too soon when going to operate an item, causing them to fall down. +- Fixed some waypoint issues in Orca. +- Fixed wifi components in the respawn shuttle being able to communicate with the main sub in non-combat missions. +- Fixed engine sound range being up to 20 times larger than it should be. +- Fixed monsters occasionally being able to attack through walls. +- Fixed alarm buzzer not returning to the original rotation when the alarm stops. +- Fixed a couple of unfair ruin traps (rooms with coil/sensor placement that makes it impossible to pass through without getting zapped). +- Fixed mechanic tutorial getting softlocked if the player never has an oxygen tank (or aluminium) and sodium in their inventory at the same time. I.e. if they deconstruct the oxygen tanks first and put the aluminium in the fabricator, and then get the sodium and put it in the fabricator. + +--------------------------------------------------------------------------------------------------------- +v0.9.6.0 +--------------------------------------------------------------------------------------------------------- + +Networking/multiplayer fixes: +- Fixed the game occasionally freezing when joining a server. +- Fixed a bug that occasionally caused clients to disconnect with an "entity not found" error in the multiplayer. In technical terms, the issue occurred when the server spawned an entity with a given ID, sent a network event for that entity, and then spawned another entity that took up the ID of the previous entity. This could happen, for example, if in the multiplayer campaign a player happens to get an item with the same ID as an item in the inventory of another player who isn't currently present, and the other player joins the server. There are still most likely additional bugs that can cause similar error messages, so this fix will probably not get rid of the errors entirely. +- Fixed start button staying disabled in the server lobby when switching from the campaign mode to another game mode. +- Fixed clients occasionally getting disconnected due to the campaign store. Happened if a location had changed from one type to another (for example, natural formation to outpost), the players had bought something that wasn't originally available from the location and a new client joined. +- Fixed clients occasionally being prompted to download subs from the server even if they already have a matching sub. +- Fixed server having a password even if the password box is left empty in the in-game "host server" menu when hosting with the Linux version. +- Fixed server name being shortened to one word when hosting from the in-game "host server" menu with the Linux version. +- Fixed server name length not being restricted when set from serversettings.xml or using console commands. +- Fixed "ready to start" tickbox disappearing if a client joins while a round is running. +- Fixed traitors remaining as traitors client-side after restarting the round, allowing them to access the sabotage interface despite not having a traitor objective. +- Fixed characters occasionally not selecting/deselecting a periscope client-side, causing them to walk in place or not grab the periscope. +- Fixed male asian heads not appearing in the server lobby. +- Fixed campaign servers never being filtered out from the server browser when filtering based on game mode. +- Fixed clients not displaying the "could not connect" popup if the initial connection to a server times out. +- Fixed door weld state occasionally getting desynced, causing the door to be welded server-side but possible to open client-side. + +Electricity fixes: +- Fixed junction boxes not passing signals to relays. +- Fixed broken junction boxes and relays carrying power. +- Fixed devices not receiving power if they're connected directly to batteries/supercapacitors with no relays or junction boxes in between. +- Fixed light components that receive power from somewhere else than a power input connection not going out when they lose power (e.g. lights on the diving suits). +- Fixed pumps and batteries operating/recharging faster when receiving overvoltage, with no upper limit, making it possible to for example operate pumps at 10x the speed by connecting them to a relay that's receiving 10x more power than is being drawn from it. +- Fixed LightComponents being toggled twice when they receive a signal to the toggle connection. + +Misc fixes: +- Fixed "last used" listbox overlapping with the entity visibility tickboxes in the submarine editor on low resolutions. +- Fixed misaligned colliders on the "Shell A Cap 0 deg A/B" wall pieces. +- Fixed links disappearing between linked subs and docking ports when loading in the sub editor. +- Fixed loading freezing for up to 10 seconds if the game cannot fetch the remote content for the main menu (update notifications, changelogs, etc). +- Fixed lights on devices (junction boxes, nav terminals, reactor) being rendered on top of characters. +- Fixed lights lagging a little behind moving objects (e.g. diving suit light). +- Fixed characters being able to grab/heal others when handcuffed. +- Character editor: don't switch to the limb mode when clicking a limb in the joint edit mode. Fixes difficulties in using the joint angle widgets when the widgets are interloping limb source rects. +- Character editor: Fixed the texture path field not being copied if the source character has no texture path defined. In this case, we can use a texture path found in one of the limbs. +- Fixed bots incorrectly reporting problems in the room they are in instead of the room the issues is spotted at. +- Fixed bots reporting broken devices or asking medical attendance even if they are taking care of those things. +- Fixed bots saying "put out a fire in hull" instead of using the name of the room when they extinguish a fire. +- Fixed AITargets staying active even if the entity is not active (for example, the sonar could still be heard by monsters after it's turned off). +- The bots now only report about issues that have not been already been reported. +- Fixed monsters attacking doors that are open. +- Monsters keep pursuing the target if the behavior is "pursue" even when they cannot attack. +- Bots stop operating devices if a player starts operating them (unless they have been ordered to operate the device). +- Fixed bots playing the rewiring sound when repairing an item with a screwdriver. +- Fixed bots sometimes stopping behind a closed door when trying to extinguish a fire. +- Fixed chat messages occasionally extending below the lower bound of the chatbox. +- Fixed searchlight and turret lights disappearing before the light is fully off-screen. +- Waypoint fixes in Kastrull and the drone. +- Fixed Kastrull flooding when the drone is undocked. +- Fixed ballast pumps in Kastrull's drone being off by default. +- Fixed enormous in-game ballistic helmet sprite. +- Fire extinguishers can't be placed inside toolboxes anymore. +- Fixed lobby screen not scaling correctly after changing to a bigger resolution. + +--------------------------------------------------------------------------------------------------------- +v0.9.5.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing when attempting to start a tutorial. +- Fixed Kastrull's drone not being docked to the sub by default. +- Fixed items occasionally launching through walls/floors when they're spawned or dropped. +- Nerfed Hammerhead Spawns. +- Fixed occasional disconnections when the Hammerhead Matriarch releases her spawns. +- Fixed Hammerhead Matriarch exploding twice when it attacks. +- Fixed bots sometimes getting stuck in an objective loop, causing them to repeatedly drop and pick up diving suits or spam doors. +- Fixed bots being allowed to go outside without a diving suit. +- Fixed characters with a rectangular main collider being unable to use path finding. +- Fixed microphone volume scrollbar resetting to the maximum value when opening the settings menu. +- Fixed a bug that caused occasional crashes on Linux when pinging servers in the server list menu. + +--------------------------------------------------------------------------------------------------------- +v0.9.5.0 +--------------------------------------------------------------------------------------------------------- + +Misc additions and changes: +- A new submarine, Kastrull. +- 6 new traitor missions with much more varied objectives. +- More variants of all job outfits. +- 30 new character face sprites. +- Overhauled job assignment logic to make the job distribution a little more balanced. Now each client gets assigned one of the spawnpoints (and its associated job) according to their job preference, which means that if the sub for example has 2x as many engineer spawnpoints than medic spawnpoints, there tend to be 2x more engineers. When playing with a mod that adds new jobs to the game, spawnpoints that have no job associated with them are considered spawnpoints for the non-vanilla jobs. + - We would like to get feedback from players about this: does the job assignment seem fair, are people generally getting the jobs they want? +- New logic components: sin, cos, tan, asin, acos, atan, modulo, round, ceil, floor and factorial. +- Improved autopilot: much faster and less likely to get stuck. + - We would like to get feedback from players about this: Is there still incentive to steer manually? +- AI characters don't set stationary batteries to recharge unless ordered to do so. +- Items can be made damageable by projectiles, melee weapons and explosions by adding DamagedByProjectiles="true", DamagedByMeleeWeapons="true" or DamagedByExplosions="true" to the config. +- Nerfed welding fuel + diving mask combo. The tank depletes much faster and one tank is only enough to make the target fall unconscious, not to kill them. +- Added deconstruction recipes to all drugs. +- Added huskified face sprites to all characters. +- Question prompts in the debug console and dedicated server console (such as "enter the reason to ban XXX") can be cancelled by pressing Ctrl+D or Ctrl+Z (or Ctrl+C in the in-game debug console). +- Welding tools and plasma cutters explode when loaded with the wrong fuel. +- Removed sodium as a product of recycling fire extinguishers. +- Added some loose vents and panels to Orca and Typhon. +- Option to set a name for a character added by a mod without having to configure it in a separate text file. Use displayname="somemonster" in the character element to set the name. +- Balanced splash screen audio volumes. +- Alarm buzzers twitch when active to make it more clear where the sound is coming from. +- Scrollbars that work as on/off switches (e.g. power switches and autotemp sliders in item interfaces) can be toggled by clicking on them. +- Decreased the chance of selecting a traitor mission that's already been selected during the session. + +Multiplayer: +- Option to choose a "play style" for the servers to tell the players what kind of gameplay and rules they can expect on the server. +- Improved server browser: + - More filtering options + - Same version + - Show whitelisted + - Karma enabled + - Traitors enabled + - Friendly fire off + - Voice chat enabled + - Modded + - Option to filter by play style. + - Option to filter by game mode. + - Added the option to favorite servers. + - Added a list of recent servers. + - Added a friends list, you can keep track on which servers your friends are playing at as well as join them directly from the friends list. + - Miscellaneous layout improvements. +- Improved server lobby: + - Improved character customization interface: players now have full control over their appearance. + - Improved job preferences interface: players can now more easily switch around their class preferences, as well as pick which variation of an outfit they would like to wear. + - Mission selection is more flexible: mission types can be toggled separately. + - The campaign interface is displayed directly in the menu, not in a separate view. + - The submarine preview is displayed directly in the menu without having to open a separate window. + - The job preferences of other players are indicated in the player list. + - Voice chat icon now indicates the loudness of the audio being transmitted/received. + - Voice chat settings are indicated in the bottom-right corner of the chat box. + - The server log is integrated into the chat box. + - Added new server settings under anti-griefing tab which previously were only accessible through serversettings.xml. + - Allow friendly fire. + - Allow rewiring. + - Allow disguises. + - Miscellaneous layout changes. + +Human AI: +- Changed the logic for automatically unequipping the diving gear, extinguishers or items that are held in hands. +- Taught the bots to place diving suits, fuel rods and fire extinguishers into right places, if they can't unequip the items without dropping them AND if the current objective is not high priority. The system uses tags/identifiers and two new attributes: "preferredcontainers" in Items and "containablerestrictions" in ItemComponents so it can be adjusted both in the editor and in xml. +- Improved the code to prevent dead-locks between the AI states. +- Start looking new oxygen when the current oxygen tank is at 10% instead of starting when it's empty (which often lead the bot to suffocate while doing the objective). +- Combat: Don't ignore empty weapons when evaluating weapons for the first time (allows to try reloading a weapon before ignoring it as useless). +- Fight Intruders: Automatically switch weapon when the current weapon runs out of ammo. Find ammunition for the current weapon if no other decent weapon is found. Don't allow to go offensive while armed with poor weapons, like a wrench. +- Fix Leaks: Improved the operating of welding tools. +- Rescue: Major refactoring. Allow to heal self. Improve the priority calculation. The priority is now based on the severity of wounds. +- Taught the bots to look deeper into the inventories (recursive) when seeking items. +- Changed the decision making on whether or not a bot needs diving gear. +- The bots now avoid unsafe paths in the idle state or when doing low priority objectives. +- The bots don't follow targets outside of the submarine. +- The bots don't stay still when idling underwater.They swim in place instead. +- Adjusted the combat priorities for the weapons. +- Increased the minimum initiatives. +- Adjusted the target evaluation for the Fix Leaks objective. +- Improved the distance approximations for all AI objectives. +- Increased the base devotion (how much the current objective priority is boosted). +- Reduced the shooting distance when the bots are operating turrets. +- Adjusted the idle waiting, standing, and walking times. +- Fixed bots getting stuck if the next node was behind a door. +- Fixed bots getting stuck on ladders when the main collider bottom was slightly lower than the floor level, even though the bot should be able to take off from the ladders. +- Fixed bots getting stuck on ladders when they need a new target while climbing. +- Fixed bots ignoring/avoiding targets in hulls when there were dead enemies inside them. +- Fixed issues in switching empty oxygen tanks to new. +- Fixed bots unequipping and re-equipping diving gear while ordered to follow another character. +- Fixed bots not being able to handle things when they cannot find diving gear. Now they should first try to get the gear and if it fails, they should just target a safe hull. +- Fixed bots shooting friendly characters with turrets. +- Fixed bots always treating weapons as revolvers. +- Fixed the loading of smg magazines/fuel tanks etc (because they are different from revolver rounds). +- Fixed autonomic objectives overriding the user-defined settings (steering, batteries). +- Fixed bots being able to do things while hand-cuffed. +- Fixed a dead-end when an item is taken by another character after the target item was defined and before the objective is completed. +- Fixed item prioritization calculations. +- Fixed hull safety calculations always using the current visible hulls (which should only be taken into account when the hull is the current hull). +- Fixed bots abandoning the operate item objective if there was another character operating the item. +- Fixed bots speaking about success/failure to repair when another character fixes their target. +- Fixed bots reporting individual failures when doing a loop objective. Should fix bots spamming with the "Cannot reach the target" msgs. +- Fixed the current objective not being reassigned after sorting the objectives, leading to sorting the subobjectives of the old current objective, which would be fixed only after the next time the objectives were sorted (after 1 sec). +- Fixed the gap size being misinterpreted when calculating the priority for a fix leak objective. +- Fixed bots switching repair targets while repairing an item. +- Fixed bots in some situations facing the wrong direction. The bots should now always face the item they are operating. +- Fixed bots' ragdolls getting unstable due to constant flipping in some rare cases. +- Fixed bots not immediately targeting the other rooms when they reach the airlock (when entering the submarine). + +Monsters: +- New monster: Hammerhead Matriarch +- New monster: Hammerhead Spawn +- New diving suit sprite for husks. +- Characters now have a separate property that defines whether or not they can walk, meaning that characters can now enter the submarine even if they cannot walk. When there is no water, the character will fidget around. +Also fixes Fractal Guardians flying in non-flooded alien ruins. +- Monsters now remember the position of the last target even when idling. The memories fade, however. +- Monsters now flee briefly when being fired at with the turrets. Fixes swarming characters being easy to exploit. +- Don't allow the monsters to retaliate unless they are in the same submarine as the attacker. Removed the CanRetaliate parameter on character AI that was added in the previous update. +- Refactored ConditionalSprite: ConditionalSprite now takes Sprite or DeformableSprite as child elements. +- StatusEffects can now be used to spawn characters. +- Monster missions now support multiple monsters of different species. +- Minor adjustments on eating. Fixes Bonethresher's eating animation. +- Improved the avoid steering logic (used when the character is not using pathfiding, i.e. outside the submarine). +- Charybdis: Increase the damage against structures for all attacks. +- Adjusted Mudraptor, Bonethresher and Tigerthersher behavior. Threshers now hunt in packs. +- Fixed incorrect flipping and mirroring. Disable mirroring on characters that don't need it. +- Fixed Mudraptors preferring doors over humans. +- Fixed targeting at wall center position instead of the section position. Fixes hammerheads and bonethreshers targeting destroyed wall sections. +- Fixed the damage modifiers on hammerheads not working properly. +- Fixed a crash when trying to create a swarm with characters that have no swarming behavior defined. +- Fixed monsters not targeting the closest limb when they should. +- Fixed ai targets not being updated when the character is dead, causing the characters to be too perceivable/not perceivable enough by the monsters. +- Fixed limbs' lightsources not being visible inside the submarine. +- Fixed immobilized characters (e.g. stunned, monsters on dry land) occasionally "hanging" mid-air. +- Fixed draw order issues due to normal sprites and deformable sprites being used on the same characters. + +Character editor: +- Added "TailTorqueBoost" parameter that can be used to prevent long and fast-moving characters, like the Tigerthresher, to get tangled around themselves. +- "TailTorque" no longer affects the swimming sine amplitude (how strong the tail moves). +- Sprite orientation no longer affects the damage modifiers. +- Exposed the ragdoll main limb. +- Exposed the damage emitters. +- Exposed the damage sound of damage modifiers. +- The radial widget angles are now rounded to the closest 10. +- Fixed characters being able to collide with the submarine, which often caused large monsters to get stunned and impact sounds to be played when they're spawned. +- Fixed characters moving when they shouldn't. + +Bugfixes: +- Rewrote power distribution logic to resolve several issues and oddities in the way power was distributed across electrical grids, particularly when relays were used. The new system is also less performance intensive, so submarines that had performance issues due to large and complex power grids should now run better. +- Fixed inability for mods to override jobs. +- Fixed pumps calculating targetlevel incorrectly when receiving a "set_targetlevel" signal, causing neutral ballast level value in the sub editor to be off. +- Fixed clients being able to join servers when they're using content packages the server doesn't have, which usually causes the client to get disconnected when a round starts. +- Fixed clients being able to join servers after enabling a required content package in the settings, even though they need to restart first (leading to errors when a round starts). +- Fixed "attempted to access a potentially removed character" console errors if a character dies while the client is waiting to apply the character's remote inventory state. +- Fixed broken waypoints in Typhon that prevented bots from opening some of the doors. +- Fixed characters being very hard or impossible to hit with melee weapons when they're lying on the floor. +- Fixed characters placing their feet above a platform when not actually standing on the platform (noticeable in rooms where there's a platform on top of the "actual" floor). +- Fixed husk eggs not causing a husk infection when injected. +- Fixed depth sorting not working on damageable structures. +- Fixed characters stepping on nothing if their feet are below the lowest step of a ladder. +- Fixed door components being selectable when the door is broken, causing characters to drop from ladders if they interact with a door while climbing. +- Alien motion sensors don't react to dead bodies to prevent bodies from blocking the way through the ruins by constantly activating coils. +- Fixes to waypoints and outdated structure sourcerects in Bunyip, Selkie & Venture. +- Put the shotgun shells in Dugong's, Kastrull's and Humpback's armory inside the shotgun. +- Fixed clients retaining their original character when taking control of another one in the multiplayer campaign, but keeping the items of the new character. +- Fixed sourcerects being moved when going through the sprite lists with arrow keys in the sprite editor. +- Fixed servers occasionally appearing in the server list twice. +- Improved color input layout in EntityEditors to prevent overlaps. +- Fixed flares not depleting when in inventory. +- Fixed propeller position becoming unmirrored when saving and reloading a mirrored engine. +- Fixed detection area offset becoming unmirrored when saving and reloading a mirrored motion sensor. +- Fixed a couple of doors and hatches in vanilla subs being repairable with welding tools instead of wrenches. +- Fixed ruins occasionally having rooms too narrow to pass through. +- Fixed door gaps occasionally getting misplaced when placing them in ruins, preventing water from flowing through the room. +- Fixed "picked/selected required" fields disappearing from the item editing panel in the submarine editor if left blank. +- Fixed being able to hit through walls with melee weapons. +- Fixed framerate issues when using passive sonar near large amounts of sound emitters (right outside a submarine for example). +- Fixed empty exploding ammo boxes exploding when deconstructed. +- Fixed old chat messages overlapping in the server lobby after the scrollbar of the chatbox becomes active. +- Fixed textbox selection not being cleared when pressing Ctrl+Z or Ctrl+R, causing a crash if the selection is outside the bounds of the current text and the player attempts to remove text from the box. +- Don't allow reporting things while inside ruins. +- Fixed crashing if a client has written something in the chatbox, gets disconnected and sends the message. +- Fixed servers showing up in the server lobby after the server has been shut down. +- Fixed traitor missions not ending when the traitor dies and the traitor retaining their old mission info in the info menu. +- Fixed dead characters still appearing in the crew list when a client joins mid-round. +- Fixes to decorative sprites: Rotation property is in degrees, fixed offset anim type being used as the rotation anim. + +--------------------------------------------------------------------------------------------------------- +v0.9.4.0 +--------------------------------------------------------------------------------------------------------- + +Monster additions and changes: +- New character: Bonethresher. +- New character: Golden Hammerhead. +- Completely remade the Tigerthresher (new skin, ragdoll, behavior and attacks). +- Reworked Hammerhead (new ragdoll, adjusted behavior and attacks). +- Adjusted the behavior of most characters. +- Medium sized monsters can now more easily trigger impact effects when ramming the submarine. +- Characters are now allowed to move faster than previously (9 -> 15). +- Changed the mouth position calculations and redefined the values for all monsters that have the eating behavior. +- Removed Moloch Baby (Which was just a test. Molochs will be revisited later). +- Better bend deformations on limbs. +- Better feedback about hit impacts on limbs when the character takes damage. +- AI monsters should hit moving targets more easily. +- Added configurable health regeneration, which is applied when the character is eating a corpse. +- Added configurable affliction reductions (bleeding, burn, damage). +- Added an option for the monsters to ignore retaliation when they are attacked. +- Added an option to target the attack on specific limb types. +- Added an option to continue the movement, "following through" the target after the attack. + +Modding improvements: +- Mods can override specific content without having to create a completely new content package. This can +be done by surrounding the element with "" (for example, an Item or a Character +config element you want to replace a vanilla Item/Character with). The overrides work based on identifiers; +for instance, if you configure an item with the identifier "wrench" and surround it with the override +tags, it will replace the vanilla wrench. +- Content package load order: the game will first load the core package, then other content in the order + of selection (proper ui still pending). The load order is saved in the config_player.xml. +- Made AI orders and event manager settings moddable. +- The engine and reactor sound ranges can now be modified in the item XML. +- The husk affliction can now be modified and applied on any character. +- Support for multiple simultaneous husk afflictions based on the same system. +- Support for multiple husk appendages. Made the attachment limb configurable in the affliction definition. +- Additional content package validity checks during startup: make sure all XML files in the package can +be loaded, and disable the package if they can't. Fixes tons of console errors on startup when a mod with +invalid XML files is enabled. +- Don't allow publishing workshop items that contain invalid XML files. +- Don't allow selecting invalid content packages in the settings menu. +- Fixed disabled content packages becoming active when they're autoupdated. + +Character editor improvements: +- Improved layout, hotkeys, general UI/UX improvements. +- Support for editing the character configuration files including health, ai, inventory, sounds, particles etc. +- Support for limb sounds. +- Support for light sources attached to limbs. +- Support for adding and removing attacks. +- Support for afflictions in attacks. +- Support for damage modifiers in limbs. +- New functionality: creating limbs (without having to operate on duplicates). +- Support for creating humanoids. +- Allow to create new characters based on an existing character (copy character). +- Added a limb specific "sprite orientation" that overrides the universal "spritesheet orientation". +- Option for mirroring limb sprites. +- Option for hiding the limb sprite (invisible limbs). +- Multiple minor additions and changes, like an option to enable lights or to display the damage modifiers +drawn on the character. +- Exposed structure sound types. +- Exposed the mouth position. +- Exposed the angular damping and density for limbs (removed mass, which was not used). +- Added a default texture path for ragdolls so that the texture can only be defined once. Limb specific +texture definitions override this. +- Allow to define a group for different species. The characters in the same group are friendly to each other. +- DecorativeSprites can now be used on character limbs (like on items). +- Made it easier to adjust the source rect's position with the arrows. Hold CTRL to change the size. +- Fixed a rare case where characters got stunned in the character editor. + +Misc improvements: +- New husk faces. +- Increased default VOIP and microphone volume and the maximum values. +- Force a restart when switching the language. +- More detailed "x is not a valid XML file" error messages. +- Improved mission and traitor info popups. +- Show the number of lights (total and shadow-casting) in the sub editor. +- When rewiring, clicking the right mouse button only removes one node from the wire. +- Wire nodes are added by left clicking in the sub editor, and can be laid out horizontally/vertically +by holding shift. +- Improved logging for DXGI_ERROR crashes on startup. +- Made level ambient lighting darker. +- Added "pause" console command (only usable in single player). + +Bugfixes: +- Fixed crashing when the recharge speed of a PowerContainer with no interface (e.g. Alien Generator) is +adjusted by a signal or a bot. +- Fixed docking interface becoming active on navigation terminals when any of the submarine's docking +ports are close to another docking port, even if the terminal in question is not wired to that port. +- Fixed an occasional crash when a bot starts retreating away from an enemy immediately after spawning. +- Fixed clients not creating a download prompt when a sub they don't have is selected by vote. +- Fixed traitor missions almost always placing the mission-related items inside the same containers. +- Fixed traitor goal durations being displayed as "duration(xx) seconds" instead of "xx seconds". +- Fixed Traitor's "find an item" objectives not being considered complete if the target item is inside +another item within the traitor's inventory. +- Fixed server using the provided campaign savefile name as-is (without the required .save file extension) +when starting a new campaign through the console. Caused clients to throw "File transfer failed (wrong +file extension """!)" errors and prevented them from receiving the save files. +- Fixed servers being able to start the round multiple times by spamming the "start" console command +before loading the round finishes. +- Fixed rewiring sound playing whenever a remote player is using a rewireable device. +- Fixed subinventories not opening when grabbing another character with no items in the corresponding slot. +- Fixed draggable inventories getting stuck to a half-open state if the item is equipped when +the inventory is opening/closing. +- Fixed light sprites being mirrored when the item is mirrored, even if the mirroring the item's sprite +had been disabled (e.g. junction boxes). +- Fixed motion sensor detection area not being flipped when the item is mirrored. +- Fixed status monitor not mirroring rooms on the display in mirrored subs. +- Fixed engine propeller position not being flipped when the item is mirrored. +- Fixed diving suits being displayed in an incorrect position when the locker has been flipped on either axis. +- AI characters turn autotemp back on when leaving the reactor. +- Fixed item sprites becoming unmirrored when a damaged sprite is fading in. +- Fixed damaged item sprites that are set to fade in according to the damage always being drawn at full opacity. +- Fixed spectators being distributed into teams in combat missions, potentially leading to imbalanced crew sizes. +- Notify the client using the "togglekarmatestmode" command about the test mode being enabled/disabled. +- Send karma change notifications when karma has changed by 1 unit or more when test mode is enabled, not +just when an action causes an immediate change of 1 unit or more. +- Fixed adjacent sprites bleeding into the platform and topwindow sprites. +- Fixed autocompleting submarine/shuttle names when using the submarine/shuttle console commands. +- Fixed some items (like sonar beacon) attracting monsters even when they're powered off. +- Fixed inability to open the pause menu if an inventory slot had been highlighted when exiting +the game screen. +- Fixed welded door sprites "twitching" when the submarine moves. +- Fixed crashing when a character with no hands or arms drops a holdable item. +- Non-humanoids (i.e. monsters controlled by a player) cannot be assigned as traitors. +- Traitor missions are considered unsuccessful if the objectives cannot be completed (for example if the +submarine doesn't have suitable containers to place the traitor items inside). +- Fixed the "Barotrauma" title text staying invisible in the main menu when coming back from the credits. +- Fixed clients not refreshing an item's editing hud when a remote player adjusts the values (i.e. if two +players had selected the same lamp and one changed the color value, the other client wouldn't see +the value change in the editing hud). +- Fixed a couple of the additive light sprites being slightly offset from the lamp. +- Clients don't display client-side vitality changes in healthbars until the actual vitality is received +from the server. Fixes health occasionally dropping and then jumping back up if the client predicts damage +incorrectly (e.g. if a melee attack hits client-side but doesn't server-side). +- Fixed character syncing being very inaccurate when switching to freecam and spectating a character +far away from other players. +- Fixed oxygen/fuel tanks attached to a tool being rendered behind the character's legs. + +--------------------------------------------------------------------------------------------------------- +v0.9.3.3 +--------------------------------------------------------------------------------------------------------- + +- Fixed an error when trying to start a multiplayer campaign with voting enabled +- Fixed a character inventory desyncing error in multiplayer that caused random disconnections +- Fixed download prompts for submarines not showing up + +--------------------------------------------------------------------------------------------------------- +v0.9.3.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed a networking error that prevented clients from selecting the correct submarine in multiplayer if +the settings menu had been toggled open, which caused the client to start the round with an incorrect +submarine and get kicked out from the server due to entity ID mismatch errors. +- Added Japanese translation. +- Added Polish, Spanish and Turkish NPC conversations. +- Improvements to Russian and Spanish translations. + +--------------------------------------------------------------------------------------------------------- +v0.9.3.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed clients waiting an excessive amount of time before resending network messages the server has not +acknowledged receiving. Caused clients to occasionally enter a state where they can't interact with devices +or pick up items. +- Fixed fonts getting messed up when playing in Simplified Chinese. + +--------------------------------------------------------------------------------------------------------- +v0.9.3.0 +--------------------------------------------------------------------------------------------------------- + +Traitor improvements: +- Players who haven't been a traitor yet are more likely to get selected as a traitor. +- If both teams have a traitor during a combat mission, traitor win will result in the opposite team's victory. +- Fixed the order of the traitor objective chat messages. +- Fixed flooding the respawn shuttle counting as flooding a part of the submarine when doing the "flood +the submarine" traitor task. + +Multiplayer fixes: +- Fixed server not sending a condition update for an item that gets removed when its condition drops to zero. +Caused potassium and magnesium to explode continuously client-side when immersed in water. +- Fixed server list only displaying servers that are located close to the client. +- Fixed server list displaying the selected game mode incorrectly. +- Fixed Chinese server names and descriptions showing up as "?????" in the server list when not playing in Chinese. +- Fixed occasional "error while reading a message from the server" console errors when joining a server. +- Fixed clients occasionally timing out and disconnecting during the loading screens. +- Fixed character name box resetting in the server lobby when another client joins or disconnects. +- Fixed "collection was modified" error when a client who's been given control of a bot tries to use +the report buttons. +- Fixed server hanging when a client joins if the server has a very large number of submarines installed. +- Fixed a bunch of client-side console commands crashing the game if the client disconnects while a question +prompt is active and then enters something in the console. +- Fixed full SteamP2P servers not showing up on the server list regardless of the filters. +- Fixed "remove ban" and "range ban" buttons in the server settings menu doing nothing. +- Fixed switches occasionally getting desynced between clients. +- Added a tickbox for selecting/deselecting all permissions to the client management panel. +- Fixed clients with campaign management permissions not seeing the permissions of newly joined clients. +- Fixed statuseffects with a duration not having an effect on karma. +- Causing an "oxygen low" affliction decreases karma (for example when injecting large amounts of fentanyl). +- Fixed scroll values resetting in the multiplayer campaign store menu when purchasing/selling items. + +Miscellaneous improvements: +- Attempting to drop an item to an empty inventory slot that's not of the right type (e.g. trying to put +an extinguisher in the normal inventory slots), automatically moves the item to the correct slot if it's free. +- Made irrelevant items (light components, lamps, small automated pumps, etc) non-interactable in the tutorials. +- The first patient cannot be healed in the doctor tutorial until the "take the patient to the medbay" +objective has been completed. +- The docking interface does not become active in the captain tutorial when leaving the first outpost. +- Added sounds for rewiring and repairing. + +Miscellaneous fixes: +- Fixed skills not having any effect on repair durations. +- Fixed inability to enable content packages created for a version prior to 0.9.2.0 (ones that have the +content package in the Data/ContentPackages folder instead of in the mod folder). +- Use a welding tool icon to indicate damaged walls in the mechanic tutorial, because the generic repair +icon caused some players to think the wall needs to be repaired with a wrench. +- Minor changes to the instruction texts in the mechanic tutorial. +- Reduced repair durations in the engineer/mechanic tutorials. +- Fixed draggable subinventories staying visible when stunned. +- Fixed light sprites not being scaled in the sub editor when resizing lamps. +- Fixed contained items not changing their position when flipping the container (e.g. oxygen generator +with some tanks inside). +- Fixed projectiles emitting sparks when they hit a character (not just when they hit a structure). +- Fixed sonar's zoom slider not moving when autodocking zooms in. +- Fixed small creatures being unable to reach waypoints. +- Fixed bots getting stuck while trying to repair items (in practice hatches) while holding ladders. +- Hid SMG rounds and coilgun bolts from the sub editor because they're not usable by themselves, but are +spawned automatically when the SMG/coilgun is fired. +- Hid the junction box tutorial variant from the sub editor. +- Stun guns and darts can be fabricated and purchased. +- More reliable melee weapon hit detection (for example in the security tutorial it was previously very +difficult to hit the crawler after it falls to the ground). +- Enemies steer back towards the level if they end up outside the boundaries. +- Added confirmation popups when exiting the sub editor or character editor to prevent losing unsaved work. +- Fixed reactor warning lights being clickable and becoming invisible when pressed. +- Fixed CPR button becoming invisible when pressed. +- Fixed water occasionally flowing only through one gap in a hull, for example water only draining +through a hole at a one side of a room even if there is another hole at the other side of the room. +- Fixed scrollbars not resizing when filtering lists (e.g. the submarine list in the "new game" menu). +- Fixed being able to fire flamers (and other repair tools) through walls and doors. +- Fixed flamers working underwater when the water is shallow enough for the character to stand. +- Fixed battery recharge rate slider not moving when the recharge rate is set by an incoming signal +or a remote player. +- Fixed some connection panels being rewireable in vanilla subs when a wire is equipped. +- Fixed some pre-placed body armors and grenades in vanilla subs having an incorrect scale. +- Fixed crashing when a character gains a skill level on a skill that's not initially configured +for the character class. +- Fixed "Add File" dialog of the Workshop publish screen always using the mod's root folder as the file +path even if the file is in a subfolder. +- Fixed contentpackage version number not being updated when updating an older workshop item. +- Fixed subinventories closing when items are dropped into or removed from them, which made reloading +weapons or putting several items into a container cumbersome. + +--------------------------------------------------------------------------------------------------------- +v0.9.2.2 +--------------------------------------------------------------------------------------------------------- + +Karma improvements: +- Attacking someone who has just recently attacked you doesn't reduce karma. +- The karma penalty from attacking someone scales according to their karma (i.e. smaller penalty for +attacking a griefer whose karma is low). +- Damaging characters by performing CPR doesn't decrease karma. +- Fixed karma decreasing when moving a wire from a connection to another. +- Reviving characters with CPR increases karma. +- Made the default karma settings a little less strict. +- Fixed clients always getting kicked (never banned) if the "kicks before ban" karma setting is set above 0. +- Players aren't notified about their karma decreasing when it decreases "naturally" towards the neutral +value of 50. + +Bugfixes: +- Fixed mechanic tutorial crashing after the welding task when playing in Russian. +- Less restrictive client name symbol constraints. Fixes clients failing to join servers if their name +contains Chinese symbols for example. +- Fixed inability to enable/update content packages created for a version prior to 0.9.2.0 (ones that have +the content package in the Data/ContentPackages folder instead of in the mod folder). + +--------------------------------------------------------------------------------------------------------- +v0.9.2.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing if a traitor client switches to a non-human creature and their original character dies. +- Traitors don't lose karma by damaging structures if their goal is to flood the sub. +- Traitors cannot be assigned to kill themselves. +- Fixed round summary and traitorlist command displaying incorrect traitor mission info. +- Fixed inability to end the round if there's an active traitor mission but no traitors assigned. +- Disabled traitors in campaign mode. +- Fixed server crashing when attempting to greet a traitor with no objective. +- Fixed dead characters being occasionally selected as traitors. +- Fixed info menu still displaying the old traitor objective after a traitor dies and respawns. +- Allow traitors to re-use the sabotage button when someone starts to repair the device without having +to re-open the interface. +- Fixed grenades exploding multiple times when triggered using a detonator. +- Scaled down alien materials (oxygenite, sulphurite, fulgurium, etc) and fixed their collider sizes. +- Karma doesn't spontaneously decay/increase when dead. +- Increased karma penalties for poisoning someone. +- Option to kick clients with low karma from the server and ban them if they get kicked more than x times. +- Space herpes randomly toggles inverted controls on/off to make it more difficult to bypass the effect +by modifying keybinds. +- Fixed workshop item preview image not being refreshed in the publish tab when adding a preview image +to an item that doesn't have one. +- Fixed "error loading submarine" console error when creating a copy of a submarine, deleting the original +sub and then saving the copy. +- Fixed server logging an "attempted to send a chat message to a null client" error when a client tries +to send a private message to a non-existent client. +- Enable dynamic range compression and VOIP attenuation by default. +- Fixed inability to extinguish fires through holes in walls. +- Fixed some texts not fitting on the submarine's wall labels in Spanish and Polish. +- Fixed "Broken English" character trait not being translated. +- Fixed missing "undock" text in the navigation terminal interface. +- Fixed some of the items in Berilia and Bunyip being impossible to pick up. +- Fixed crashing when less than 3 arguments are passed to the "color" console command. +- Fixed crashing when attempting to rewire two linked devices at the same time. + +--------------------------------------------------------------------------------------------------------- +v0.9.2.0 +--------------------------------------------------------------------------------------------------------- + +Easier server hosting: +- Switched to Steam's networking API, which allows clients to connect to servers without the need for the +host to forward their ports. + +Expanded traitor feature: +- Multi-step traitor missions that not only make things more interesting to the traitors themselves but +also to give the rest of the crew a fighting chance of detecting the traitor. + +Anti-griefing: +- Karma: a system that detects malicious actions and automatically creates a more challenging experience +for griefers, or potentially triggers a kickban. The feature is completely optional and the server hosts +can decide how aggressively it will react to malicious actions. In a nutshell, you can lose karma for doing +dumb things, karma is regained gradually over time and may be increased more rapidly by doing good things, +thus negating false positives and also giving you the chance to redeem yourself. Lose too much karma and +you'll start to experience increasing levels of inconvenience. +- Wire griefing is more difficult: wires have to be disconnected from the connection panels at both ends +before they can be removed. Disconnected wires can be seen visibly hanging from the device, with noticeable +particle effects and sound cues that make it easier to detect and fix wiring problems. +- Added a built-in overheat warning light and siren to reactors and increased the time it takes for the +reactor to catch fire and explode. +- Option to disable friendly fire altogether. + +New items and structures: +- Additional weapons: stun gun, SMG, shotgun, grenade launcher, flamer, two new types of coilgun ammunition (piercing & explosive). +- New monster loot: husk stinger, mudraptor shell, crawler mask, moloch shell. +- Fun stuff: accordion, captain's pipe, toy hammer. +- Tons of new decorative submarine pieces for the sub editor. + +New submarine: +- Berilia, a submarine for 16 players. + +Bugfixes: +- Fixed crashing when selecting doors or gaps in the sub editor. +- Fixed crashing when combining items inside an ItemContainer (e.g. cabinet, deconstructor). +- Fixed shuttles not being able to redock into some submarines with unconventionally positioned docking +ports. Specifically, if a port needed to be docked to from below but was positioned above the center of +the submarine (or vice versa), the docking interface would not activate on the navigation terminal. +- Fixed docking port using the wrong submarine's position for joint adjustment, causing errors when +docking a submarine with greater mass to one with a smaller mass. +- Fixed an issue that caused occasional ID mismatch errors if a client died during a multiplayer +campaign round and disconnected before the round ended. +- Fixed item editing panel not appearing in wiring mode when selecting a wire in the sub editor. +- Fixed ability to throw throwable items while unconscious. +- Fixed bots not using fire extinguishers client-side in multiplayer. +- Fixed clients not hearing the sound when someone crowbars a door open. +- Fixed progress bars not showing client-side when cutting/welding doors. +- Fixed inability to combine items in multiplayer. +- Fixed occasional "index out of range" errors when loading walls that have been set to a non-default +scale in the submarine editor. +- Fixed inability to scroll the crew list with the mouse wheel when the cursor is over certain parts +of the list. +- Fixed sonar pings stopping mid-way when active sonar is turned off, which could be exploited to stop +the pings before they reach a monster further away from the sub. +- Fixed clients not seeing other characters when entering spectator mode after their character has been +eaten by a creature. +- Fixed clients not seeing other characters in spectator mode after the distance between the submarine +and the client's corpse gets great enough. +- Fixed clients getting stuck to a non-functional game screen if they start a new round before the ending +cinematic has finished server-side. +- Fixed projectiles hitting a character you're standing next to when firing. +- Fixed characters automatically equipping handcuffs (i.e. handcuffing themselves) if they were picked up +when the only free inventory space was the hand slots. +- Fixed a rare race condition that occasionally caused the game to crash during the loading screen with +a "no text packs available in English!" error message. +- Fixed husk infection being healable with broad-spectrum antibiotics even when the infection has reached +the final stage. +- Fixed attachable items (detonators, electrical components) becoming deattachable without any tools +if the sub is saved after deattaching them. +- Fixed projectile raycasts not taking wall rotation into account, causing the projectiles to hit sloped +walls when standing next to them. +- Fixed PowerTransfer components checking overloads based on the item the recursive power check starts from, +not the item that's currently being checked. Caused junction boxes to never break or catch fire in some subs +- Fixed crashing in the character editor when no textures were found for the selected character. +- Fixed crashing if a humanoid character has no knees or ankles. +- Fixed EventManager calculating flooding amount incorrectly, causing floods to only have a very small +effect on the intensity value. +- Fixed batteries and supercapacitors being able to provide power through their signal connections +(e.g. "set_charge_rate", "charge_rate_out"). +- Lighting fix: obstruct background lights behind hulls. Previously the background lights would only get +obstructed by background structures, causing light to "bleed through" parts with no structures (e.g. +humpback's docking port) and windows in the background walls. +- Fixed item loading being interrupted if any item XML cannot be loaded, causing some items not to be +loaded if any of the selected content packages are missing files or contain corrupted item XMLs. +- Fixed fire sounds not playing when standing inside a fire source. +- Fixed client names being converted to lower case when comparing them to the name written by the sender, +preventing the message from being sent if the name wasn't written in lower case. +- Pass private messages to the client hosting the server when the message is targeted to the server. +- Private messages appear in the server log. +- Fixed plasma cutter and welding tool hit particles being offset from the flame. +- Fixed steel bar and titanium-aluminium alloy deconstructing to 100% condition items even when degraded +(which could be used as an exploit to get infinite coilgun rounds). +- Fixed holdable items staying in the characters hand(s) when swapping them from a hand slot to another +limb slot (for example, when moving a flashlight from a hand slot to the head slot). +- Fixed text wrapping not working properly with words that are longer than a single line. +- Fixed deconstructor losing some of the material from deconstructed items if the output container couldn't hold all of the new items. +- Fixed discrepancies in door welding & repairing logic regarding collision. +- Fixed a crash when retrieving lobby information with an uninitialized IP. +- Fixed max player count in server list & duplicate lobby entries. +- Fixed arrow keys not changing caret position when typing. +- Fixed doors looking repaired as soon as the condition goes above 0%, even though the collisions aren't +re-enabled until the door gets above 50%. +- Fixed water not leaking through broken doors. +- Fixed inability to throw items through platforms. + +Misc additions and changes: +- Respawn shuttles now spawn inside the level somewhere near the submarine, instead of always spawning +at the beginning of the level. +- Respawn shuttles don't leave and despawn until a new respawn is pending. +- Added "respawnnow" console command which immediately dispatches the respawn shuttle. +- Search for default animation/ragdoll folders from the folder where the character file is located, not +from "Content/Characters". Fixes mods not being able to load animation/ragdoll files if the file paths +are not defined explicitly in the character configuration file. +- Improved performance by deleting dead monsters that are far away from the sub and by disabling physics +on dead bodies when they stay still long enough. +- Added option to use conditionals to activate/deactivate ItemComponents. You can take a look at the +reactor and junction box config files to see how it's used. +- Added some indicator lights to junction boxes and reactors. +- Stun batons don't affect large enemies (molochs, hammerheads, endworms, etc). +- In wiring mode, items are selected by pressing E instead of clicking. Selecting items with the left +mouse button made it very difficult to manipulate the wires because it was easy to accidentally select +some device instead of a wire node. +- Crate/toolbox inventories stay open and can be moved across the screen when the item is equipped. +- Added limits to submarine name and description length. +- Delete incomplete file downloads when disconnecting from a server while a file transfer is active. +Prevents console errors about corrupted submarine/save files caused by the partially downloaded files. +- Increased Humpback's battery capacity. +- Added widgets for manipulating coilgun/railgun rotation limits in the sub editor. +- Added a command for setting the value of a property on all selected entities in the sub editor +(for example, "setentityproperties scale 2" would set the scale of all selected items/structures to 2). +- Show ballast tanks and airlocks in a different color on the status monitor to make it easier to +distinguish which rooms are actually flooding and which are supposed to have water in them. +- Option to define multiple inventory variants for a character (e.g. to add variation to monster loot). +- Start playing the main menu music during the loading screen. +- More reliable human walk sounds (played at specific points of the walk cycle instead of relying on +impacts between the feet and the floor). +- Option to show a 16x16 grid and snap the cursor to it in the sprite editor. +- Reactor can be controlled with movement keys. +- Option to add a probability for afflictions applied by an attack. +- Husk attacks have a 50% chance of causing a husk infection. +- Decreased minimum item scale from 0.1 to 0.01. +- The amount of materials received from deconstructing fuel rods depends on the condition of the fuel rod. +- Reactors keep sending the temperature_out signal after a meltdown. +- Improved file transfer + +--------------------------------------------------------------------------------------------------------- +v0.9.1.0 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Disabled riot shields for now (too much griefing potential). +- Toolboxes can be fabricated and decontructed. +- Nerfed nitroglycerin's structure damage and increased the impact tolerance from 4 to 6. +- Made alien pistols a little less underwhelming (sounds, recoil, particle effects). +- Deconstructors drop all items that are inside the deconstructed item. Previously they would just get destroyed, +making it a potential exploit to destroy items that should not be possible to deconstruct. +- Modified welding fuel tank and oxygen tank sprites a bit to differentiate them from each other a bit more. +- Modified plasma cutter and welding tool sprites a bit to differentiate them from each other a bit more. +- Diving suits play the warning beep when there's no tank in the suit (not just when the tank is running out). +- Server list can be sorted according to ping, name, compatibility or any of the other property in the list. +- Docking ports of the enemy submarine are not shown on the sonar during combat missions. +- Recharge headset batteries between rounds in single player. +- Disable status monitor displays when out of power. +- Reduce server CPU usage. +- Update ladder and gap references if a waypoint is moved around in the editor. +- More descriptive error messages when publishing a Workshop item fails. +- Allow selecting multiple files at once when adding files to a Workshop item. +- Made the autogenerated submarine preview pictures larger. +- The "Host server" menu remembers the previously used port numbers and the player count. +- Restrict server names to a maximum of 60 characters. +- Items now collide with platforms. +- The game automatically opens the generated crash report when it crashes. +- Added "setmaxplayers" command to the dedicated server. +- Clients can change the server password using the command "setpassword" if they have a permission from the host. +- Reduced the range of the sonar ping sound and added a more subtle ping sound that can be heard further away. +- Watchmen now hold position when attacked. +- Added a subtle glow to alien buttons to make them a bit more noticeable. +- Items that are set to be hidden in-game can still be interacted with in the sub editor. +- EXPERIMENTAL: option to disable rewiring items in multiplayer. At the moment the setting can only be +changed by editing a parameter called "allowrewiring" in serversettings.xml. + +Misc bugfixes: +- Fixed the position of an outpost's docking port not being taken into account when determining how to +place it in the level. Caused large submarines sometimes to collide with walls when docked to outposts +where the port is offset from the center. +- Fixed corrupted sub files causing crashes. +- Fixed item editing HUD not appearing on any other item after one item has been selected in-game +(e.g. editing the channel on a wifi component prevented editing other items). +- Fixed ladders and other resizeable items reverting to their original size if they're resized and +the sub is saved and reloaded. +- Fixed inability to resize gaps in the sub editor after they've been placed. +- Reactors take other power sources into account when calculating how much power they need to generate. +Fixes overloads on Humpback when turning on the backup batteries and operating the reactor normally. +- Fixed watchmen not retaliating when a character does very small amounts of damage to them. +- Fixed bots being able to take handcuffs off from themselves. +- Fixed waypoint and spawnpoints being selectable in the sub editor even if they're hidden. +- Fixed deconstructing coilgun ammo boxes giving out more materials than the materials required to fabricate them. +- Scrollbars can only be dragged if the mouse button is pressed down while the cursor is on the scrollbar, +not by holding the button and moving it on the scrollbar. Fixes accidentally switching from slider +to another (often happens in the reactor interface). +- Fixed crashing when setting limb or joint scale to 0 using console commands. +- Fixed dropdowns in the Workshop item publish menu being draw behind the buttons below them. +- Fixes bots being unable to exit ladders if some part of their body is below the platform. +- Ignore keyboard inputs (delete, arrow keys, copy/paste) in the sub editor when a textbox is selected. +Prevents accidentally deleting items/structures when attempting to delete text from a textbox. +- Toolboxes can't be put inside other toolboxes or in the doctor's clothes. +- Fixed items bought from the store during a singleplayer campaign session being deducted from the credits +when save & quitting from the map. +- Flares stop emitting particles when inside an inventory. +- Fixed oxygen not flowing through horizontal gaps between subs (e.g. between Remora and the drone). +- Decreased the size of the mountain in the RidgeBasic level type to prevent it from blocking the main path. +- Fixed too small collider sizes on a bunch of crafting materials. +- Fixed order options ("hold fire"/"fire at will" etc) being displayed in one button instead of +being split into separate buttons when playing the game in Chinese. +- Fixed "Text Self_CauseOfDeathDescription.Unknown not found" console error if a character gets killed +by being inside a respawn shuttle when it despawns. +- Fixed sonar not scaling properly when resolution is changed mid-round. +- Fixed fabricators & deconstructors displaying the "insufficient power" warning when power is low +(but still high enough for the devices to run). + +Networking fixes: +- Fixed another ID mismatch problem that occasionally caused clients to get kicked out in multiplayer, +usually with an error message warning about a missing item. +- Fixed players always getting range banned when banned by a client. +- Fixed turrets not being aimed correctly in multiplayer if they're in another sub (e.g. the coilgun in +Remora's drone). +- More reliable fabricator and deconstructor syncing. Should fix items disappearing when multiple players +attempt to use the device at the same time and strange timing inconsistencies when deconstructing +multiple items in succession. +- Fixed all servers showing "unknown" as the game mode in the server list. +- Fixed server not allowing forward slashes in host messages. +- Fixed repair interface sometimes getting stuck close to 100% in multiplayer. + +Character editor fixes and improvements: +- Nicer layout, made the panels hideable. +- Added buttons for creating joints, duplicating limbs, and deleting limbs/joints. +- A dropdown for selecting which content package to add the character to. +- Allow creating a new content package during character creation. +- Added hotkeys 1, 2, 3 for limb, joint, and animation modes respectively. +- Change the logic of deciding on which parameters are shown and when. In the ragdoll mode you can now +see the ragdoll, but also scale it and see the main parameters. Source rects are now longer shown on the +sprite sheet if limbs mode is disabled. +- Automatically select edit limbs mode when a new character is created. +- Option to create multiple limbs in the character creation wizard. +- Disallow deleting the main limb because it often causes crashes. +- Only allow selecting PNG files as the texture. +- The spritesheet is shown by default. +- Fixed deleted joints not being saved properly. +- Only lock the axis for torso/head position when alt is down. +- Disable test pose if the character is not a humanoid. +- Clamp camera offset so that the character is always at least partially visible. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.7 +--------------------------------------------------------------------------------------------------------- + +Changes: +- Made husks more common. + +Multiplayer fixes: +- Fixed an ID mismatch problem that occasionally caused clients to get kicked out in the multiplayer +campaign, usually with an error message warning about a missing item. +- Fixed servers using a local campaign save path sent by the client setupping the campaign, preventing +the campaign from starting up if the path does not exist at the server's end. +- Fixed radio communication occasionally not working between characters in the multiplayer campaign. Characters +that had made it through at least one round were not able to communicate through radio with characters that +have just been spawned for the first time. +- Kick votes persist during a multiplayer session even if the client disconnects (= disconnecting and rejoining +just before you get kicked doesn't work anymore). +- The server sends a "this client previously used the name xxx" message when a client rejoins with a different name. +- Fixed GameServer.UnbanPlayer passing the name to BanList in lower case even though BanList was case +sensitive (preventing unbanning clients with the "unban" command if their name is not in lower case). +- Fixed server not saving the whitelist when it's enabled/disabled, causing the setting to revert when +relaunching the server. +- Fixed structure texture scale and texture offset now being reverting to default values when the +submarine is saved by the server, causing them to reset between campaign rounds. +- Fixed client always launching the default "DedicatedServer.exe" even if using a content package that +should replace the server exe. +- Servers only report content packages with files that cause multiplayer incompatibility to the master server. +Fixes servers showing up as incompatible in the server list if they have custom sub files (or other types +of files that don't cause compatibility issues) installed. +- Fixed crashing when clients attempted to kick/ban players through the in-game info menu when a round +was running. +- Fixed client that's hosting a server not being taken into account in the player count visible on the server list. +- Fixed server list not displaying non-English symbols correctly (e.g. Cyrillic or Chinese characters). + +Misc fixes: +- Replaced WinForms with SDL which should resolve most of the fullscreen/resolution issues. It's also now +possible to change the resolution when in fullscreen without having to restart the game. +- Fixes to the DXGI crashes during startup. +- Fixed Character.GetConfigFile searching for the character file from all available content packages, not +just the ones that are currently selected. Caused modded character files to affect the game even when +the mod was not enabled, leading to various issues such as characters failing to equip items if the mod +changes the number or type of inventory slots a character has. +- Fixed a bug in monster/item spawnpoint logic that occasionally caused perfectly valid spawnpoints to be +discarded when there were floating ice chunks in the level, sometimes causing monsters to spawn very +far from the submarine (which often lead to the player not running into them at all). +- Fixed bots not being able to retaliate when attacked with a repair tool. +- Fixed crashing when firing a revolver in the sub editor. +- Fixed items applying their status effects twice if they're put into a container by swapping them with +another item. For example, replacing a fuel rod in the reactor by dropping a new fuel rod on it caused +the reactor behave as if it had two rods in it. +- Switches send out a continuous 0/1 signal that can be flipped by interacting with the switch (as opposed +to working like buttons which send out a pulse when interacted with). +- Fixed an issue that occasionally caused the main menu to look distorted when launching the game on Mac. +- Fixed crash after opening the file browser from the Workshop menu more than once on Linux. +- Fixed combat mission achievements being impossible to unlock. +- Fixed item scales not being saved when the scale is modified in the sub editor. +- Fixed incorrect physicorium shell description. +- Fixed server list & workshop menu not resizing properly when changing resolution. +- Fixed player input being used to determine whether a character should be holding on to ladders, causing +AI characters to let go of ladders when holding RMB. +- Fixed explosion damage bypassing armor (both creature shells and wearable items). +- Fixed OverrideSaveFolder and OverrideMultiplayerSaveFolder settings not being saved. +- Fixed order/rept icons "twitching" when the sub moves. or +- Fixed players being able to repair submerged electrical items indefinitely. +- Fixed a "attempted to access a removed ragdoll" console error when a character wearing the health +scanner HUD is removed. +- Fixed console errors when a battery's or supercapacitor's capacity is set to 0 and the interface is open. +- Fixed ability to drop items into secure lockers (or other containers that require specific items) +without having access to it. +- Automatically move the gaps linked to doors when the door is moved (and vice versa). +- Fixed items disappearing when they're dropped into a full container. +- Fixed crashing when an item that requires aim to use is used by something else than a character +(e.g. a status effect). +- Fixed having a broken device on a sub in the sub editor and switching to Character Mode causing a crash. +- Fixed the bottom of the background ice texture not rendering correctly on high resolutions. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.6 +--------------------------------------------------------------------------------------------------------- + +- Fixed clients failing to connect to servers that have banned clients based on their Steam ID. +- Removed Berilia (vanilla sub that's not ready for release). + +--------------------------------------------------------------------------------------------------------- +v0.9.0.5 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Automatically fill the client name textbox with the player's Steam username. +- Allow clients (including the host) to change their name in the server lobby. +- Censor password boxes to make joining servers a little more streamer-friendly. +- Show the name of the server in the "connecting to..." popup instead of the IP address. +- Added a close button to the debug console and a text that explains it can be opened/closed by pressing F3. +- Electrical components are attached to walls with the left mouse button instead of E. +- Flares are activated with the left mouse button instead of E. +- Nerfed plasma cutters and welding tools. +- Made coilgun ammunition boxes deconstructable. +- Removed minimum job count requirement from Captain, Engineer & Mechanic (i.e. it's not possible to play +other jobs even when there's 3 or less players on the server). +- Increased default respawn transport time to 5 minutes, decreased respawn interval to 3 minutes. +- Allow muting players mid-round through the info menu. +- Allow to edit the door opening/closing speeds and increase the defaults. +- Reduce the follow-up distance and require the bot to be in the same room than the player before stopping, +so that bots with a follow order don't stay on the doorways when the player is trying to enter the airlocks. +- Stop "breathing" deformations when the character is dead. +- Disable obstructed paths when the submarine docks to another submarine/outpost. +- The location of save files can be changed in config_player.xml using the attributes "overridesavefolder" +and "overridemultiplayersavefolder". + +Bugfixes: +- Fixed crashing during startup due to faulty OpenAL installations. +- Fixed inability to select the voice capture device if the name of the device contains non-latin symbols +(Cyrillic or Chinese characters for example). +- Fixed a networking issue that occasionally caused clients to get kicked with a "disconnected due to +excessive desync" error message. +- Fixed fires being very hard to put out completely in multiplayer. +- Fixed items not being repaired after purchasing repairs in the campaign. +- Removed outdated Launch_BarotraumaServer script from the Linux version (does not work anymore, the +dedicated server should be launched by running the file called "DedicatedServer"). +- Fixed server owners not being able to join their own server if whitelist is enabled and the owner is not +on the whitelist. +- Fixed inability to ban clients by their Steam ID using the console. +- Fixed all servers showing up as "Round has not started" in the server list. +- Fixed server ignoring the max players value set in the "host server" menu and using the setting +configured in "serversettings.xml" instead. +- Fixed spectators not hearing the living players' voice chat. +- VOIP improvements (less crackling and pops). +- Increased oxygen output in vanilla submarines to prevent characters from suffocating when playing with +an oversized crew. +- Fixed occasional console errors when ending a round (causing the round end summary not to appear). +- Waypoint fixes in vanilla subs. +- Disallow shooting and attacking when the cursor is over a UI element (to prevent, for example, +accidentally firing a gun when dismissing a message box). +- Fixed "file not found" errors on Linux when attempting to enable a mod that defines file paths +using a backslash instead of a slash. +- Fixed monsters ignoring decoys. +- Fixed store menu switching back to the equipment category every time something is bought/sold in +the multiplayer campaign. +- Fixed "push to talk" field going outside the audio settings menu on some aspect ratios. +- Fixed long server names overflowing in the server list menu. +- Fixed the character saying "OrderDialogSelf.dismissed" when a player removes an order from themselves. +- Fixed subinventory slots going outside the screen when for example grabbing someone with a toolbox +in the leftmost inventory slot. +- Fixed monsters sometimes spawning inside the floating ice chunks within the levels. +- Fixed physicorium shells not being containable in railgun shell racks. +- Fixed physicorium ammo box not being containable in coilgun ammunition shelves. +- Fixed inability to spawn items in characters' inventories with the "spawnitem" console command. +- Fixed health interface not focusing to the most damaged limb when closing and reopening the interface. +- Prevent welding doors shut during the tutorials (as the player doesn't have access to any tools to +reopen the door). +- Fixed AI pathfinding when the path is from a submarine to another submarine. +- Fixed crashing when AI crew tries to find a path out of the ruins. +- Fixed Watchmen looking at the wrong direction. +- Fixed crashing due to an invalid display resolution. +- Fixed alien item assemblies not being hidden from the sub editor. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.4 +--------------------------------------------------------------------------------------------------------- + +- Fixed "Steam authentication failed" errors when trying to reconnect to a server after cancelling the +connection. +- Fixed clients occasionally failing to spawn items when playing using a different language than the server, +which caused them to get kicked. +- Fixed extra cargo failing to spawn in multiplayer when playing using a different language than the server. +- Fixed legacy items failing to load if a sub is saved with a language other than English and the language +then changed to something else. +- Fixed excessively small password input box when connecting to servers. +- Fixed a bug that occasionally caused items to drop from the inventory when moving items between +inventory slots in the multiplayer. +- Prevent junction boxes from getting damaged due to overvoltage in the engineering tutorial. +- Fixed structures getting scaled incorrectly when cloning a structure with a non-default scale in the +submarine editor. +- Fixed occasional crashes when leaving a multiplayer session while the "cinematic" at the end of the round +is still playing. +- Fixed items not being moved to the humanhusk's inventory when a huskified player dies (= clothes and +other gear seemed to magically disappear when the character "resurrected" as an AI husk). +- Fixed clients not seeing turrets rotating at their end when another client is operating the turret. +- Fixed hitscan projectiles (revolver rounds) going through walls if the weapon is fired while its +barrel is partially inside the wall. +- Fixed welding tools being able to weld doors and burn characters through walls. +- Fixed bots reporting leaks when there are holes in the interior walls. +- Fixes to the colliders of some of the shuttle wall pieces. +- Fixed Linux version crashing when attempting to browse for files in the Steam Workshop menu. +- Fixed credits not resizing when resolution is changed. +- Added an upper limit to impact damage done to ragdolls, preventing characters from getting instakilled if +a Moloch or another large monster smashes against the sub hard enough. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.3 +--------------------------------------------------------------------------------------------------------- + +- Fixed captain tutorial not continuing after the part where the mechanic has to be ordered to do repairs. +- Fixed mechanic tutorial getting stuck if repairing the devices is interrupted before they're fully repaired. +- Fixed Workshop item preview images not working on Mac or Linux. +- Fixed "Add file" and "Browse preview image" file dialogs crashing some Mac/Linux systems. +- Unlock tutorials one by one. +- Fixed crashing when clicking on the "no matching servers found" message in the server list. +- Fixed loading screen being dismissable when the window is not active. +- Fixed connection panel overlay overlapping with the connections on resolutions higher than 1080p. +- Fixed incorrect "mission completed" text in the combat missions. +- Fixed "a swarm of [monster]" description in the crawler swarm mission. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.2 +--------------------------------------------------------------------------------------------------------- + +- Automatically set the keybinds to AZERTY when French is selected as the display language. +- More readable font and a fix to some texts appearing slightly "clipped". +- Additions to the credits. +- Minor tweaks to subs and shuttles. +- Added propeller damage to the shuttle engine. +- Increased maximum voice chat volume. +- Directional voice chat is enabled by default. +- Display the language names in the respective languages in the initial language selection screen. +- Playing the splash screens or tutorial videos doesn't require libvlc and libvlccore to be installed +on the user's system in the Linux version anymore. + +Bugfixes: +- Fixed a bug that caused frequent desync kicks when playing a multiplayer monster mission. +- Fixed private servers showing up in the server list. +- Fixed an index out of range error in DoctorTutorial if proceeding too fast to the submarine. +- Fixed report messages not going through to some clients when there are multiple clients on the server. +- Fixed players not seeing reports made by bots in multiplayer. +- Fixes to missing translations and UI layout problems when using languages other than English. +- Miscellaneous crew AI fixes and improvements. +- Fixed find safety AI objective not working properly. +- Fixed bots loading only half of the target items in the contain item objective. +- Fixed directional sonar indicators not being displayed on the sonar monitor. +- Fixed floating ice chunks occasionally spawning too close to the start of a level, causing them to clip +through the submarin and/or the outpost. +- Fixed incorrect reward amount in the "Chemical shipment" description. +- Fixed inability to use the underwater scooters with LMB. +- Fixes to UI layouts on 4K resolution. +- Fixed unnecessary silence at the end of the "Objective Complete" music track. +- Fixed ruin walls being almost impossible to cut from inside the ruins. +- Fixed the "report leaks" button being highlighted inside ruins. +- Fixes to wall colliders. +- Fixed "Pause on focus lost" setting being always treated as if being enabled. +- Fixed dedicated server overwriting existing crash reports. +- Fixed save time being displayed in UNIX time in the right-hand panel in the campaign setup UI. +- Fixed "Praise the Honkmother" and "Extravehicular activity" achievements not unlocking in multiplayer. +- Fixed "No fun allowed" achievement being possible to unlock by committing suicide while wearing a clown costume. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.1 +--------------------------------------------------------------------------------------------------------- + +- Added a bunch of missing translations. +- Fixed Steam Workshop on Mac. +- Fixed docking interface button not working in the multiplayer. +- Fixed medical doctor tutorial crashing on languages other than English. +- Fixed a bug that caused AI characters to occasionally get stuck next to stairways. +- Fixed animation and ragdoll file paths getting messed up if there are multiple content packages +installed that include monsters with the same name. +- Fixed crashing when a StatusEffect causes an item to be used on a target. +- Fixed a gap between Remora and the drone. +- Added more supplies to Remora. +- Fixed watchman's dialogue getting muffled. + +--------------------------------------------------------------------------------------------------------- +v0.9.0.0 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Translations to German, Russian, French, Brazilian Portuguese, Traditional Chinese and Simplified Chinese. +- Numerous fixes and improvements to the crew AI. The biggest change is that the AI characters can now do +tasks by themselves even when they haven't been assigned an order. +- One new outpost. +- New docking system. +- New logo and main menu art. +- Added a credits tab to the main menu. +- Some new item and structure sprites. +- Some new environment sprites. +- Increased the amount of credits the player starts with in the campaign. +- Balanced location and mission distribution. +- Balanced mission rewards. +- AI characters can be ordered to fight intruders. +- Lock the inventory when aiming with a railgun or a coilgun. +- Swap the order of the starting location & destination in nav terminals when playing in a mirrored sub. +- Option to automatically pause the game when the window loses focus. + +Bugfixes: +- Fixed splash screens and tutorial videos crashing the Linux version. +- Fixed damaged item sprites not updating client-side after being repaired. +- Fixed characters occasionally taking impact damage when hitting walls while climbing. +- Fixes crashing when attempting to use symbols such as <, > or | in the save file name. +- UI layout/scale fixes on resolutions larger than 1080p. +- Fixed crashing when loading the same sub twice in the sub editor. +- Fixed submarines occasionally being rendered at an incorrect position when viewing them in the sub editor +after they've been used in-game. +- Improved the syncing of ragdolled characters. +- Fixed characters not receiving impact damage when ragdolled. +- Fixed characters' arms occasionally spinning around when standing still. +- Fixed tutorial level generation parameters being used in some normal campaign levels (leading to extremely +small levels and submarines overlapping with the outposts). +- Fixed characters running more slowly when their torso is in a different hull than the feet (for example +in Humpback's bilge). +- Fixed character's feet getting stuck to platforms when climbing ladders while holding A/D. +- Fixed monsters being able to drag characters through walls. +- Fixed items "vanishing" if they move directly from sub to another without going outside first. +- Fixed content package hash calculation failing if the package is not enabled and contains new monster files. +- Fixed inability to enable content packages if some of the files included in the package are already in +the game folder (which may happen, for example, if enabling a content package fails). +- Fixed AllowRagdollButton settings not being synced with clients, leading to strange ragdolling behavior +client-side if the server has disabled ragdolling. +- Fixed incorrect keybinds being displayed in a couple of tutorial texts. + +--------------------------------------------------------------------------------------------------------- +v0.8.10.0 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Completely remade tutorials (separate tutorial for each job). +- Added a door and hatch variants with integrated buttons. +- New outpost graphics. +- Added swarm behavior to crawlers. +- Added a new mission where you have to kill a swarm of crawlers. +- Numerous crew AI improvements. +- Balanced item deterioration values. +- Mineral sprites change when collected from the environment. +- Added an option to disable directional voice chat. +- Added automatic submarine repair option to the campaign. +- Added "all" tab to the entity list in the submarine editor. +- Hide the crew area, chat box and server buttons when operating a turret or searchlight. +- Doors can be repaired with a wrench. +- Some new lamp variants. +- Display a progress bar when welding doors shut. +- Items that don't give any materials when deconstructed cannot be deconstructed. +- Added a console command that resets selected items and structures to prefab values ("resetselected"). +- Option to toggle structure drop shadows and edit the position of the shadow in the sub editor. +- Minor physics optimizations. +- Disable background music & ambience in the character editor. +- More pronounced limping animation when a character's legs are injured. +- The inventory slots next to the character portrait (ID card, uniform, etc) can be hidden. +- Some new sound effects and background music. +- All walls can be scaled in the submarine editor. +- Structure damage is visualized when using debugdraw. +- Improved font scaling on different resolutions. +- Added Steam overlay support to Workshop. +- Server list shows which servers have voice chat enabled. +- Show a message box notifying respawning traitors that they're no longer a traitor. +- Added a search bar to the store menu. +- Added search bars to sub lists in campaign setup UI and sub editor. + +Bugfixes: +- Don't allow rewiring and deattaching an item at the same time (happened when interacting with an item +while holding both a screwdriver and a wrench). +- Fixed bots being unable to complete almost any task in the multiplayer due to a bug that caused +them to interpret the sub as another crew's submarine. +- When spawning multiple monsters at the same time, spread them around a bit to prevent the players +from getting attacked by a ball of overlapping crawlers. +- Fixed huge lag spikes when a character tries to escape from an enemy but can't find a path away from it. +- Fixed file transfer progress bars not being visible in the server lobby. +- Fixed crashing when attempting to start a mission round with mission type set to None. +- Fixed ElectricalDischarger electricity effect staying visible if the item breaks or the component +is deactivated from outside (e.g. via a StatusEffect or the parent component). +- Fixed specular maps being rendered on top of characters when outside the sub. +- Fixed excessively bright lights around sonar flora and lava vents. +- Fixes to item collider sizes. +- Fixed inability to scroll through long texts in the sub editor's textboxes. +- Fixed clients not being able to see other characters in spectator if they've died far away from the sub. +- Fixed non-latin characters not being displayed correctly in Workshop item texts. +- Don't prevent selecting items in the sub editor when the cursor is on a wire node, because it makes it +very difficult (or impossible) to select small items in the wiring mode. +- Fixed crashing when attempting to use the "spawnitem" command when a round is not running. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.10 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Added collision sounds to items (e.g. when dropping or throwing items on the floor). +- Devices that are not currently being used never deteriorate spontaneously. +- Added a new submarine, "Berilia". +- Minor improvements to menu layouts. +- Randomize map seed when opening the "new game" tab. +- Show the "starting a round" popup to all clients when the server initiates a new round. +- The CustomInterface ItemComponent can be used to trigger StatusEffects. Buttons apply OnUse effects when +pressed, tickboxes apply OnUse when checked and OnSecondaryUse when not. +- StatusEffects can modify item sound and sight ranges (requires an AITarget). +- Sonar beacons can be toggled on/off. + +Bugfixes: +- Fixed submarines not being able to move horizontally in multiplayer if not accelerating fast enough. +- Fixed an inventory syncing issue that occasionally caused items to be dropped when moving them from the +inventory to a container or vice versa. +- Fixed items occasionally dropping from the inventory at a very high speed, sometimes causing them to +clip through floors. +- Fixed idling AI characters causing lag spikes if they can't find a path out of the room they're inside or +if the submarine has no waypoints. +- Fixes to AI characters getting stuck if they fail to reach a leak they're trying to repair. +- Fixed characters "selecting" equipped railgun shells and depth charges, causing the characters to face +towards the item. +- Prevent AI characters from jumping down from high places. +- Fixed highlighted items being selected when letting go of the Shoot button. +- Fixed inputs still working in multiplayer when the pause menu or the settings menu is open. +- Fixed some Steam achievements being impossible to unlock in single player. +- Fixed "Poisoner" Steam achievement being impossible to unlock. +- Fixed crashing when enabling game mode voting in multiplayer. +- Fixed voice chat volume not being applied on startup (i.e. the default volume was always used until you +went back to the settings menu to change it). +- Fixed power not working correctly in some grids with chained relays and junction boxes. +- Fixed crashing when attempting to publish a sub with a preview image larger than 1MB on the Steam Workshop. +- Don't allow overwriting vanilla submarines/characters even if the vanilla content package is not selected. +- Don't allow deleting vanilla subs or subs that are a part of some content package through the sub editor. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.9 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- New control scheme: items are selected by left clicking, deselected with right click or esc, and held +items are used on devices by pressing E (e.g. when rewiring with a screwdriver or repairing something +with a wrench). The new controls are somewhat experimental; the intention is to make them more intuitive +to new players. You can still switch back to the legacy control scheme from the game settings. +- Set default radio chat keybind to R and creature attack keybind to Mouse3. +- MODDERS, PLEASE NOTE: Moved crafting recipes from the fabricator xml to the xmls of the items. Makes it +possible for modders to add new craftable items without having to modify the fabricators. +- Some menu layout improvements. +- Camera movement is disabled completely when an item interface is open (not just when the cursor is on +the interface). +- Option to disable the camera pan/zoom effects from the game settings. +- Option to set a custom preview image for subs. +- Allow aiming on ladders when not moving. +- Characters play Entrance of the Gladiators on the guitar when wearing a clown mask. +- Display a warning on the status monitor when docked to an outpost ("Docked to X, undock before attempting +to maneuver the submarine"). +- Improvements to the line of sight effect. Prevents ugly-looking artifacts in spots where two wall pieces +meet. +- The server gives the "None" permissions to new clients, allowing server hosts to automatically give +specific permissions to all clients. +- Increased submarine masses to make it less easy for characters to push them around. +- Ping direction is shown on the sonar display when adjusting the direction slider even if directional ping +is not enabled. +- Tweaked charybdis' AI, attacks and animations. +- Nuclear explosions cause radiation sickness. +- Reduced structure damage done by reactor explosions. +- Higher-resolution submarine preview images. +- Added a notification that tells where cargo spawns at the start of a round. +- Let the camera zoom out further when controlling a large monster. +- Added a longer delay to getting killed by pressure (5 seconds in max pressure). +- Made the pressure-zoom-in effect appear as soon as the pressure in a room starts to rise. +- Added blood particle effects when under high pressure. +- Some optimization to reduce loading times. +- Added a search bar to fabricators. +- Increased the range of docking port sounds and added a subtle camera shake when locking the ports to make +it more noticeable when a sub docks. +- Made all new medical items fabricable. +- Automatically put the currently equipped item in the inventory (no matter if it's one or two handed) when +picking up items that require two hands. +- Job preferences can be edited mid-round in the info menu. +- Slightly reduced the amount of oxygen characters consume from hulls. +- Enemies don't attack outposts or targets inside it anymore. + +Multiplayer fixes: +- Fixed characters retaining the last known inputs when a client disconnects, causing the character to +keep welding, honking a bike horn or whatever else they were doing until the server kills the character. +- More reliable throw StatusEffect (= grenade explosion) syncing. Fixes clients not seeing explosions +at their end. +- More reliable item wall attaching syncing. +- Servers don't attempt to send position updates for items that have no enabled physics body (e.g. attached +items). Fixes "received a position update for an item with no physics body" console errors when attaching +items to walls. +- Fixed spectate button staying visible when a round ends while a client is in the lobby. +- Fixed remote characters sliding slowly to the left client-side when standing in place. +- Fixed server creating "attempted to create a network event for an item that hasn't been fully initialized +yet" console errors when spawning LightComponents mid-round. +- Fixes monsters flipping around way too often client-side (especially when inside the sub). + +Bugfixes: +- Fixed wire connections that have been done mid-round not working properly. +- Fixed crashing when attempting to speak as a monster in single player. +- Fixed linked subs not getting docked correctly when loading a saved game. +- Fixed turrets not working if they're placed inside the submarine. +- Fixed calyxanide not being usable in syringe guns. +- Explosive harpoons disappear after exploding. +- Emptying the "required items" field of an item in the sub editor now removes the item requirements (instead +of using the default ones). +- Fixed crashing if a fabricator finishes creating an item after the user has been removed (e.g. eaten). +- Fixed crashing if none of the selected content packages contain location portraits suitable for the main menu. +- Fixed projectiles not applying status effects on impact if they have no attack defined. +- Fixed thorium rods not being usable in the reactor. +- Conditionals return a match when checking status tag inequality and the target has no status tags (e.g. +checking if a character doesn't have a StatusEffect with a "poison" tag returns true even if the character +has no active StatusEffects). +- Fixed severed limbs occasionally noclipping into the submarine. +- Fixed large engine emitting smoke before it becomes repairable. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.8 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- Improved tutorial - better videos, instructional texts, objective list that suggest what you should do +next, option to rewatch the videos and re-read the instructions. +- Overhauled charybdis (still a work in progress though). +- Automatically grab adjacent ladders when the top/bottom of the current ladder is reached. Makes moving +through docking ports a little less confusing. +- Option to configure when afflictions become visible with the health scanner by adding +a "ShowInHealthScannerThreshold" attribute to the affliction. +- Added labels next to periscopes in Humpback and Dugong. +- Modified Humpback's bilge to make it easier for AI characters to fix. +- Enemies can now navigate out from the sub when escaping. +- Bunch of tweaks to monster AIs (targeting priorities, attack cooldowns, etc). +- Made InventoryIconColor and ContainerColor properties saveable. +- Removed descriptive name from alien artifacts (so be extra careful when bringing them on board). +- Allow panning the campaign map with WASD. +- Allow editing selected wires in wiring mode (so it's possible to, for example, modify the colors of +the wires without having to disconnect them). +- Decreased structure damage done by frag grenades and made them disappear after they've exploded. +- Batteries output charge values as integers. +- Made damaged junction boxes less sensitive to overvoltage. Nearly broken junction boxes were barely able +to handle any overvoltage, leading to chain reaction where one junction box breaking causes the grid to be +overloaded, and the rest of the boxes start taking damage at an increasing speed. +- Reactors don't cool down when underwater anymore. +- Removed minimum conditions from battery deconstruction output (= deconstructing an empty battery still +gives the materials used to craft the battery). +- Made a bunch of ItemContainer UI panels larger. +- Items can be dragged and dropped directly from the inventory into containers without having to select +the container first. +- Plants can be picked up from the environment without any tools. +- Added more help texts to highlighted items ("[E] Interact", "[E] Climb"...) + +Multiplayer fixes: +- Changes to event syncing logic to prevent cases where clients fall behind the server and get kicked out +due to the server not being able to send out network events to the clients fast enough. +- Networking optimizations that prevent level objects and continuously deteriorating items from creating +excessive amounts of network events. +- Fixed windows clients being unable to start a campaign in servers running on Linux. +- Fixed clients being unable to start a campaign using a submarine that's not in the default Submarine +folder at the server's side. +- Fixed loading submarine files and campaign saves occasionally failing when running multiple instances +of the game from the same install location (for example, a dedicated server executable and a client +executable). +- Don't transfer files through the network when sending them to the owner of the server (i.e. a client +hosting directly from the main executable). +- Fixed fires and water occasionally getting out of sync between a client using the fire/water console +commands and the server. +- Fixed clients disconnecting with an "unknown object header" error if they fail to read a network event +(when they should instead report the error to the server and wait for a message that contains a more +descriptive error). +- Campaign fix: clear missions from locations that change their type, and all adjacent locations. Not +clearing them caused missions to still be available when they logically shouldn't be (e.g. a transport +mission from an uninhabited location to another) and syncing issues in multiplayer. +- Disable campaign start button if a round is already running when joining. +- Fixed clients being unable to end campaign rounds at all if the sub isn't at the start/end outpost +(regardless if they have the permission to end the round or not). +- Fixed campaign characters still being displayed in the server lobby after the game mode has been +changed to something else. +- Fixed items in the characters inventory always starting at 100% condition client-side even if they had +deteriorated during the previous round. +- Fixed LevelResource (mineral, plant, etc) deattach timers not being synced with clients. +- AI characters can take out excess fuel rods from the reactor when needed. +- Item interfaces and the health interface can be closed with Esc. + +Bugfixes: +- Fixed almost all items using default repair duration values (10 seconds with high skills, 100 seconds +with low skills) instead of the ones configured in the item XMLs. +- Nuclear shells and nuclear depth charges disappear after they've exploded. +- Fixed "trying to add a dead character to crewmanager" errors when attempting to revive a character +killed by some other affliction than internal damage, bleeding or burns. +- Take the position of a sub's docking port into account when determining where to place outposts. +Previously the outposts were simply placed midway between the adjacent walls, which occasionally caused +problems with submarines whose docking port is close to the bow or tail. +- Fixed a bug in relay components that caused a bunch of issues in power grids that utilize relays: +Relays would receive the full amount of power from the grid regardless of the load of the devices +connected to the power_out connection, causing unnecessary overloads and fires. +- Fixed batteries being able to draw power through relay components that are connected directly to +a power source, even if the relay isn't on. +- Don't allow steering the sub with WASD when a textbox is selected. +- Use the SpriteColor of the item when drawing the moving parts of turrets and doors. +- Fixed steering issues that caused monsters to swim in an incorrect direction when they're targeting +something inside the sub. +- Fixed a crash due when scaling the Mudraptor. +- Fixed crashing if a character has neither a head angle or a torso angle configured. +- Fixed characters always being created in the default folder in the character editor. +- Monsters don't target doors/hatches at the exterior of the sub when inside or inner doors when outside. +- Don't display disabled limbs on sonar (i.e. severed limbs that have "faded out"). +- Close the save/load dialogs when leaving the sub editor. Otherwise they'll still be visible when +re-entering the editor, and saving at that point will overwrite the previously loaded sub with an empty one. +- Removing an item after it's been combined doesn't trigger the OnBroken StatusEffects (e.g. combining two +half-full flash powder jars doesn't cause them to explode). +- Fixed welding tools and plasma cutters not hitting targets if the barrel is inside the target (e.g. if +trying to weld a completely broken wall with the cutter partially inside the wall). +- Fixed very small mineral colliders that made them extremely hard to hit with the plasma cutter. +- Fixed items with no sprite crashing the game (now they just cause a console error). +- Don't allow autointeracting with contained items (e.g. picking up an ammunition box from a loader) +if another item is currently selected. Makes it less likely for players to accidentally pick up items +from containers when they deselect another item. +- Fixed characters not letting go of the character they're grabbing when the health interface is closed +by clicking outside the window. +- Fixed CrewManager throwing errors if changing resolutions when a crew member is dead. +- Fixed items emitting light from inside containers in the sub editor. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.7 +--------------------------------------------------------------------------------------------------------- + +Additions and changes: +- The fission rate gauge on the reactor now visualizes the amount of fuel available. +- Doors and hatches can now also be repaired with wrenches. +- Changed default StatusEffect conditional comparison type back to OR. +- Clients communicate syncing errors to the server, and the server logs a more descriptive error about +what went wrong. Should make it easier to diagnose disconnection issues from now on. +- Ending a multiplayer campaign round by talking to watchman doesn't require any special permissions. +- Server automatically ends rounds if there have been no players alive in 60 seconds and respawning +is not allowed during the round. +- Added a button for resetting an entity's properties to the default values to the sub editor. +- Updated handheld sonar UI graphics. + +Bugfixes: +- Fixed non-radio chat/VOIP having an unlimited distance. +- Fixed a networking bug that caused the server to send item state changes to the clients before sending +a message about the item being spawned. For example, spawning any item with a LightComponent would always +cause clients to get disconnected. +- Changes to the way the clients are put in sync with the server when joining mid-round. Should make it +less likely for clients to get disconnected immediately after starting a round. +- StatusEffects only apply non-limb-specific afflictions to one limb even if targeting the whole character. +Fixes drugs like fentanyl and morphine being way too harmful due to the oxygen loss affliction being +applied once per every limb. +- Fixed TargetItemComponentName not working in StatusEffect conditionals (making it impossible to create +conditionals that target a specific component of an item). +- Made all of the new medical items combinable and usable in a syringe gun (assuming the drug is in a syringe). +- Fixed inability to throw anything in the multiplayer. +- Fixed multiplayer campaign setup UI showing the client's subs instead of the server's. +- Fixed campaign view button overlapping with the "ready to start" tickbox in the server lobby. +- Fixed sub/mode voting not being enabled when changing the setting after the server has been started. +- Fixed character inventories occasionally being saved incorrectly in the multiplayer campaign when an +- Fixed flares not activating by left clicking. +- Fixed affliction icons flickering rapidly in the health interface and above the health bar if their +strength is fluctuating around the threshold where the icon becomes visible. +- Fixed dedicated server crashing when typing in more text than can fit on one line. +- Fixed enemies "fleeing" after they have been shot. There was a steering issue when they targeted characters +inside the sub while being outside. +- Fixed Hammerhead attack causing warping. +- Fixed incorrect submarine and level seed in server logs when playing campaign mode. +- Hide the start button from the campaign UI if the client doesn't have the permission to manage +the campaign or rounds. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.6 +--------------------------------------------------------------------------------------------------------- + +Additions: +- A major overhaul on the crew AI. They should now be much better at executing their tasks, keeping +themselves alive and less likely to get stuck. +- Re-enabled multiplayer campaign. +- New alien ruin art. +- New main menu (still a work in progress). +- New fonts. +- New subs and a new shuttle. +- New husk sprites. +- Improved item/character highlight effect. +- New signal items (divide, multiply, subtract, memory, equals, greater than, color, xor). +- Option to adjust microphone volume in multiplayer. +- Added a console commands for changing the gender and race of the character. +- More intuitive BrokenSprite condition logic: a BrokenSprite with a MaxCondition of 50 will start +fading in at 50 (and be fully visible when the condition drops to 0 or down to the MaxCondition of +the next BrokenSprite). +- Added Mirror X/Y buttons to editing HUDs and tooltips that tell about the keyboard shortcuts. + +Multiplayer fixes: +- Improved item position syncing logic. Less warping or items being impossible to pick up due to +being in a different position server-side. +- Fixed clients not sending a network update to the server when dragging an item out of an inventory +slot, causing situations such as suffocation after dropping a diving suit due to the server not +knowing that you'd dropped it. +- The client hosting a server and spectators don't trigger autorestart. +- The owner of a server is allowed to spectate even if spectating is disallowed in server settings. +- Fixed "play yourself" always toggling to true when a round ends. +- Fixed missing item names in the extra cargo menu. +- Fixed traitor rounds failing to start if the server is not hosted by a client. +- Fixed console command aliases not being taken into account in GameClient.HasConsoleCommandPermission +(meaning that the client needed a permission for each name variant of a command, making it impossible +to for example use "fixwalls" instead of "fixhulls"). +- Made the "control" console command usable to clients. +- Show the "ready to start" tickbox in the server lobby even if the client has the permission to start +the round. +- Fixed server lobby screen not showing the names of the submarines the client doesn't have. +- Fixed inability to select the respawn shuttle as a client host. +- Fixed VoipCapture creating new "could not start voice capture" popups constantly if there's no +suitable capture device. +- Fixed crashing when starting a round if a submarine name contains underscores. +- Fixed clients console errors when attempting to modify the properties of an ItemComponent in-game +(for example, the color of a light component). +- Added some more information to the console messages and error popups when a client gets disconnected. +- Fixed enablecheats command crashing the server if it's used when there are no clients present. + +Misc bugfixes: +- Audio fixes (less snap, crackle and pop). +- Fixed particle "jitter" when the submarine was moving fast. +- Fixed damage modifiers affecting all afflictions if they use affliction types instead of affliction +identifiers. +- Fixed end round vote text going outside the screen if there's a 2-digit amount of votes. +- Fixed StatusEffects only applying afflictions to one limb even if the target is "Character" instead of "Limb". +- Disable audio instead of crashing if no audio device is found. +- Fixed item interfaces getting repositioned every frame when the editing HUD is open. +- Fixed held items clipping with the sleeves of the character (e.g. when holding a revolver while an +uniform is equipped). +- Fixed being able to levitate by spamming the ragdoll button. +- Fixed dead characters draining oxygen tanks inside diving suits/masks. +- Fixed reactor gauges getting messed up if the optimal fission rate is more than 100% (which may happen +if the power consumption is larger than what the reactor can generate). +- Fixed mud raptors not having an inventory (nor lootable items). +- Fixed inability to interact with any items when aim assist is set to 0%. +- Fixed info panel flickering out and Tab getting "inverted" (= info panel shown when tab is not being held) +when selecting crew members in the panel. +- Fixed characters arms occasionally getting stuck above their shoulders. +- Fixed wire nodes occasionally being created at the wrong end of a wire (e.g. when moving a wire between +connections in a connection panel, the wire stretched from the device at the other end of the wire to +the device that's being rewired). + +Misc: +- Changed the way arguments are given to the "setclientcharacter" command (no semicolon to separate the +names, quotation marks have to be used for multi-word names just like with any other command). +- Show the amount of credits in the crew tab of the campaign menu. +- Don't spawn new monsters if docked to the start outpost or within 50 meters of the start/end of the level. +- The diving knife now causes also internal damage besides bleeding. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.5 +--------------------------------------------------------------------------------------------------------- + +Bugfixes: +- Fixed alien vents crashing the game when there's a character nearby. +- Fixed chatbox retaining the radio message prefix after being deselected. +- Push-to-talk doesn't trigger when typin in a text box. +- Fixed some server log messages and texts sent to clients being incorrect (= showing the tags that are +used to fetch the texts from the language files instead of the actual texts). +- Fixed AI orders that target a specific item (such as the order to power up the reactor) not working in +multiplayer. +- Fixed crashes when attempting to use voice capture or change voice capture settings when there are no +suitable capture devices available. +- Fixed clients not being notified when an AI character shuts down the reactor. +- Fixed deconstructors staying active without power in multiplayer. +- Fixed sonar labels going outside the screen when at the left side of the display. + +Additions & changes: +- Added some supplies to vanilla submarines. +- Balanced item deterioration rates and adjusted neutral ballast settings in vanilla subs. +- Increased the impact tolerance of crawlers to prevent them from killing themselves by bumping into walls. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.4 +--------------------------------------------------------------------------------------------------------- + +Multiplayer improvements: +- Got rid of the listen server: when hosting as a client, the game actually runs the dedicated server executable +in the background. Makes client-hosted servers a little smoother due to the better performance of the dedicated +server, and also makes it much easier for us to maintain and test the multiplayer because we no longer have +two separate server applications. +- Added multiplayer campaign. +- VOIP support! Still a work in progress, so minor audio glitches are to be expected. +- Improved character and submarine position syncing. Way less rubberbanding and teleporting! +- Fixed servers occasionally starting the round multiple times when autorestarting or starting by voting. +- Fixes players being unable to log in as a client when they're hosting a dedicated server on another machine. +- Option to randomize your job preferences in the server lobby. +- Fixed a server timing issue that occasionally caused the server to kick clients due to desync when a round starts. +- Fixed occasional server-side "maximum packet size exceeded" errors. +- Require the players to either dock with the ending outpost or to get the sub close and enter the outpost before +automatically ending the round. + +Bugfixes: +- Fixed crashing if the round ends while the health window is open. +- Fixed incorrect item panel positioning in the crew command interface when the sub is docked to something. +- Fixed crashing when an incompatible content package is selected in config.xml or if the content package +cannot be found. +- Fixed screen distortion effects on Linux. +- Fixed non-character key input on Linux (arrow keys, tab, etc). +- Fixed fullscreen option not taking effect on game launch. +- Fixes to a bunch of crashes in the character editor. +- Fixed subinventories not being displayed on the inner clothes slot, making it impossible to use the extra +slots in uniforms. +- Fixed game settings resetting every time the game is updated. +- Fixed bots shooting at their own crew with turrets. +- Fixed wifi components not receiving chat messages in single player. +- Fixed AI not reloading coilguns if an empty box of ammunition is inserted in the loader. +- Fixed incorrect deusizine scale. +- Fixed turret light toggle not doing anything. +- Fixed character skills that aren't defined in the job xml never increasing, resulting in all jobs except +the captain always having a helm skill of 0. +- Fixed flashlight & scooter light cones being "clipped". +- Fixed StatusEffects bypassing limb damage modifiers. +- Fixed waypoints not getting connected between docking ports on some subs. +- Fixed target identifiers being bypassed when a StatusEffect is set to target nearby items or characters. +- Fixed the "insufficient skills to use the item" text popping up if a character doesn't have sufficient +skills to operate one of the item's components, even if the component was not interacted with (e.g. captains +got a warning about not being able to use the connection panel of a nav terminal, even if they didn't select +the connection panel). + +Steam Workshop: +- Update installed workshop items automatically on startup. +- Allow adding submarines to workshop items with the "add file" dialog. +- If creating an update for a workshop item that's currently installed, use the installed version instead +of the one downloaded from the workshop. + +Additions: +- Some new random events. +- A bunch of new afflictions and medical items. +- Some new item sprites. +- A couple of new cargo missions. +- Added some new items that can be crafted from alien materials. +- Display linked hulls as one room on the status monitor. +- Tons of new sound effects. +- Display the controlled character in the crew interface. +- Option to "give orders" to the character you're controlling. In single player it can be useful if you want +the controlled character to keep doing something when switching to another one, in the multiplayer it can be +used to let others know what you're doing. +- Added a weak spot to Moloch's bladder. +- Baby Moloch, doo doo doo doo doo doo +- Added damage particles to Mud Raptors and Molochs. +- Added "minimum velocity" property to to motion sensors. Allows making sensors that, for example, keep a door open +when a character is standing in the doorway. +- Option to choose whether to use AND/OR logic in StatusEffects with multiple conditionals. Defaults to AND. +- Added a 1 second "cooldown" to water detector state switches to prevent alarms from toggling on and off constantly +when the water level is fluctuating around the position of the detector. +- Added scram option (reactor shutdown) to the nav consoles in the vanilla subs. +- Support for binding Mouse4, Mouse5 and MouseWheel. +- Made Hammerhead and Mudraptor attracted to light. +- New husk sprite (still WIP). + +Misc: +- Decreased deterioration rates across the board. Repairing a damaged item to full condition also now resets +the deterioration delay, meaning that the item will not start deteriorating again immediately after it's been +repaired. +- Miscellaneous optimization. +- Removed the info button from the top-left corner - the info menu is now opened with TAB. +- Changed default chat/radio keybinds to T and Y. +- Welding tools repair all the walls within the range of the raycast, not just the first wall the raycast hits. +Makes it easier to repair overlapping and multi-layered walls. +- Decreased the range of passive sonar - previously there was often no reason to use the active sonar because +the passive mode showed the area around the sub so clearly. +- Health scanner shows all active afflictions (not just those that are visible in the health interface). +Allows detecting afflictions at an earlier stage, making the item much more useful. +- Nerfed the structure damage done by Molochs and Crawlers. +- Reduced creature HP across the board. +- Increased the amount of minerals in levels. +- Increased flare burn time, making them more useful as path markers during exploration of ruins. +- RepairTool damage is configured using StatusEffects and Afflictions instead of the "limbfixamount" attribute +that always does burn damage. +- Made headsets craftable. +- Battery output doesn't start dropping until the charge is below 10%. +- Restrict the amount of power going through relay components to the MaxPower value of the relay. +- Set Humpback reactor output a bit higher, batteries now start at full charge and relays can't be overloaded. +- Miscellaneous fixes and balancing to vanilla subs. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.3 +--------------------------------------------------------------------------------------------------------- + +- Made molochs slower. +- Watchmen cannot be dragged or grabbed. +- AI characters can give treatment to characters who aren't unconscious. +- Added a button that dismisses the tutorial popups to prevent accidentally closing the popups. +- Underwater scooters now attract monsters. +- Improvements and balancing to vanilla submarines. +- Made alien ruin walls more durable. +- Reduced item deterioration speeds. +- Added "yes to all" and "no to all" buttons to the prompts when deleting containers in the submarine editor. +- Improved the background smoke texture in hydrothermal wastes. +- Baby moloch, doo doo doo doo doo doo + +- Fixed console errors in the chemical shipment mission due to auxiliorizine being still present in the +mission configuration despite the item being removed. +- Made coilgun ammunition boxes craftable and purchaseable, coilgun bolts cannot be purchased anymore. +- Fixed AI-controlled husk not spawning when a huskified player dies. +- Fixed AI crew occasionally going outside to fix leaks. +- Fixed server failing to sync clients who join the server after a character has been removed during +the round (e.g. eaten, turned into a husk). +- Fixed server-side console errors when clients attempt to use a fabricator. +- Display Steam authentication errors in the server logs. +- Fixed status effects with a ReduceAffliction value of 0 freezing the game. +- Fixed sliders not moving in the battery/supercapacitor interface when an AI character is operating it. +- Fixed chatbox being deselected in the net lobby when receiving a lobby update from the server (i.e. +whenever the server host changes any setting). +- Fixed OnBroken status effects firing in the submarine editor when an item's condition is set to zero +(for example, reactors exploding and breaking all the nearby walls). +- Fixed file number being added to the file extension of debug console log files ("file123.txt (2)" +instead of "file123 (2).txt"). +- Fixed battery positioning in charging docks. +- Fixed crashing when ending a single player round while a character is outside the sub. +- Fixed "attempting to remove an already removed item" console errors when ending a round. +- Fixed fire sounds persisting in menus. +- Fixed the layout of the extra cargo menu in server settings. +- Fixed depth charges disappearing from loaders when interacting them with both hand slots full. +- Fixed StatusEffects not being able to target item components. Caused doors to be impossible to weld +and most likely other issues with item StatusEffects as well. +- Artifacts spawn in artifact holders again. +- Fixes to "attempted to move pulljoint extremely far" errors which occasionally caused severe problems +in syncing characters' positions. +- Fixed a bug that occasionally caused monsters to spawn very close to the submarine in monster missions. +- Fixed servers occasionally starting the round multiple times when automatically starting the game via +autorestart or clients being ready. +- Fixed up-to-date content packages being reported as incompatible in the Steam workshop menu. +- Changed the default radio chat hotkey to T. +- Fixed the line of sight effect not working on ruins when looking at them from inside a sub. +- Fixed fabricator allowing new items to be created when the output is not empty, resulting in wasted materials. +- Fixed servers reporting incorrect player counts in the server list. +- Fixed order messages not being visible in single player if the character issuing the order has no headset. +- Fixed riot shields retaining their pushing ability even when the user is stunned or unconscious. +- Fixed rubber ducks not floating like a good duck should. +- Prevent locations from being generated too close to each other in the campaign map. +- Fixed battery and supercapacitor charges not staying in sync between the server and clients. +- Fixed watchmen imploding continuously if they end up outside. +- Fixed non-downloaded workshop items showing zero as the file size. +- Fixed spectate button staying disabled if starting a round fails (due to a missing sub file for example). +- Fixed crashing when teleporting characters from a submarine to ruins in multiplayer. +- Fixed automatic temperature control setting turbine output above 100 if the power consumption is higher +than what the reactor can generate. Caused "failed to write an event for the entity" errors in multiplayer. +- Fixed AI characters attempting to treat dead characters. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed "incorrect filename case" errors. +- Fixed crew UI occasionally overlapping with device interfaces (such as the "passive sonar" checkbox). +- Fixed second submarine overlapping with the outpost at the end of the level in combat missions. +- Steam query port can be automatically forwarded using UPnP if your router supports UPnP. +- Fixed water currents inside the sub occasionally being way too strong to break free from. +- Fixed rewards mentioned in the mission descriptions not matching the actual reward of the mission. +- Fixed "can't create an entity event for Hull - the entity has been removed" errors when removing hulls +with fires inside them. +- Fixed submarine/mode selection tickboxes in the server settings menu. +- Fixed crashing when attempting to select an item in Humpback's fabricator interface. +- Fixed crashing when attempting to use active sonar in the submarine editor. +- Fixed the husk appendage not appearing on huskified humans. +- Fixed order/report messages being flagged as spam way too easily, causing frequent spam kicks. +- Fixed sliders buttons being invisible while pressed in device interfaces. +- Fixed an item being spawned in the submarine editor when selecting an item from the menu while another +one is already selected. +- Fixed submarine colliders not taking into account the body offsets of the wall structures, causing +some items outside the submarine's walls to be impossible to interact with (the most noticeable being the +button that opens Orca's airlock from the outside). +- Added a small stun effect to railgun shells. +- Added a little extra fuel to vanilla subs. +- Slowed down item deterioration rates. +- Moved the position of turrets in Orca and Typhon to prevent players getting caught under them. +- Moved humpback's cargo spawn position a bit to prevent the cargo from falling down the hatch under it. +- Added better visual feedback when reactor is in poor condition. + +--------------------------------------------------------------------------------------------------------- +v0.8.9.1 (closed alpha) +--------------------------------------------------------------------------------------------------------- + +Too many changes to list here. :) We've been working on this update for a year now, with a team of about +a dozen people (as opposed to a couple of devs working on it on their free time). + +Almost every aspect of the game has been improved to some extent - some polished a bit, some went through +a more major overhaul and many things are completely new. + +This is by no means a complete list, but here's some of the new things: + +- A full graphics overhaul: almost all of the sprites has been polished or completely remade. +- Improved random event system that tries to keep the overall difficulty of the game at certain level, +delaying additional monster spawns if there's already lots of things going on, or spawning more when +there's a more quiet moment. +- Improved difficulty system: now the difficulty level has a much more noticeable effect on the gameplay. +- General difficulty balancing all across the board: we've tried to make the difficulty curve more approachable +to new players while still keeping things challenging for more experienced players on higher difficulty levels. +- More varied levels, environmental hazards. +- A new more detailed health system with things such as limb-specific injuries, addictions, overdoses, +mental issues... The system is also highly moddable, and makes it much easier to implement things such as +hunger mechanics, more varied poisons or stat-boosting items. +- Completely redesigned in-game HUD (the inventory, crew command interface, chat, etc). +- Redesigned crafting system. +- Minerals scattered across the level (can be used for crafting). +- A command/report system that can be used to communicate with your crew more effectively (in both single +player and multiplayer). +- Tons of additions to alien ruins (traps, puzzles, non-flooded rooms). +- Improved AI (both the crew AI and the enemy AIs). +- NPC dialog (including random chatter and context-specific lines that make it easier to keep track of +what the crew is doing). +- Most of the device interfaces have been redesigned to make them easier to use (and nicer to look at!). +- Many additions to the campaign mode (still a work in progress though). +- Overhauled the skill system: now every character can generally do anything (repair devices, fabricate +new items, apply medical treatments), but characters with higher skill levels will do things more efficiently. +- Skill progression in the campaign mode: characters' skills gradually increase, making them more valuable with +each completed round. +- New music composed specifically for the game. +- Overhauled audio. +- New monsters. +- New items (weapons, tools, medical items, alien items, crafting materials, etc). +- A completely remade tutorial. +- Too many bugfixes to count. +- Improved and much more stable ragdoll animations. +- Additional tools for modders (character editor, sprite editor, level editor, additions to the submarine editor). +- Steam functionality of course: full Workshop support, achievements, banning Steam IDs from servers... +- Improved translation support: it's possible to translate texts in item/job/etc configuration files without +breaking compatibility with existing subs or mods (see the EnglishVanilla file for some instructions). + +--------------------------------------------------------------------------------------------------------- +v0.8.2.3 +--------------------------------------------------------------------------------------------------------- + +- Clients can now join servers that have an IPv6 address. +- Added "unban" and "unbanip" commands. +- Fixed a bunch of bugs that were causing "attempted to apply an invalid force/impulse to a physics body" +errors. +- Fixed a bunch of bugs that were causing "attempted to move a pulljoint extremely far" errors. +- Fixed DebugConsole selecting non-command lines if up/down is pressed when there are no commands in the +console. +- Fixed inventory syncing not working on the controlled character's inventory if the character is +unconscious or wearing handcuffs. +- Verify that the launched exe belongs to the currently selected content package when starting up the game. +- Fixed console messages that have been created before initializing the debug console not being present +in crash logs. Made it difficult to diagnose crashes that occur immediately when the game starts. +- Additional error logging to diagnose SharpDX errors on startup. + +--------------------------------------------------------------------------------------------------------- +v0.8.2.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed clients not seeing explosions from items that explode on impact or when their condition reaches zero. +- Fixed conditionals being ignored on delayed status effects. +- Fixed clients staying in an unsynced state if they rejoin while their character is dead or unconscious, +causing the camera not to follow the character and preventing the player from giving up. +- Fixed LightComponent sprites and broken device sprites not being mirrored in mirrored subs. +- Fixed a few ragdoll animation bugs that caused "attempted to move pulljoint anchor extremely far" errors. +- Fixed AI characters (most often mantises) being able to attack through walls. +- Fixed alien ruins occasionally overlapping with each other or being above the upper boundary of the level. +- Docking ports automatically stretch the hulls between them to cover the area between the docked subs. +Otherwise there may be areas uncovered by hulls if the docking port is positioned slightly outside the +extents of the submarine's hulls, causing characters to implode or get thrown back when they try to pass +from sub to another. +- Fixed client-side docking ports creating duplicate bodies on doors, causing characters to collide with +an invisible door when trying to move between docked subs (until the server forces them through it). +- Fixed characters occasionally getting teleported outside the sub for a few frames when moving between +docked subs. +- Fixed status effects that deplete oxygen affecting characters that don't need air to breathe. +- More error logging to diagnose syncing errors. +- Melee weapons can only hit one character per swing (makes stun batons and medical syringes less OP). +- Option to make RegEx component only send a signal when it receives a signal (not continuously according +to the last received signal). +- Added FalseOutput property to RegEx components. + +--------------------------------------------------------------------------------------------------------- +v0.8.2.1 +--------------------------------------------------------------------------------------------------------- + +- Husks or huskified humans don't gain health by attacking corpses. +- Fixed dragged characters occasionally getting launched away at a high speed when moving from sub to +another. +- Fixed dragged characters staying floating mid-air after they've been dragged up/down ladders. +- Attempt to fix items occasionally dropping client-side when moving them from an inventory to another. +- Fixed incorrect rotation of welding tools and other 2-handed items that are held in one hand when not +aiming. The items were rotated according to the left hand, but positioned on the right hand. +- Spaces and exclamation marks are allowed in client names by default. +- Hitscan weapons like the revolver can hit targets outside the sub when firing from the inside and +vice versa. +- Fixed crashing when attempting to clone linked submarines in the sub editor. +- Fixed crashing when attempting to clone items with non-default required items. +- Fixed autopilot being unable to navigate to the destination in mirrored levels. +- Ragdolls can't be dragged through walls or other colliders. +- Dropped flashlights don't consume and battery and turn off automatically. +- Oxygenite tanks can be stored in cabinets. + +--------------------------------------------------------------------------------------------------------- +v0.8.2.0 +--------------------------------------------------------------------------------------------------------- + +Networking additions: + - Added a server setting for selecting which symbols are allowed in client names (see + AllowedClientNameChars in the server settings file). + - Custom servers can modify all editable item properties mid-round, not just in-game editable ones. + - Clients can be given access to server logs. + - Respawn durations can be changed mid-round. + - Servers have the option to disable the disguise feature. + - Increased midround syncing timeout. + +Misc changes: + - Levels are mirrored when travelling through the backwards in the campaign mode. + - Added colliders to railguns (so they cannot go through walls or enemy subs anymore). + - Melee weapons can hit multiple targets on one swing. Fixes weapons occasionally not hitting + the target in tight spaces due to touching the ceiling/walls first. + - The voltage required for a PowerTransfer item to take damage and the probability for a fire can be + configured in the item xmls. + - Docking ports and hatches aren't damaged by excess voltage. + - Added more color variants of wires. + - Characters point the harpoon gun down when not aiming. + - Added parameter autocompletion to the kill command. + - Added a property that can be used to lock connection panels but still keep the panel rewireable + in the submarine editor. + - Items outside the sub cannot be deattached from walls. + - Fabricators show the list of required items even if the character does not have the skills to craft + the item. + +Networking bugfixes: + - Fixed file transfers failing if the client disconnects during an active transfer, rejoins and + attempts to receive the same file. + - Fixed a bug in door syncing that caused the door states to differ between the server and clients + in some subs with more complex door wiring setups. + - Fixed clients being able to spam kick votes (duplicate votes were not counted but caused unnecessary + chat messages to be sent). + - Fixed item conditions occasionally not matching exactly between the server and clients, causing + issues such as not clients not being able to fabricate items due to the condition being slightly + below the minimum condition at their end. + +Bugfixes: + - Added a workaround to a MonoGame bug that makes the screen turn white when alt-tabbing out of fullscreen. + - Fixed docking ports flooding for no reason in some custom subs. + - Fixed LightComponents staying active on broken items. + - Fixed railguns and depth charge tubes being directly usable by characters (= they could be launched + simply by selecting them and left clicking, without the need to use a railgun controller). + - Fixed items salvaged from ruins not being saved in the campaign mode. + - Fixed LOS effect being brighter than the ambient light in some of the darker levels, causing + the player to see obstructed areas better than unobstructed ones. + - Fixed severed limbs staying disabled when a dismembered character is revived using console commands. + - Fixed characters holding non-aimable two-handed items such as railgun shells in one hand when aiming. + - Fixed stereo sounds not being loaded correctly. + - Fixed modified sprite colors not working correctly on worn items. + - Fixed modified maximum recharge speeds of PowerContainers resetting to the default value after + saving and reloading. + - Fixed handcuffed players being able to perform CPR and grab/drag bodies. + - Fixed diving suit's damage modifiers being bypassed if the character gets hit in the waist. + - Fixed clown costumes not hiding the torso of the wearer. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.12 +--------------------------------------------------------------------------------------------------------- + +- Fixed connectionpanel syncing (wires dropping client-side during rewiring). +- Characters stay alive for 30 seconds after a client disconnects, and if the client rejoins during that +time they regain control of the character. +- Changing the sprite color of an item also affects the color when the item is being worn. +- Cloned items keep the value of the "required items" field of the original item. +- Fixed crashes caused by gaps that are not connected to anything. +- Removed the unused and non-functional monitor item. +- Made medical and toxic cabinets waterproof (= potassium and other water-sensitive items inside them +are not affected by water). +- Fixed docking ports causing flooding in some custom subs. +- Fixed medical items with an immediate effect (such as calyxanide) not working when a player uses them +on themselves in multiplayer. +- Made calyxanide more effective and usable without a medical syringe. +- Fixed engines trying to apply infinite force to the submarine if MinVoltage is set to zero. +- Fixed levels resetting their mission to the previous one if the game is exited after completing a mission +without selecting the level first. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.11 +--------------------------------------------------------------------------------------------------------- + +Networking fixes: + - More error logging to diagnose "unknown object header" errors. + - Fixed output inventory of fabricators and deconstructors not being synced between clients. + - Fixed servers failing to write network events for wires with an excessive number of nodes, causing + clients to get kicked due to desync. + - Fixed client-side error messages when respawning without a respawn shuttle. + - Fixed some issues in inventory and connection panel syncing when joining mid-round. + - Fixed fabricated items always appearing to be in full condition client-side (e.g. oxygen tanks which + should be empty after being fabricated). + - Fixed attachable items dropping on the ground client-side when deattaching them (but still staying + in the inventory of the character detaching them). + - Fixed items occasionally dropping instead of being moved to another inventory client-side. + - The "traitorlist" command is usable by clients who have the permission to use it. + +Misc bugfixes: + - Fixed characters occasionally going inside/through obstacle when leaving a submarine that's right + next to another submarine or a level wall. + - More physics error checks and logging. + - Railgun controllers can be used over wifi components. + - Characters attach items to the walls at the position of their hand, not at the center of the body. + - Wifi components can't communicate with the enemy sub in combat missions. + - Fixed the previously selected location staying selected but start button staying disabled when + returning to the lobby screen in the single player campaign. Made it impossible to progress without + restarting if there were no other selectable locations. + - Fixed holdable components reverting their RequiredItems back to the prefab values during loading. + - Fixed wall-attached sections of a wire not rendering when the item is being rewired outside the sub. + - Fixed artifacts occasionally spawning under the sea floor. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.10 +--------------------------------------------------------------------------------------------------------- + +- Fixed bugs in wall hole creation logic and docking port syncing which caused entity ID mismatches and +"unknown object header" errors. +- Fixed errors when attempting to buy too many items of a given type to fit in one container. +- Fixed crashing when attempting to buy items that don't spawn in a container. +- Fixed crashing when attempting to generate hulls with the "autohull" command when there are no walls +or doors in the sub. +- Fixed docking ports creating duplicate hulls and gaps during loading. +- Fixed missions resetting to the initial ones when loading a campaign. +- Increased revolver ammo capacity. +- Fires can break oxygen generators. +- Oxygenite tanks can be contained in plasma cutters and oxygen generators. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.9 +--------------------------------------------------------------------------------------------------------- + +- Fixed a bug in docking port syncing that caused entity ID mismatches and "unknown object header" errors. +- Fixed a bug that occasionally caused entity ID mismatches and "unknown object header" errors when +a respawn shuttle got damaged before returning back to the starting location. +- Fixed error messages when attempting to use the console commands "\" or "\n". +- Fixed clients not syncing the position of their controlled character with the server when dead/unconscious. +- Fixed swimming ragdolls "dropping down" if the server freezes them due to a connection error. +- Fixed excessive "attempted to apply invalid velocity to a physics body" console errors. +- Fixed crashing when selecting a level seed that has no background portrait defined. +- Fixed crashing if the player clicks yes on the "download sub from the server" prompt after +returning to the main menu. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.8 +--------------------------------------------------------------------------------------------------------- + +- Fixed "invalid cursor position" errors when a client attempts to use console commands in the server lobby. +- Fixed crashing if a character takes damage during the first frame of a round. +- Fixed crashing if suitable prop items are not found when generating alien ruins. +- Some ragdoll and physics optimization. +- More automatic error logging to help with debugging. +- Fixed errors when attempting to change the output type of an oscillator in multiplayer. +- Campaign store menu includes a quantity field which lets the player select how many items to buy instead +of showing each item individually. +- Fixed clients not seeing vote counts on submarines that the client doesn't have. +- Fixed crashing if a player attempts to use an item on themselves and the item has a status effect that +causes the item to be removed. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.7 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashes when trying to load submarines in the sub editor. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.6 +--------------------------------------------------------------------------------------------------------- + +- Fixed a memory leak in submarine preview images which caused crashes in the server lobby screen and +submarine editor. +- Fixed clients not seeing the "vote to end the round" tickbox if they don't have a character assigned to +them (despite the server allowing voting if the client has had a character earlier during the round). +- Fixed clients being able to crash servers if they had the permission to use console commands that +use the position of the client's cursor. +- Fixed crashing if a wire is used by a statuseffect (for example if a detonator tries to trigger a wire +contained inside it). +- Fixed GameAnalytics being stopped if the dedicated server is restarted with the "restart" console command.- +- Fixed wiring items outside the submarine. +- Fixed chatbox discarding the second chat message instead of the first one when the maximum number of +chat messages is reached. +- Some error checking and debug logging to diagnose and prevent a crash caused by doors pushing characters away. +- The spawnitem command doesn't require multi-word item names to be surrounded with quotes anymore. +- Added the option to make powered items immune to electromagnetic pulses. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.5 +--------------------------------------------------------------------------------------------------------- + +- Added the option to automatically send crash reports and anonymous usage statistics to the developers. +The usage statistics include information such as the selected game mode, selected submarine, causes of +death and mission outcomes. When the game is started for the first time, a message box prompts you to +select whether you want to send the information or not. +- Fixed a bug that caused clients to get desynced when purchasing items in the multiplayer campaign. +- Added a signal component that adds the received signals together. +- Devices outside the submarine can be rewired in-game (not just in the sub editor). +- Fixed a crash caused by vision obstruction logic. +- Fixed clients being unable to give non-permanent or range bans. +- Clients are allowed to vote to end the round if they have spawned at some point during the round, +even if the character they controlled doesn't exist anymore. +- Dedicated servers can give clients the permission to use console commands that aren't available in +for dedicated server (e.g. los, lights, control) +- Banip, banid and kickid commands can be used by clients now (if they have the permission to do so). +- Spawnitem [item] inventory, ragdoll and kill commands target the character of the client using +the command instead of the host's character. +- Spawnitem can be used to spawn items in the inventory of a specific character. +- Fixed explosions with an EMP value only damaging reactors (when they should only ignore reactors). +- Fire can only explode oxygen tanks that are >25% full (otherwise the condition of the tank just drops +to 0). Prevents infinite explosions when an oxygen generator is on fire with oxygen tanks inside. +- Fixed projectiles with a damage range of 0 not applying their structuredamage value to structures. +- Items with a physics body can be used as pumps, so now it's possible to make portable items that remove +water from inside the sub. +- Fixed traitor ratio setting being ignored and the minimum number of traitors being 2. +- Fixed crashes caused by custom characters with no AI configuration. +- Character head and gender settings are saved. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.4 +--------------------------------------------------------------------------------------------------------- + +- Fixed clients getting assigned random jobs regardless of job preferences. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.3 +--------------------------------------------------------------------------------------------------------- + +- Fixed server-side crashes during job assignment if a client hasn't sent any job preferences. +- Fixed crashing if the selected respawn shuttle doesn't have a navigation terminal or any other item +with a Steering component. +- Fixed InWater status effects triggering when an item is fabricated, causing issues such as +water-sensitive items to breaking/exploding immediately after being fabricated. +- Fixed motion sensors sending out signals even if the output is set to nothing. +- Fixed crashing when a round starts if the sub has been saved while a fabricator was running. +- Fixed explosives not detonating inside railgun shells. +- Fixed characters spawning inside the respawn shuttle if no suitable spawnpoint is found inside the +main submarine. +- Fixed a timing bug in the dedicated server which prevented clients from ever timing out, AI characters +from fixing leaks and reactor usage from being logged. +- Changed the format of the server log filenames to make them more easily sortable. +- Increased assistant's skill levels. +- Added oxygenite tanks. +- Added a rearward facing variant of railgun controller. +- Added railgun loader variants with 1 shell capacity. +- Added railgun shell rack. +- Decreased the skill level requirements for fixing docking ports. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed medicines not having an effect when injected with a medical syringe. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed explosives going off when a character holds them in their hand and left clicks, causing a crash +if done in the submarine editor. + +--------------------------------------------------------------------------------------------------------- +v0.8.1.0 +--------------------------------------------------------------------------------------------------------- + +Items: + - Added searchlights. + - Explosives, chemicals and medical items disappear when their condition falls to 0 + (i.e. when they're fully used). + - Railguns cannot be fired when not being aimed. + - Removed the need for batteries in diving suits. The light stays on as long as the suit is worn + by a living character. + - Junction boxes only take damage underwater when they're powered up. + +Bugfixes: + - Fixed a bug that occasionally caused some characters to not be removed at the end of a round, causing + various bugs and crashes on successive rounds (the most common ones being server-side crashes and + constant "attempted to access a potentially removed ragdoll" console errors). + - Fixed camera shake continuing indefinitely if a character falls unconscious due to impact damage. + - Fixed item removal by right clicking not being synced with clients. + - Fixed being able to gain karma by welding fixed walls. + - Fixed crashing caused by IndoorSteeringManager. + - Fixed all loose items disappearing from respawn subs between respawns. + - Fixed items in cloned/copypasted inventories not being saved. + - Option to edit structure texture scales and offsets. + - Fixed new log messages appearing in the server log even if the type of message has been filtered out. + - Fixed the EndRound music clip occasionally looping forever after a round ends. + - Fixed player-controlled creatures being able to damage themselves. + - Fixed repair tools causing damage to the user regardless of the character's skills. + - Attempt to fix characters occasionally getting launched out of the sub at lightspeed when the sub + crashes into something. + - Fixed StatusEffects not working on child ItemComponents. + - Wearables apply OnWearing StatusEffects in all the components of an item, not just the Wearable component. + - Fixed Equals/NotEquals conditional comparisons. + +Misc additions: + - Added console commands for giving the clients ranks, showing their current permissions and + giving/revoking the permission to use specific console commands. + - Option to set an automatic ban duration for vote kicked players. + - Option to log debug console output into a text file. + - Ladders can be climbed by holding up/down while standing next to them without having to select them first. + - Name tags and healthbars are clamped inside the room a character is inside. + +--------------------------------------------------------------------------------------------------------- +v0.8.0.5 +--------------------------------------------------------------------------------------------------------- + +- Optimized (and less glitchy) line of sight effect. +- Some lighting optimization. +- Added a light to diving suits. +- Attempting to equip an item by double-clicking when another item is already equipped swaps them. +- Syringes are recolored according to the color of the medical item inside them. +- Added a console command for changing the server password. +- Bunch of fixes to relay component logic. +- Fixed a bug in the entity event system that caused "trying to read past buffer size" errors and desync +when entities were removed mid-round. +- Fixed clients getting desynced if the server ends a campaign and starts a new one. +- Fixed the "campaign view" button staying visible in the server lobby after the campaign has ended. +- Fixed message boxes appearing behind the campaign setup menu in the server lobby. +- Fixed round summaries always showing the game over text in multiplayer if the submarine didn't progress +to the next location. +- Fixed missing spark particles when welding/cutting a wall. +- Fixed plasma cutters not affecting hatches, alien doors or duct blocks. +- Fixed welders and cutters not doing damage to characters if the flame hits the collider of the character +instead of a limb. +- Fixed diving mask, headsets and other headgear being rendered in front of diving suits. +- Fixed crashing when attempting to perform CPR on a headless character or AS a headless character. +- Fixed attachable items being deattachable with the select key instead of the use key. +- Fixed clients being unable to open doors with crowbars. +- Fixed items attached mid-round by other clients or the host being impossible to interact with +and occasionally being attached to an incorrect position. +- Fixed batteries not getting recharged in charging docks. +- Fixed monsters being able to spawn under the ocean floor in levels where the floor is high up. +- Fixed effects of the medical items not being stackable, meaning that successive usages of a medicine +did not have an effect until the effect of the first dose has worn off. +- Fixed items in itemcontainers (e.g. shells in railgun loaders, batteries in recharging docks) always +being rendered with the default sprite color. +- Fixed crashing when clicking the "refreshing server list" text in the server list menu. +- Fixed dedicated servers not resetting votes when a round ends. +- Fixed interaction areas of some items being incorrect in the dedicated server. +- Fixed the removal of items that get deleted after being used not being synced. +- Ladder waypoint generation fix: waypoints are not just placed at the top and bottom of the ladders, +but above every platform along the ladders (-> waypoints work correctly on ladders spanning through +multiple floors). + +--------------------------------------------------------------------------------------------------------- +v0.8.0.4 +--------------------------------------------------------------------------------------------------------- + +- Fixed "an item with the same key has already been added" exceptions when trying to start a server. + +--------------------------------------------------------------------------------------------------------- +v0.8.0.3 +--------------------------------------------------------------------------------------------------------- + +- Another attempt to fix relay components: it should be now possible to use relays in series and pass +power to junction boxes through relays. +- Fixed creature disabling in server settings only taking character config files in the Content/Character +folder into account. +- Added ruin structure, particle and decal configuration files to content packages. + +--------------------------------------------------------------------------------------------------------- +v0.8.0.2 +--------------------------------------------------------------------------------------------------------- + +- Doors can be opened with crowbars again. +- Improved fire extinguisher aiming logic which makes it much easier to put out fires. +- Fixed relays burning out when connected to a power grid that carries more power the relay can transfer. +- Fixed crashing when trying to store jumpsuits in themselves. +- Fixed "Text FabricatorRequiredCondition not found" errors when attempting to fabricate specific items. +- Fixed Linux and Windows builds calculating different MD5 hashes for the same content packages. +- Sound configuration files are included in content packages. +- Fixed "file not found" errors when a character is wearing footwear with no configured footstep sounds. +- MODDERS PLEASE NOTE: hit sounds on limbs and wearable items must now use tags instead of direct paths +to the sound file. New sound files and tags can be added by editing the sound configuration files. + +--------------------------------------------------------------------------------------------------------- +v0.8.0.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed crashing when creating items with a PowerTransfer component mid-round (e.g. when fabricating +a relay component) +- Fixed dead/spectator chatting in multiplayer. +- Chatboxes can be deselected with the chat hotkey again. +- Fixed railgun shells not detonating their contents on impact. +- Fixed clients failing to start a new round after downloading a missing submarine file from the server. +- Fixed ruin doors and hatches being possible to open with the select key. +- Unequipped headsets can't be used and don't consume batteries. +- Fixed depth charge tubes launching the depth charges up by default. +- Fixed some pre-placed items not appearing in mirrored subs in the combat missions. +- Fixed text overflows in round summaries with large amounts of text. +- Fixed crashing when attempting to save settings before player name has been set in the server list menu. + +--------------------------------------------------------------------------------------------------------- +v0.8.0.0 +--------------------------------------------------------------------------------------------------------- + +- Made ambient lighting much darker and added a subtle glow around the player. +- Made partially damaged walls leak much more slowly. +- Nerfed wall damage. Crawlers, mantises, threshers and coelanths now take much more time to tear through +the hull and collisions with the level cause less damage. +- Moved a bunch of hard-coded texts to an xml file "Content/Texts.xml". Full translation support is still +in progress, but now it should be possible to translate most of the in-game texts without recompiling the game. +- Optimized rendering. +- More accurate endworm attack hit detection. +- Players can only see the names of characters that are in their field of view. +- Fixed submarines bouncing off monsters and other submarines that are laying against the ocean floor. +- Characters can be crushed between submarines and ice walls. +- Item names can be changed without breaking everything as long as the original name is included as an +alias of the item. +- Console command arguments can be autocompleted by hitting tab. +- Added a console command for automatic hull generation. +- Added a console command for killing a character. +- FPS counter can be enabled separately from DebugDraw. +- Option to display lighting in the submarine editor. +- Added a submarine preview window that displays a preview image and some extra information of the subs. +- Option to configure which content packages a submarine is compatible with. +- Names and health bars fade out when the cursor is not being hovered near the character. +- Added spark and smoke particle effects when welding or cutting something. +- Welding or cutting a door displays its health. +- Added a button for forcing the controlled character into ragdoll mode. +- Option to grab onto the torso of a dead/unconscious character. +- Dead/unconscious characters can be dragged up ladders. +- Improved CPR animations. +- Doing CPR on bleeding characters causes them to take damage. +- Characters can fall through holes in floors. +- Players can pick up corpses and eat them when controlling a monster. +- Husks don't attack huskified humans. +- Characters with severed limbs cannot be resurrected as a husk. +- The humanhusk.xml config file is found based on the name instead of the file path, making it possible +to use a custom config file without modifying the original one. +- More footstep sound variety. +- More gore particles! +- Added a conditional system to status effects. Allows creating status effects that only have an effect +when a specific condition is met (e.g. health above a specific level, charge of an item high enough). +- Option to prevent status effects from stacking. +- Option to make status effects cancel other status effects. + +Items: + - Added syringe guns and a bunch of new chemicals. + - Added ducts, switches and motion detectors. + - Added crowbars (can be used to open locked doors). + - Chemicals and explosives can be thrown. + - Made more items craftable and deconstructable. + - Added sprites for broken doors, hatches and junction boxes. + - Health Scanner HUD displays causes of death. + - Health Scanner HUD only shows the status of the visible character that the cursor is closest to + prevent multiple characters from cluttering the screen + - Added "smallitem" tag to revolver rounds (can be placed in cabinets and pockets now). + - Option to determine which types of targets a projectile can stick to. + - Improved revolver hitscan logic. + - Item descriptions can be changed in the submarine editor. + - Characters can hold flashlights in their mouths. + - Added an inventory slot for ID cards. + - If a character is wearing an item that obscures their face, the game will either hide their name or + show the name that's in the ID card the character is wearing. + - The owner of an ID card is stated in the description of the card. + - Fabricating items requires the ingredients to have a specific minimum condition (can't use + already-used consumables to craft something). + - Deconstructing an item that's not in a full condition may prevent some deconstruction products from appearing. + - Optimized electricity/signal logic. + - Grenades can be triggered by detonators. + - Bought cargo spawns in containers instead of being scattered across the floor. + - Players can't use other items when a railgun controller is selected. Prevents accidentally firing + weapons or hitting people with something while using the railguns. + - Item editing menus display color values as 0-255 instead of 0-1. + - Reactor temperature has to be critical for 30 seconds before the reactor explodes, giving the crew + more time to deal with griefers or incompetent reactor operators. The reactors also have an output + connection that sends out a signal when the temperature is critical. + +Multiplayer additions: + - Added an optional "karma system". Harming other players, damaging structures and blowing up the reactor + reduces karma, while repairing things causes it to increase. A too low karma level prevents the players + from choosing specific jobs + - Clients can be given permission to use specific console commands. + - Client permission presets: the clients can be assigned as moderators or admins which have specific + pre-configured permissions. New presets can be added by editing Data/permissionpresets.xml. + - Option to have more than one traitor. Traitors also now get a set of code words that can be used to + secretly identify other traitors. + - Added an option to make players spawn directly in the main submarine instead of the respawn shuttle. + - Keybinds are disabled when the chatbox is active. Now it's possible to use normal letter/number keys + as the chat hotkey without accidentally deselecting the chatbox by typing a message. + - Chat hotkey can also be used in the server lobby. + - Added a [PM] tag to private chat messages. + - Fixed game over/round end music not playing when a round ends. + - Cutting and repairing walls is included in server logs. + +Multiplayer bugfixes: + - Fixed clients getting disconnected due to desync when a new monster is spawned mid-round by + a repeating monster event. + - Fixed modified clients being able to chat while unconscious due to the lack of server-side checks. + - Fixed modified clients being able to disconnect locked wires due to the lack of server-side checks. + - Fixed chat messages being assigned to the wrong sender when their bodies have been eaten. + - Fixed crashing when setting a server filter while the game is refreshing the server list. + - Fixed wires not being dropped server-side when a player drops a connected wire without dragging it + to their inventory first. + - Fixed 5th server being impossible to select in the server list. + - Improvements to character position syncing. + - Re-enabled logic for preventing players from using visually similar names. + - Fixed client-side null exception when the client is in the lobby and a round ends with the mission + successfully completed. + - Fixed clients being able to votekick/kick/ban themselves in the server lobby. + - Fixed "selected mode" and "mission type" settings not being saved. + - Level seed randomization can be toggled on and off via the debug console. + - Fixed dedicated server not randomizing the submarine or game mode even if randomization is enabled. + - Lighting is forced back on when a client starts a round (-> can't disable lighting by using the + console command before joining a server). + +Bugfixes: + - Fixed wire connections being lost when copy-pasting in the submarine editor. + - Fixed wire nodes being impossible to select in the wiring mode if the nodes are exactly at the same position. + - Fixed artifact holders being occasionally placed inside ruin doors and hatches. + - Fixed particles in water being drawn under ruin structures, making it seem as if plasma cutters and + welders weren't working. + - Fixed all ruin structures having a health of 100. + - Fixed OnActive status effects not being applied on powered items that don't require any power. + - Fixed damage modifiers being applied multiple times when wearing an item that takes up multiple slots. + Meaning that items such as the diving suit gave the players an excessive protection against damage. + - Messagebox overflow fixes. + - Fixed status effects not being able to decrease stun timers. + - Fixed anti-husk medicine being able to reduce husk infection state after the infection has reached + the active state. + - Fixed monsters being able to spawn right next to the spawnpoint of the sub. + - Fixed hulls not being linked to gaps if the center of the gap is exactly at the edge of the adjacent + hulls. + - Miscellaneous crew AI fixes. + - Fixes to fast projectiles going through walls. + - Fixed structure damage sounds not being played when a structure is fully destroyed. + - Fixed glass windows using wrong sound effects. + - Fixed carrier's light falling off when it dies. + - Fixed incorrect positioning of debug console question prompts. + - Fixed being able to use a wrench on multiple items at the same time. + - Fixed double-clicking items in corpses putting them in their hands instead of your own inventory. + - Fixed some level seeds generating a tiny enclosed cave that makes it impossible to reach the destination. + - Fixed opened and broken doors being ignored during waypoint generation, causing waypoint connections + to go through doors which prevented AI characters from opening them. + - Fixed modified structure colors not being cloned. + - Fixed modified wall colors only being visible in the submarine editor. + - Fixed items being dropped when attempting to place them in an itemcontainer slot that's on a normal + inventory slot. + - Fixed stack overflow exceptions caused by signal loops between junction boxes. + - Fixed submarine editor crashing when attempting to use illegal characters in the filename. + - Mouse clicks have to be <10 pixels apart to be considered a double click. + - Fixed subinventory slots going outside the screen when highlighting an item such as a metal crate. + - All creatures all cleared from the tutorial level to prevent any unintended monster attacks. + - Fixed "constructing final path failed" pathfinding errors. + - Fixed particles going through closed gaps (e.g. closed doors). + - Fixed submarines being able to enter ruins. + - Fixed collisions between a sub and the ruins not causing any damage to either the sub or the ruins. + - Whitespace is ignored when calculating MD5 hashes for files. + +--------------------------------------------------------------------------------------------------------- +v0.7.0.1 +--------------------------------------------------------------------------------------------------------- + +- Added console commands for modifying client permissions. +- Fixed content package setting not being saved in the settings menu. +- Item pickup sounds are only played when the controlled character picks up an item. +- Removed serverconfig.xml (the dedicated server now uses the same config file as the normal game). +- Updated the vanilla content package to version 0.7. +- Fixed entity linking in the submarine editor. +- Fixed railgun HUD crashing the game if the railgun is linked to an item that does not have an +ItemContainer component (i.e. any item that can't contain other items). +- Fixed exceptions when the player dies in the tutorial. +- Fixed the start popup saying the host is the target if the host has been selected as the traitor. +- Fixed crashes when attempting to use a railgun controller that's not connected to anything. +- Fixed autorestart counter overlapping with the campaign map in the server lobby screen. +- Fixed characters receiving damage almost exclusively to their feet when wearing a diving suit. +- Armoring reduces damage by a certain percentage, not a fixed value. Now armor doesn't make characters +invulnerable to small amounts of damage. +- The effectiveness of different types of armor depends on the type of damage. For example, diving suits +provide fairly good protection against burn and slash damage, but aren't as affective against blunt damage. +- Fixed light sources attached to limbs not rotating with the limbs. + +--------------------------------------------------------------------------------------------------------- +v0.7.0.0 +--------------------------------------------------------------------------------------------------------- + +- Multiplayer campaign mode! + +Level changes: + - Added ocean floors and hydrothermal vents. + - The commonness of scripted events (monster and artifact spawns) varies between different level types - + some monsters and artifacts now only spawn in specific types of levels. + - Bunch of new level types. + - Level wall color can be changed in level generation parameters. + - Small caves/tunnels are more common now, and groups of monsters can spawn inside them. + - Added salvage mission variants where the artifact is spawned inside a cave. + +Submarine editor: + - Entities can be nudged with arrow keys. + - Structure sprite colors can be changed. + +Particles: + - Particles that are outside the sub don't get rendered inside the sub even if they're overlapping with it. + - The emission rate of particle emitters can be set as particles per second (instead of particles per frame). + - Minor particle optimizations. + +Bugfixes: + - Fixed the "DXGI_ERROR_DEVICE_REMOVED" crashes on specific GPUs when the loading reaches 80%. + - Fixed crashes when projectiles stuck to items on dedicated server. + - Fixed a bunch of bugs that caused crashes when a character was removed mid-round (for example when + a character turns into a husk). + - Fixed a bug that occasionally caused swimming creatures to flip around constantly. + - Fixed a bug that caused creatures to be able to sever limb joints that shouldn't be possible to sever, + causing issues when attempting to sync the positions of the dead bodies. + - Fixed vote count texts persisting in the server lobby after the host disables voting. + - Fixed newly joined clients not receiving the latest voting status until someone votes for something. + - Fixed vote count texts not being updated after a client disconnects and their vote is removed. + - Fixed errors when attempting to save server logs with illegal characters in the server name. + - Fixed AI characters becoming invincible when far enough from the main submarine in multiplayer. + - Fixed AI characters never making any sounds in multiplayer. + - Fixed inability to rebind keys to Mouse2 via the settings menu. + - Fixed destroyed doors being impossible to repair. + - Fixed creatures seeking towards an incorrect position when trying to eat something (causing larger + creatures like threshers and coelanths to swim around the target without ever reaching it). + +Items: + - Added battery recharge docks. + - Added revolvers (the captain always spawns with one). + - Added oscillators (a signal item that sends out a periodic pulse, a sine wave or a square wave). + - Added "state_out" connections to relay components. + - Added sprites for destroyed doors/hatches. + - Added a HUD that shows the charge of the supercapacitors and the amount of shells left when using + a railgun. + - Inventory slots are be highlighted even if the cursor is within the empty space between them. Now + items can't be accidentally dropped by releasing the mouse button between the slots. + - Sounds for picking up and dropping items. + - Medical scanner displays husk infections. + - New C4, detonator and grenade sprites. + - Optimizations and minor visual changes to the sonar display. + - Support for hitscan projectiles. + - Fixed ranged weapons launching projectiles with an incorrect rotation. + - The spread of ranged weapons can be adjusted (separate values for normal spread and spread when + the item is being used by a character with an inadequate skill level). + - Heavier harpoon gun recoil and impulse when the spear hits something. + +- Improved item editing UI: + - Number input fields for numeric values. + - Separate number input fields for the components of vector values (instead of one text input box) + - Color input fields display a preview of the currently selected color. + - Enum fields are displayed as dropdown menus. + +Misc: + - Flowing water pushes characters around much more heavily. + - Warning texts when water pressure is increasing to dangerous levels and when running out of oxygen. + - Made the damage range of limb attacks configurable (instead of having it always be half of the distance + at which the attack activates) and tweaked the damage ranges of all the creature attacks. + - Option to filter the server list based on a bunch of criteria. + - Added a radio chat hotkey. + - Clients can be given a permission the select the submarine or the game mode. + - Option for clients to spactate the game without respawning (assuming the server allows spectating). + - The range and volume of sounds emitted by StatusEffects can be changed and the sounds can be looped. + +--------------------------------------------------------------------------------------------------------- +v0.6.1.4 +--------------------------------------------------------------------------------------------------------- + +- Plasma cutters can cut alien ruins again. +- Fixed reactors staying operational after the fuel rods run out. +- Fixed spawning items at the cursor via the debug console. +- Fixed job assignment logic causing crashes if the maximum amount of players per job has been reached +on the top 3 preferences of a client (which can happen on modded servers that have several jobs with a +player limit). +- Fixed errors during job assignment if a client or the host is controlling a non-human character. +- The server log menu remembers the state of the filters when toggling it. +- Fixed level generation errors in some specific seeds that caused the game to create ruin walls with +a negative width/height (example seed: cBLgZ2im). +- Fixed a submarine position syncing issue that caused erratic physics behavior on some specific +multi-part subs, because the game only moved one part of the sub and the parts docked to it, not taking +into account that more parts may be docked to the docked parts. +- Handcuffed AI characters can't climb ladders. +- Fixed crashing when a huskified human is killed by an explosion. +- Added some GPU info to the crash reports and extra debug logging to hopefully diagnose the +SharpDXExceptions during startup. + +--------------------------------------------------------------------------------------------------------- +v0.6.1.3 +--------------------------------------------------------------------------------------------------------- + +- Fixed hulls not being rendered in the submarine editor. +- Crouching is synced between the server and the clients. +- Plasma cutters and welding tools ignore platforms and stairs - placing a platform on a wall doesn't +prevent welding/cutting the wall anymore. +- Using the SetClientCharacter console command forces the client's line of sight effect back on. +- Fixed null reference exceptions when syncing docking ports that haven't been docked to anything. +- Fixed invisible diving suits in some of the respawn shuttles (specifically ones where the suits spawn +directly on the floor). + +--------------------------------------------------------------------------------------------------------- +v0.6.1.2 +--------------------------------------------------------------------------------------------------------- + +- Dedicated servers can use autorestart. +- Fixed dedicated servers ignoring armor. +- Fixed console messages not appearing in the crash reports if the game crashes during loading. +- Attachable items (buttons, electrical components, etc) are automatically attached to walls when placed +in the submarine editor. +- Fixed crashing if no matching character is found when using the SetClientCharacter console command. +- Fixed wires disconnecting from a connection panel when a player moves any of the wires. +- Tab doesn't autoselect the chatbox when the debug console is open. +- Fixed missing kick/ban buttons in the crew menu. +- Fixed a bug that caused ID mismatches in the hulls between docking ports. This caused, for example, +mysterious client-side fires around docking ports and "unknown object header" errors. + +--------------------------------------------------------------------------------------------------------- +v0.6.1.1 +--------------------------------------------------------------------------------------------------------- + +- Fixed diving suits and masks not providing enough oxygen when in a low-oxygen room or outside the submarine. +- Fixed message boxes being impossible to close in the launcher. + +--------------------------------------------------------------------------------------------------------- +v0.6.1.0 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - Dedicated server application. + - Option to supply a reason for banning/kicking a client. + - Option to set a duration for bans. + - Respawning characters get ID card tags for both the shuttle and the main submarine, i.e. they are + able to open shuttle doors that require a specific clearence. + - Clients now get back control of their character if the server revives them using the debug commands. + - Added a console command for changing the character a client is controlling. + - Job preferences don't reset when quitting the game. + - Added MessageBox chat message type. Allows custom servers to display custom message boxes to the clients. + - Logging when a character throws an item. + - Logging which items are contained inside items characters use on themselves (e.g. which meds are + inside a medical syringe). + - Logging which type of projectile was launched from a railgun and which items were contained inside it. + - More descriptive wiring logging: the logs don't list all the wires in a connection panel but only + the changes players do to the wiring. + +Monsters: + - Some creatures can hunt for smaller creatures (including humans) and eat them. + - Tweaked enemy AI to make their attacks less likely to miss. + - Some creatures flee when their health decreases below a specific threshold. + - Crawlers and mantises can attach to ice walls to "ambush" their prey. + - Enemies don't always move at a fixed speed, now they move faster when attacking or fleeing. + - Shooting watchers with a ranged weapon makes them attack. + - Split tiger thresher's and charybdis' bodies into more parts to make them a bit more agile. + - Option to make monster events spawn more monsters when previous ones are killed. + - The camera zooms further out when controlling a large non-humanoid character. + +Misc: + - Improved item interaction logic: highlighting items is more precise, with items directly under + the cursor taking priority. + - Characters can be dismembered by creatures and explosions. + - New blood particles. + - Blood, explosion and fire decals. + - Added an artifact that attracts creatures. + - Detached buttons and electrical components can be picked up just like any other item, instead of + having to use a wrench and wait for the item to "detach". + - Wires can't be connected to detached items. + - Debug commands can be autocompleted using tab. + - Added a debug command for creating explosions. + +Bugfixes: + - Fixed "loading was interrupted due to an error" crashes on startup. + - Fixed "destination array was not long enough" errors in AddToGUIUpdateList. + - Fixed error messages when a character gets stunned for over 60 seconds in multiplayer. + - Characters don't consume oxygen from rooms when wearing a diving mask or a diving suit. + - Fixed occasionally seeing through walls when swimming outside a submarine. + - Fixed crashes during map generation caused by very large wall cells near the entrance of the level. + - When highlighting a wire in a connection panel, the physical wire and the items connected to it are + highlighted. + - Fixed crashing when selecting a sonar monitor in a submarine with no hulls. + - Fixed submarine/shuttle lists occasionally appearing empty after joining a server. + - Fixed "received a position update for an item with no physics body" errors caused by detaching buttons + or other electrical components from the walls. + - Fixed a bug that caused characters to aim slightly off at the server's side when using a ranged weapon + or other aimable item. + +--------------------------------------------------------------------------------------------------------- +v0.6.0.2 +--------------------------------------------------------------------------------------------------------- + +- Fixed "maximum packet size exceeded" errors when clients join servers. +- Fixed a bug that caused non-interactable checkboxes to always appear unchecked. +- Skill level syncing fix: the syncing isn't dependent on the order of the characters skills anymore. +- IP addresses are included in all login error messages and the errors are also logged to the debug console. +- Servers end rounds if all players are either dead or unconscious when autorestart is on (instead of +waiting for all players to die) +- Fixed nuclear shells and depth charges exploding immediately when launched. +- Fixed a bug that prevented any broken items from being repaired in the single player. +- Fixed items disappearing from inside copypasted items (e.g. cabinets). +- Added character teleporting console command. + +--------------------------------------------------------------------------------------------------------- +v0.6.0.1 +--------------------------------------------------------------------------------------------------------- + +- Readded spam filter. +- Servers log the automatic temperature control setting of nuclear reactors. +- If a client fails to start a round (due to a missing sub file or an error, for example), their character +is automatically killed. This prevents situations where a team can't win a combat mission due to a +disabled, invisible character in the opposing team. +- Fixed clients occasionally displaying the "crew has been defeated" message immediately after a combat +mission starts. +- Fixed a bunch of bugs in the job assignment logic. +- Fixed errors if attempting to send radio messages without a radio in the inventory. +- Fixed "component doesn't have a GUIFrame component" errors when selecting an artifact holder. +- Disabled unnecessary server-side message ID logging. +- Option to enable additional network debug logging by enabling verbose logging in config.xml. + +--------------------------------------------------------------------------------------------------------- +v0.6.0.0 +--------------------------------------------------------------------------------------------------------- + +Rewritten networking code: + - much more robust syncing logic + - proper authoritative servers (i.e. much more more hack-proof) + - the server can transfer multiple files to a client simultaneously + - having multiple submarines with the same name (but different MD5 hash) in the submarine folder + doesn't prevent clients from loading the correct one + - server logs can be viewed in the server lobby, not just in-game + - logs can be filtered by message type + - door, docking port and railgun usage are logged + - the in-game log view isn't cleared when the log is written to a file + - character skill levels are synced + - clients can't vote multiple times by disconnecting and reconnecting + +UI: + - new UI graphics + - smoothly scrolling listboxes + - multi-line chat messages don't overlap + +Items: + - passive sonar: when not active, the sonar shows nearby sources of sound and a faint outline of the + structures around them. Now it's much easier to monitor how much noise the submarine is making and to + hide from enemies. + - new sonar visuals + - texts in labels can be resized + - alien weapons can be used as railgun ammo + - nerfed oxygen and welding fuel tank explosions + - buttons created in fabricators work now + +Submarine editor: + - items/structures that have been copy-pasted from another submarine don't disappear when saving and + loading the sub + - fixed crashes when attempting to load a submarine with no walls + - placing a resizable structure with a height/width of zero is not allowed + - "are you sure" prompt when trying to delete subs + - open menus are closed when opening another one (e.g. the save dialog box is automatically closed if + the item selection menu is opened) + - fixed crashes when switching to character or wiring mode after copypasting waypoints + +Misc: + - background ice formations with a parallax effect + - the level generation algorithm doesn't place walls behind alien ruins + - improved fire and smoke particles + - water puts out fires more slowly + - explosion damage is reduced if there are walls or other solid obstacles between and explosion and a character + - heal and revive commands can also be used on other characters than the controlled one + - fixed fires occasionally causing incorrect sound clips to loop continuously + - AI controlled crew members are better at avoiding hazards such as water and fire + - swimming animation fix: characters don't swim with their legs extended up over their shoulders + after a sharp turn + +--------------------------------------------------------------------------------------------------------- +v0.5.4.5 +--------------------------------------------------------------------------------------------------------- + +- optimized light rendering +- switched fonts again, now to ones that support the cyrillic alphabet +- special symbols are allowed in player names again (unless there's already a player on the server +with a visually identical name) +- fixed monsters not appearing in the position indicated by the sonar in monster missions (or being desynced +whenever they did) +- fixed the game process staying active in the background after a crash +- players can't use headsets that are in the inventory +- the warning message about unlinked vents is only shown once when saving a sub (not for each vent) +- another attempt to fix AddToGUIUpdateList and SetTransformIgnoreContacts errors + +--------------------------------------------------------------------------------------------------------- +v0.5.4.4 +--------------------------------------------------------------------------------------------------------- + +- new fonts +- spectators see indicators for both subs during combat missions +- fixed saves becoming corrupted if the player saves and quits in the "map view" +- fixed "OpenAL not found" errors if trying to run the game with no enabled audio devices +- fixed OpenAL errors when quitting a round +- fixed unconscious/dead characters falling through floors +- the server list accepts multiple servers from the same IP (assuming they're running on different ports) +- fixed autorestart and the start button getting stuck if the server fails to load the respawn shuttle +- fixed server failing to start a round if the cargo spawnpoint has been placed outside the submarine +- fixed AddToGUIUpdateList errors +- fixed SetTransformIgnoreContacts errors +- tickboxes work again in the item UIs in wiring/character mode +- fixed characters standing in an incorrect position when using railgun controllers in a mirrored sub +- spawning a scorpion (an old placeholder enemy) doesn't crash the game anymore +- submarine editor shows a warning if there are structures/items way outside the sub + +--------------------------------------------------------------------------------------------------------- +v0.5.4.3 +--------------------------------------------------------------------------------------------------------- + +- a new enemy +- some new sound effects by Omniary +- some structure-specific damage sounds +- the size of docked subs is taken into account when determining the spawn position of the sub (large +multi-part subs shouldn't spawn inside walls anymore) +- explosion damage is calculated based on the distance to the closest surface of a limb instead of the +center position of the limb (i.e. large monsters can be damaged by smaller explosions) +- added an Undertow Games splash screen +- updated to a newer version of the NVorbis sound library +- fixed a null reference exception caused by wires +- fixed an issue in the way items in alien ruins are initialized, which occasionally caused ID mismatches +(and desync) in items and characters created after generating the ruins +- fixed some item properties not being saved if changed in the editor (e.g. battery recharge speed) +- fixed characters turning into husks when they die, even if the infection has been cured +- fixed docking ports being disconnected in the mirrored subs in the combat missions +- unconscious characters collide with stairs when they're being dragged up +- fixed characters sinking/floating away when using railgun controllers underwater + +--------------------------------------------------------------------------------------------------------- +v0.5.4.2 +--------------------------------------------------------------------------------------------------------- + +- fixed crashes when removing nodes from a wire (i.e. right clicking with a wire equipped) +- fixed inventory not being drawn in the correct position if switching to a character who's been +dragged/grabbed by some other character +- fixed wires becoming disconnected when copypasting them +- wire nodes can't be moved when connecting wires to a connection panel +- fixed repeating crash messageboxes if the game fails to resolve a SharpDX exception on startup +- fixed crashing when switching to wiring mode while editing some value of an item +- fixed keyboard focus staying in textboxes after the textbox has been hidden (for example, +the input fields in the submarine saving prompt) +- fixed error message spam if a docking port is linked to another port in the same sub +- submarine lists in the editor, main menu and server menu are updated when new subs are saved/received +- fixed item editing menu staying on the screen when loading another sub in the editor +- ruins cant span above the top of the level anymore +- the size of the docked subs is taken into account when generating the level +- fixed autorestart timer not resetting at the clients' end if the server fails to start a shift and +resets the timer +- docked subs are forced to correct positions during loading (subs won't get stuck inside each other +even if the submarines are slightly overlapping in the editor) + +- all sounds are paused when switching to submarine editor +- replaced the solid black color inside ice walls with a proper texture +- the background ice texture loops better + +--------------------------------------------------------------------------------------------------------- +v0.5.4.1 +--------------------------------------------------------------------------------------------------------- + +Bugfixes: + - copypasted items are now correctly aligned to the "grid" + - cabinets can be copypasted from a sub to another without the items inside disappearing + - placing explosives inside an item and that item inside another item doesn't prevent explosions + - fixed a bug that occasionally caused crashing when the game happens to generate a very small level + +Sub editor: + - structures/items that are behind something else can be selected using a listbox that appears + when hovering the cursor over them + - wires have to be selected by clicking before any of the points can be moved (makes it possible + to move the correct wire even if it's overlapping with other wires) + - the selected wire is renderer over all structures + - points can be added to wires by clicking while holding ctrl + - disabled music + +Misc: + - some rendering optimization + - pathfinding and waypoint generation improvements + - made mantises more aggressive + - water flows more slowly through partially damaged walls + +--------------------------------------------------------------------------------------------------------- +v0.5.4.0 +--------------------------------------------------------------------------------------------------------- + +Submarine editor: + - copy, paste and cut functionality + - items/structures can be copied by holding ctrl while dragging + - it's possible to move a wire by moving both items it's connected to (without having to move each + individual point of the wire separately) + - "hull volume helper" which makes it easier to select a suitable ballast tank size and + NeutralBallastLevel setting in the navigation terminal + - equipped items are removed when switching from wiring mode to character mode or vice versa + - no need to wait when deattaching items from the walls with a wrench + + +Bugfixes: + - wires are now positioned correctly in mirrored subs + - UI elements (buttons, textboxes, etc) can't be clicked through each other anymore + - fixed a bug that caused crashes when deattaching items from walls + - fixed a game-crashing particle bug + - fixed respawned characters getting assigned to a different team than the rest of the characters + (causing them to be displayed separately in the crew menu) + - pathfinding/autopilot fixes + +Misc: + - server hosts can give players special privileges (kick, ban, end round) + - saving the contents of the server info box and the traitor setting + - changes to battery logic: they can now be used to cover the entire power consumption of the + electrical grid (assuming their maximum output is high enough) + - added "artifact holders" to alien ruins (which can also be used for turning artifacts into power + sources if installed in a sub) + - changes to character collider behavior: crouching changes the size of the collider and it's + easier to step over small obstacles + + +--------------------------------------------------------------------------------------------------------- +v0.5.3.4 +--------------------------------------------------------------------------------------------------------- + +- fixed screen turning black in the tutorial +- the moloch attack in the tutorial is now much easier to survive +- servers readd themselves to the master server if they have been removed from the server list +- fixed a bug that caused lights to flicker even if there's enough power +- fixed items disappearing when dropping them in the submarine editor + +--------------------------------------------------------------------------------------------------------- +v0.5.3.3 +--------------------------------------------------------------------------------------------------------- + +- fixed a bug that caused crashes after a husk-infected player died +- disabled the "zoom effect" when under pressure as a huskified human +- only a limited number of messages are kept in the debug console (prevents performance issues if large +amounts of messages are added) +- some item and electricity logic optimization +- fixed "sprite tigerthresher not found" errors in the Linux version + +--------------------------------------------------------------------------------------------------------- +v0.5.3.2 +--------------------------------------------------------------------------------------------------------- + +- fixed character colliders occasionally getting stuck inside walls when switching from swimming to +walking or standing up after being unconscious +- wires can be dragged outside the sub in the editor without disconnecting them +- easier to climb over small obstacles +- combat missions don't reset the "allow respawn" setting +- submarines outside the camera view aren't rendered +- coelanth collider fix + +--------------------------------------------------------------------------------------------------------- +v0.5.3.1 +--------------------------------------------------------------------------------------------------------- + +- fixed monster movement! + +--------------------------------------------------------------------------------------------------------- +v0.5.3.0 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - submarine vs submarine missions + - server hosts can disable spawning of certain characters + - server hosts can have subs spawn with additional items + +Changes to ragdoll movement/animation logic: + - movement is now controlled by a single invisible physics body which the rest of the ragdoll follows + - character position syncing is now more accurate and there's less "teleporting" + - characters are less likely to take impact damage by stumbling in stairs + - (+ makes working on the new improved netcode much easier) + - ladders can be slid down by holding the sprint key + +Submarine Editor: + - zoom now works relative to the mouse's position rather than the center of the screen + - fixed selection rectangle not being visible when dragging from bottom right to top left + - rectangles now have line widths dependent on the camera zoom (lines are still visible after zooming out) + +Items: + - added a particle trail to railgun shells + - added dim emergency lights which require no power + - a "glow effect" when moving items between inventory slots + - option to select which location the autopilot should navigate to + - fabricator UI shows item descriptions and items that can't be fabricated are grayed out + +Bugfixes: + - attempt to fix "DXGI_ERROR_NOT_CURRENTLY_AVAILABLE" errors on startup + - fixed water flow sounds taking up all the audio channels and preventing other sounds from playing + when the sub is heavily flooded + - the start button in the server lobby is re-enabled and autorestart countdown is reset if starting + a new round fails for whatever reason + - the colliders of the ice walls match the shape of the walls more accurately + - player-controlled monsters can damage the submarine from the outside + - waypoint generation and pathfinding bugfixes + +Misc: + - improved line of sight effect (instead of a solid black "fog of war", a faint image of the + surrounding rooms can be seen through walls) + - less ambient light, and it gets darker when diving deeper + - a hull-specific ambient light system: light sources increase the amount of light inside rooms, + preventing shadows from looking unnaturally dark in fully lit submarines + - option to disable vsync + - added a near-indestructible alien ruin wall variant - breaking through the walls with a railgun + or a plasma cutter is not always an option anymore + - added a parallax effect to the particles floating in the ocean + +--------------------------------------------------------------------------------------------------------- +v0.5.2.0 +--------------------------------------------------------------------------------------------------------- + +Level generation improvements: + - customizable level generation parameters (see Content/Map/LevelGenerationParameters.xml) + - different "level types" - each uses a different set of parameters, resulting in more varied levels + - more vegetation and other decorative background sprites + - the entrances and exits of the levels have more variety (not always straight vertical tunnels) + +Improved MiniMap (now called "Status Monitor"): + - shows hull integrity and oxygen levels + - can be configured to only show oxygen/water levels if the rooms have detectors installed + +- improved wall damage visuals +- the single player map shows which locations have been visited and the passageways that have been used +- minor visual improvements to the single player campaign menus +- huskification bugfixes +- oxygen isn't distributed through gaps or vents that are underwater (i.e. air pockets can form when the +sub is flooding) +- molochs (or other large creatures) can't push the sub around as easily anymore + +--------------------------------------------------------------------------------------------------------- +v0.5.1.3 +--------------------------------------------------------------------------------------------------------- + +- server whitelists +- a new monster +- improved autopilot +- background sprites and creatures can be customized via Content Packages +- Linux clients can connect to Windows servers again (and vice versa) +- fixed the upper boundary of the level occasionally being possible to pass through +- textboxes can't be selected through other UI elements anymore + +--------------------------------------------------------------------------------------------------------- +v0.5.1.2 +--------------------------------------------------------------------------------------------------------- + +- hacked clients can't join a full server or change the name of their character anymore +- option to choose which character to control using the "control" command when there are multiple +characters/creatures with the same name +- a console command for spawning items +- the server logs show who sent each chat message + +--------------------------------------------------------------------------------------------------------- +v0.5.1.1 +--------------------------------------------------------------------------------------------------------- + +- fixed non-password protected servers being impossible to join to +- some more security checks + +--------------------------------------------------------------------------------------------------------- +v0.5.1.0 +--------------------------------------------------------------------------------------------------------- + +- getting attacked by a husk will slowly turn the victim into a husk + +- spam filter +- added server options to the ingame HUD +- fixed tiger thresher spawning on Linux +- a more secure password authentication method (again) +- ingame players can't receive messages from lobby players anymore +- more server-side security checks + +- medical doctors always have a high enough medical skill to fabricate any drug +- ai-controlled crew can be spawned using the console in multiplayer +- it's possible to manually attack when controlling a creature +- randomly spawned artifacts are spread out better throughout the level +- characters won't let go of a person they're dragging when entering/exiting the sub +- respawned players get the same ID card tags they would've gotten if they had spawned inside the main sub +- highlighted characters glow in the dark + +--------------------------------------------------------------------------------------------------------- +v0.5.0.3 +--------------------------------------------------------------------------------------------------------- + +- fixed "submarine not found" errors when starting a round after downloading a shuttle from the server +- console command for banning +- a more secure password authentication method +- fixed players with a space in their name being impossible to kick/ban via the console +- banlist is saved immediately after banning someone instead of when shutting down the server +- IP addresses are visible in netstats +- client names are sanitized +- bunch of miscellaneous anti-cheat measures +- fixed docking ports leaking if multiple vessels dock to the main sub +- cargo is always spawned in the main sub even if there are cargo spawnpoints in the docked vessels + +--------------------------------------------------------------------------------------------------------- +v0.5.0.2 +--------------------------------------------------------------------------------------------------------- + +- more server-side sanity checks to prevent (desynced or hacking) players from doing things their +characters shouldn't be able to do +- fixed collision issues at docking ports (such as shooting up in the air when trying to drop down into +a docked shuttle while shuttle hatch is closed) +- fixed crashing when commanding a crew member to use a railgun in the single player mode +- fixed chatbox staying disabled after being stunned (and reappearing when being stunned again) + +--------------------------------------------------------------------------------------------------------- +v0.5.0.1 +--------------------------------------------------------------------------------------------------------- + +- selecting the same sub as the respawn shuttle and the main submarine works now +- fixed the ''end round'' tickbox not appearing if joining and spawning mid-round +- ruin walls/doors can be cut again + +--------------------------------------------------------------------------------------------------------- +v0.5.0.0 +--------------------------------------------------------------------------------------------------------- + +Support for multiple submarines (no full-fledged submarine vs submarine battles yet, but they're coming +in future updates!): + - Submarine files can be "merged", i.e. submarines can consist of multiple separate parts which can + be docked into each other + - the multiplayer mode has a "respawn shuttle" which transports respawned players from the entrance + to the main submarine + - parts of the submarine and characters inside them can be left behind in the single player mode + (and later salvaged if you wish to do so) + +Multiplayer: + - fixed a bunch of bugs that caused entity IDs not to match between the clients and the server (which + caused severe syncing issues) + - fixed monster inventory syncing (i.e. husk inventory syncing) + - fixed server description box not being synced with clients + - search bar for server logs + - more server options + - fixed the occasional "queue empty" error messages when attempting to send submarine files to players + - characters can't be freely named anymore - they'll have the same name as the client + +Items: + - items can be equipped/unequipped by double clicking + - longer railgun view distance + - changes to the logic that determines which item is being highlighted - now it's much easier to + select specific items in cramped subs + - highlighted items glow (so it's easier to see which item you're targeting in the dark) + - fixed an electricity bug that sometimes caused parts of the grid to not carry any power after + a junction box has been broken and repaired + - option to choose the output of a signal check component when the signal doesn't match + - fixed fire extinquishers + - item search bar in the submarine editor + - fixed cargo items spawning in incorrect positions (which occasionally caused some serious problems + if the item happened to be a crate full of nitroglycerin) + - flares burn longer + - fixed flashes from explosions/sparks/flares occasionally ''staying on'' + - cameras: can be connected to a railgun controller (or any other selectable controller) to remotely + view rooms or areas around the sub + +Submarines: + - the mass of a submarine depends on its size - larger submarines require more force to move around + (custom subs may need some modifications to get the top speeds of the smaller/larger subs back to a + steerable level) + - changes to depth damage logic: structures with more health need more pressure before they start taking + damage (i.e. submarines with thicker walls and no windows can go deeper) + +Misc: + - stunned characters can't move items in their inventory + - characters can run while grabbing/dragging someone + - fixed a bug that made it impossible to spawn characters through the console in the Linux version + - NPCs won't close doors/hatches on themselves and are better at handling stairs/ladders + - pathfinding bugfixes + + +--------------------------------------------------------------------------------------------------------- +v0.4.1.6 +--------------------------------------------------------------------------------------------------------- + +- vote kicking +- fixed reverting back to the first sub on the list after each round when using manual submarine selection +- fixed lights "bleeding" through walls +- fixed crashing if the submarine contains hulls far away from the rest of the submarine +- corricodone is slightly more effective +- battery charge can be set higher than the default capacity of 2000 (assuming the capacity is set higher) +- job assignment bugfixes +- head sprites can be given tags (e.g. customhead[tag].png) which will make the game select body sprites +with a matching tag (e.g. customtorso[tag].png) for the character +- some new head sprites +- pathfinding errors (which may be caused by missing or incorrectly placed waypoints in custom subs) +don't cause the debug console to pop up +- added missing music clips to the Linux build + +--------------------------------------------------------------------------------------------------------- +v0.4.1.5 +--------------------------------------------------------------------------------------------------------- + +- fixed oxygen distribution through vents not being calculated correctly +- fixed another bug that caused ''object reference not set to an instance of object'' error messages +when starting a new round +- fulgurium batteries can be put in flashlights and sonars +- more powerful oxygen generators in vanilla subs (small rooms aren't deathtraps anymore) + +Linux version: +- fixed ''unable to load coelanth.png'' error messages +- fixed non-matching content packages between the Linux and Windows versions + +--------------------------------------------------------------------------------------------------------- +v0.4.1.4 +--------------------------------------------------------------------------------------------------------- + +- fixed clients failing to select submarines in their "Submarines/Downloaded" folder + +--------------------------------------------------------------------------------------------------------- +v0.4.1.3 +--------------------------------------------------------------------------------------------------------- + +- fixed errors when updating the submarine list if the host is has selected the "play yourself" option + +--------------------------------------------------------------------------------------------------------- +v0.4.1.2 +--------------------------------------------------------------------------------------------------------- + +- fixed the ''queue empty'' error messages when attempting to download a sub from the server + +--------------------------------------------------------------------------------------------------------- +v0.4.1.1 +--------------------------------------------------------------------------------------------------------- + +- changes to connection panel layout: less wire overlap, making it easier to select individual wires + +- fixed missions not appearing in single player + +- clients see the submarines the host has instead of their own subs in the server lobby +- clients can vote for subs they don't have +- servers check whether all the clients have the selected submarine file before starting a round, and if not, +give them some time to start downloading it + +- item sprites are visible in fabricator menus +- some new wall sprites +- fixed small walls being impossible to fix after they've broken +- ruin walls look slightly different from normal walls on sonar +- cargo is placed at the cargo spawnpoint instead of a random position within the hull it's inside +- fixed light emitted by flares not disappearing after the flare burns out +- flares won't stop burning if picked up and placed in the inventory +- minor changes to the lighting - small lights aren't ''skewed'' +- fixed the ''CastShadows'' parameter of light components not being saved +- fixed fires using up all the sound channels and preventing other sounds from playing + +- fixed the ''blood overlay'' still being visible when starting a new round or switching characters +- fixed fractal guardians occasionally killing themselves by slamming against the walls +- enemies use pathfinding inside the submarine + +--------------------------------------------------------------------------------------------------------- +v0.4.1.0 +--------------------------------------------------------------------------------------------------------- + +- alien ruins and some special monsters/items that only spawn inside them +- improved lighting +- flashlights and flares +- depth charges +- items can be moved from the inventory to cabinets/containers by double clicking +- option to choose mission type in multiplayer +- fixed crashes when using medical syringes in multiplayer +- fixed characters occasionally ''exploding'' or being launched to a random direction when +entering/exiting the sub +- fixed long map seeds always generating the same map +- fixed item loading issues when playing the game on a PC using the Turkish locale (and most likely some +other locales with special uppercase/lowercase rules) + +--------------------------------------------------------------------------------------------------------- +v0.4.0.3 +--------------------------------------------------------------------------------------------------------- + +- stun syncing bugfix +- fixed dead/unconscious characters being impossible to select in the info menu +- fixed crashes when detonating nitroglyserine by injecting it +- oxygen level deteriorates more slowly when unconscious +- instructions for dealing with broken junction boxes in the tutorial + +--------------------------------------------------------------------------------------------------------- +v0.4.0.2 +--------------------------------------------------------------------------------------------------------- + +- fire doesn't affect items in characters' inventories (e.g. holding a thermal artifact won't blow up +oxygen tanks in your inventory) +- handheld sonars only consume power when they're on +- cargo missions are more common +- fix for endworms (and possibly other large monsters) teleporting partially inside the sub +- some more chemicals/drugs +- doctor's clothes have some extra slots for chemicals + +--------------------------------------------------------------------------------------------------------- +v0.4.0.1 +--------------------------------------------------------------------------------------------------------- + +- radio messages are visible to spectators +- added a bunch of handheld sonars to the vanilla subs +- junction boxes take more time to break in water +- moved the junction boxes inside Nehalennia's ballast tanks to a drier location + +--------------------------------------------------------------------------------------------------------- +v0.4.0.0 +--------------------------------------------------------------------------------------------------------- + +DOCTORS: + - medical doctors (can fabricate various drugs/chemicals and give CPR to unconscious characters) + - changes to the dying logic: characters will be unconscious when their health or oxygen goes below 0, + and die when it drops to -100 + - medical syringes can be used on other characters + - any chemicals can be inserted in medical syringes + +Items: + - handheld sonars + - crates, small medical/chemical cabinets + - junction boxes, sonar monitors, navigation terminals and engines break if they're underwater long enough + - reactor cools down if it's underwater (multiple fuel rods are required to bring the temperature back up) + - forces are applied to items (not just characters) when the submarine hits something + - changes to the logic for distributing oxygen through vents: the oxygen generator pushes more oxygen + to larger rooms instead of dividing the oxygen output equally between vents + + - autopilot bugfixes + - the amount of oxygen/battery left is visible in the inventory slot of the ''parent item'' + - new inventory slot for masks, headsets, etc + + - fixed ''signal loops'' crashing the game + - OR gates work properly now + - AND/OR gates can be set to send out a signal when the input conditions aren't met + + - fabricating items may require some specific skill levels + + - a bunch of new sprites + +Multiplayer: + - fixed a bug that caused the server to resend a ton of messages to a client who's been temporarily + disconnected, causing syncing issues to every player + - fixed syncing issues related to items breaking (eg junction boxes being broken only for some players) + - fixed dead monsters occasionally ''teleporting'' inside the sub in multiplayer + - fixed missions not matching between Linux and Windows builds + - fixed traitor messages reappearing at the start of a new round after disabling traitors + - mid-round chat messages have a limited range + - players are equipped with a headset which can be used for remote communication (and making + voice-controlled devices/systems) + - speech bubble icon is displayed next to the character when speaking in multiplayer + +Misc: + - level generation improvements: small cave systems, more vegetation, more varied layouts + - option to spawn characters/monsters near, inside or outside the sub + - crouching + - cargo missions + - borderless windowed mode (aka fake fullscreen) + - option to enable some additional debug logging (by setting ''verboselogging'' to true in the config file) + - a menu that shows the mission description mid-round + - game settings can be changed mid-round + - submarine descriptions + - fixed characters getting stuck inside a wall when trying to get inside the sub through a hole + +--------------------------------------------------------------------------------------------------------- +v0.3.6.0 +--------------------------------------------------------------------------------------------------------- + +- bunch of crew AI improvements and bugfixes: they are now much better at keeping themselves alive and +fixing leaks +- crew AI can be toggled on and off using "DisableCrewAi" and "EnableCrewAi" commands +- fixed crashing when switching from wiring mode to character mode +- inventory is visible in wiring mode +- several wiring bugfixes +- emergency sirens and alarm buzzers +- fixed light components throwing errors when receiving an invalid color value to the "set_color" input +- fixed bright lights making it impossible to see whether a light component is on or off +- relay components break if too much power is directed through them +- relay components are active by default and they can be toggled on/off in the editor +- wires can be created in fabricators +- label text color can be changed +- boolean (true/false) properties are displayed as checkboxes in the editor + +--------------------------------------------------------------------------------------------------------- +v0.3.5.1 +--------------------------------------------------------------------------------------------------------- + +- fixed unclickable buttons/checkboxes in the launcher +- fixed battery cells not reloading when placed inside a battery + +--------------------------------------------------------------------------------------------------------- +v0.3.5.0 +--------------------------------------------------------------------------------------------------------- + +- items float and can be moved around by flowing water +- wiring mode which makes wiring more convenient in the editor +- networking bugfixes and improvements +- changes to the logic that determines how far the monsters can see/hear the submarine from - now it's +possible to evade some monsters by turning off noisy devices and/or stopping the submarine +- invisible entities (items inside cabinets, hulls/gaps when they've been hidden) can't be highlighted +or selected in the editor +- fixed monster/item spawnpoints being placed in unreachable locations +- relay and delay components +- fixed lights not being positioned correctly on moving items +- added a ''set_color'' connection to light components +- ladders outside the sub can be climbed +- changes to drowning/suffocation logic: amount of oxygen drops at a fixed rate instead of effects +"stacking" (e.g. when wearing a diving suit with no oxygen tank in a room with low oxygen) +- fixed projectiles not colliding with the submarine when shot from the outside + +--------------------------------------------------------------------------------------------------------- +v0.3.4.2 +--------------------------------------------------------------------------------------------------------- + +- fixed characters passing through walls/windows that have already been repaired +- fixed the spawn command in Linux version +- fixed clients being able to join servers with the wrong password + +--------------------------------------------------------------------------------------------------------- +v0.3.4.1 +--------------------------------------------------------------------------------------------------------- + +- fixed a major bug in the networking code, which caused the server to incorrectly determine the order +of messages received from different clients and discard valid messages +- fixed levels with the same seed appearing different between the Linux and Windows versions +- creatures spawned using the console are synced with clients +- password prompt for password-protected private servers +- holes in the walls can be seen through +- bleeding gradually slows down - making an enemy bleed isn't a guaranteed kill anymore +- mantises don't bleed +- fixed crashing when swapping some specific equipped items with another item in the inventory +- fixed deconstructor, fabricator and railgun connection panels closing immediately after opening + +--------------------------------------------------------------------------------------------------------- +v0.3.4.0 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: +- missing submarine files can be downloaded from the server host +- player syncing bugfixes (aiming is visible to other players, smoother movement in water) +- creature syncing bugfixes (less teleporting around) +- fixed the server lobby displaying wrong numbers of votes at the client's side +- fixed the server list displaying 16/16 players as 0/16 +- saving server settings + +Other: +- skyholder artifacts consume oxygen +- thermal artifacts catch fire even if they're not being held +- placed items/structures can be resized in the editor +- items in the inventory can be swapped between slots by dragging them on top of each other +- cyrillic character support +- slower underwater scooters +- fixed pressure building up in enclosed rooms full of water, even if there were no hull breaches +- an indicator which shows the direction of the sub when spectating +- fixed crashing when loading a submarine with no hulls + +--------------------------------------------------------------------------------------------------------- +v0.3.3.1 +--------------------------------------------------------------------------------------------------------- + +- fixed the chatbox obstructing other player's inventory when grabbing/dragging a character +- fixed characters randomly letting go of bodies they're dragging +- the keybinds configured in the options menu are used when moving the camera as a spectator + +--------------------------------------------------------------------------------------------------------- +v0.3.3.0 +--------------------------------------------------------------------------------------------------------- + +- more visible indicators when taking damage, running out of oxygen or being crushed by pressure +- handcuffs +- changes in the welding/cutting targeting logic: it's now possible to target "corners" of the hull +even if the section of the wall is obstructed by adjacent walls +- fixed submarines spawning in a wrong position (e.g. inside walls) if the submarine has been built +far away from the coordinates (0,0) +- fixed a memory leak caused by item sprites +- character/inventory syncing bugfixes +- fixed spectators not seeing their own chat messages +- scrollable list of clients in the network statistics view +- small changes to the vanilla subs +- fixed the water brightness in Linux version + +--------------------------------------------------------------------------------------------------------- +v0.3.2.6 +--------------------------------------------------------------------------------------------------------- + +- fixed the broken password box +- maximum number of players per server increased to 16 (note that none of the vanilla subs have been +designed for a crew that large) +- junction boxes and power sources can be connected with multiple parallel wires without multiplying +the power output +- velocity and depth readings on navigation terminals +- location types and missions are included in content packages + +--------------------------------------------------------------------------------------------------------- +v0.3.2.5 +--------------------------------------------------------------------------------------------------------- + +- fixed null reference exception when starting a client + +--------------------------------------------------------------------------------------------------------- +v0.3.2.4 +--------------------------------------------------------------------------------------------------------- + +- fixed crashing when highlighting a dead husk +- fixed the unclickable checkboxes in server settings +- sending messages to specific players using ''d; [message]'' and ''name; [message]'' (messages can be +sent to players with spaces in their names now) +- more descriptive log messages when taking items from cabinets or other players + +--------------------------------------------------------------------------------------------------------- +v0.3.2.3 +--------------------------------------------------------------------------------------------------------- + +- fixed characters dropping items when a spectator joins +- fixed any selected textbox in the server lobby accepting keyboard input after a round starts +- praise the honkmother + +--------------------------------------------------------------------------------------------------------- +v0.3.2.2 +--------------------------------------------------------------------------------------------------------- + +- clearing the server log after saving! +- saving the log after every round (even if it isn't full) + +--------------------------------------------------------------------------------------------------------- +v0.3.2.1 +--------------------------------------------------------------------------------------------------------- + +- fixed words missing from chat messages +- the server log UI doesn't scroll to the bottom when new lines appear, making it easier to read it during +a round + +--------------------------------------------------------------------------------------------------------- +v0.3.2.0 +--------------------------------------------------------------------------------------------------------- + +- server logs +- server admins have the option to send messages only to dead players and spectators (/d [message]) or +to one specific player (/name [message]) +- more reliable door syncing +- railgun syncing bugfixes +- longer view distance when outside +- deattaching items takes some time +- welders and cutters do damage to players/enemies again +- a new enemy +- molochs can do damage to players + +--------------------------------------------------------------------------------------------------------- +v0.3.1.5 +--------------------------------------------------------------------------------------------------------- + +- fixed projectiles/weapons not colliding with characters + +--------------------------------------------------------------------------------------------------------- +v0.3.1.4 +--------------------------------------------------------------------------------------------------------- + +- fixed items ''floating'' in some of the custom subs +- fuel rods can't be turned back to uranium/incendium bars if they've been used + +--------------------------------------------------------------------------------------------------------- +v0.3.1.3 +--------------------------------------------------------------------------------------------------------- + +- round end votes can be toggled off +- less confusing way of displaying the number of votes (yes/no instead of yes/number of voters) + +--------------------------------------------------------------------------------------------------------- +v0.3.1.2 +--------------------------------------------------------------------------------------------------------- + +- players can vote to end a round in multiplayer +- fixed fabricator syncing +- fixed hulls being invisible in the editor +- spectators can only speak to dead players +- minor changes to the map generation algorithm: there's now more variety in the cavern shapes +- added a new type of railgun shell +- diving suits wont protect from the water pressure in the abyss anymore +- added some spare buttons to Vellamo + +--------------------------------------------------------------------------------------------------------- +v0.3.1.1 +--------------------------------------------------------------------------------------------------------- + +- fixed a major bug that caused item/monster ID mismatches between the server and the clients, which +accounted for many of the monster/inventory/item syncing issues +- improved player position syncing + +--------------------------------------------------------------------------------------------------------- +v0.3.1.0 +--------------------------------------------------------------------------------------------------------- + +- batteries have separate power_in and power_out connections, which allows recharging and powering devices +simultaneously and using separate recharge circuits +- using supercapacitors as a substitute for batteries now longer works: they have a very low energy storage +capacity and are only suitable for providing short high-energy power surges +- improved connection panel graphics +- fixed a bug that caused the submarine to swoop to a random direction when a character enters it +- fixed crashed caused by EntityGrid.GetEntites() + +--------------------------------------------------------------------------------------------------------- +v0.3.0.5 +--------------------------------------------------------------------------------------------------------- + +- fixed autopilot crashing the game +- fixed reactor not catching fire when going above the configured ''fire temperature'' +- fixed a duplicate "Play yourself" checkbox appearing in the lobby screen after rounds + +--------------------------------------------------------------------------------------------------------- +v0.3.0.4 +--------------------------------------------------------------------------------------------------------- + +- submarine editor can be used without the console now +- autopilot can be set to maintain the current position of the sub +- monster syncing bugfixes +- ladder syncing bugfixes +- fixed server randomly stunning the players +- fixed "submarine not found" errors which occurred in multiplayer if the filename didn't match the +name of the submarine +- fixed new structures not lining up with existing ones if switching to editor while a round is running +- fixed a bug in shadow rendering which caused memory leaks +- the autoupdater only checks the Content folder when deleting files that don't belong to the latest version +(i.e. the autoupdater won't delete your mods as long as they aren't saved in the Content folder) +- molochs and endworms are immune to bleeding! + +--------------------------------------------------------------------------------------------------------- +v0.3.0.3 +--------------------------------------------------------------------------------------------------------- + +- fixed selecting stairs and items outside the sub in editor +- fixed crashing when pressing the ''start'' button while no route is chosen in single player +- fixed fire syncing +- fixed another bug that crashed the game if in the lobby when a round ends +- camera keeps moving with the sub when typing into chatbox in spectator mode + +--------------------------------------------------------------------------------------------------------- +v0.3.0.2 +--------------------------------------------------------------------------------------------------------- + +- fixed crashing when picking up a thermal artifact outside the sub +- fixed clients crashing if in the lobby when a round ends +- fixed crashing when attempting to join a password-protected server +- camera position is set at the position of the sub when entering spectator mode +- AI crew equips a diving suit before going outside the sub + + +--------------------------------------------------------------------------------------------------------- +v0.3.0.1 +--------------------------------------------------------------------------------------------------------- + +- fixed inventory not being visible when using character mode in the editor +- adding hulls and gaps works properly when switching to editor after a round has been started +- fixed item selecting when switching to character mode after a round has been started +- fixed a bug that made it impossible to fix broken walls after saving and reloading +- fixed crashing when trying to place ladders when no submarine has been loaded +- trying to generate waypoints for an empty sub won't crash the game anymore +- when opening the crew commander menu for the first time, there's a text notifying about the hotkey for +opening/closing the menu + + +--------------------------------------------------------------------------------------------------------- +v0.3 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - a summary screen which shows some details about the previous round + - no separate traitor mode: they can be enabled for any game mode + - an option to randomize whether there is a traitor or not + - larger chatbox + - a ton of syncing bugfixes and optimization + +Items: + - fabricators, which can be used for crafting items out of raw materials or other items + - deconstructors, which break items down to their basic components/materials + - a bunch of new sprites + - there are some artifacts scattered around every level regardless of the quest, and they can be collected + and used as a source of useful raw materials for the fabricator + - added hatches (which are basically doors rotated by 90 degrees) + - characters can't get stuck inside doors anymore + - stairs are easier to climb (less tripping down!) + - navigation terminals have a ''default ballast level'' setting which determines how much water there + should be in the ballast tanks when not steering in any direction + - ladders can be climbed with a diving suit on, just very slowly + - ladder climbing animation now works properly even when holding an item + - items have a short description which can be read by hovering the mouse over the inventory slots + - if the reactor is connected to multiple junction boxes, automatic temperature control will adjust + the power output to the highest load instead of the sum of the loads + - reactor state is saved (it will stay running when between levels) + - using a stun baton while running won't make the character trip anymore + +Submarines: + - a new sub, Nehalennia + - the collider of the submarine now matches the shape of the hull + - the airlock pumps in each sub are set to pump water out instead of just turning the pump on when pressing + the button outside the airlock + +Submarine editor: + - items/structures are sorted by category in alphabetical order + - tickboxes for hiding hulls, gaps, waypoints and links between items + - a list of the most recently used items/structures + - placed wires are much easier to move around + - more accurate staircase selecting (the ''bounding box'' of the staircase won't prevent selecting items that + are behind it anymore) + - visible indicators for railgun rotation limits + +Crew: + - the crew members not controlled by the player now have an AI: they can take orders, do some basic tasks + and avoid various hazards + - fixed equipped items disappearing when loading the game + - bodies can be dragged up stairs + +Misc: + - two new monsters + - improved UI graphics + - better looking cavern walls + - major optimization to light/shadow rendering + - some new quests (which are now called ''missions'') + +--------------------------------------------------------------------------------------------------------- +v0.2.6.2 +--------------------------------------------------------------------------------------------------------- + +- added missing stunbaton sound file + +--------------------------------------------------------------------------------------------------------- +v0.2.6.1 +--------------------------------------------------------------------------------------------------------- + +- fixed a bug that caused characters to take bleeding damage for no apparent reason +- fixed autopilot not working when changing the map seed + +--------------------------------------------------------------------------------------------------------- +v0.2.6 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - major changes to the networking code: better lag compensation, more reliable item/character + syncing, lower bandwidth consumption + - spectator mode + +Submarine: + - overloading the electrical grid or the reactor may cause fires + +Characters: + - blood texture drawn on damaged limbs + - fixed limbs clipping through walls + - some new head sprites + +Items: + - underwater scooters + - water detector + - jumpsuits for engineers and mechanics + - new artifact with an effect that makes retrieving it much harder + - less obtrusive ''fow effect'' when wearing a diving suit or a mask + - fire extinguishers + - some new sprites + +Misc: + - fixed placing ladders and labels in sub editor + - fixed a couple of game-crashing bugs in submarine saving + +--------------------------------------------------------------------------------------------------------- +v0.2.5 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - option to randomly select level seed, submarine and/or game mode + - players can be allowed to vote for the next sub and game mode + - option to choose character's head + +Submarine: + - pressure damage if the submarine dives too deep + - added the missing mechanic spawnpoint missing to Aegir + +Creatures: + - a new enemy that only spawns deep below the level + +Items: + - diving suits and mask now obstruct vision when worn + - nicer looking sonar monitor + +Misc: + - the levels aren't just enclosed tunnels anymore and it's possible to dive much deeper + - settings menu + - better UI scaling on small resolutions + - fixed items occasionally disappearing from inventory after loading in single player + +--------------------------------------------------------------------------------------------------------- +v0.2.4.1 +--------------------------------------------------------------------------------------------------------- + +- fixed rewiring not working in the editor +- fixed a game-crashing projectile bug + +--------------------------------------------------------------------------------------------------------- +v0.2.4 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - fixed invincible NPCs + - the target in traitor mode is properly randomized and the host can be selected as a traitor/target + - the "fix list" when repairing items is synced between clients, so the reactor can actually be fixed now + - more networking optimization + - bans can be removed by using a button under the player list, not just by editing the bannedplayers.xml file + +Items: + - wires are removed from connection panels when they're deleted in the editor + - doors can be rewired from either side + - the rewire screen can be deselect by pressing E + - sonar won't work anymore if the power wire is removed + - stun batons can't be double wielded or used for fast underwater movement + +Misc: + - some particles floating in the water, which make it easier to see if the sub is moving just by + looking out of a window + - fixed a bug which may have crashed the game if a character spawned on a platform or stairs + + +--------------------------------------------------------------------------------------------------------- +v0.2.3.2 +--------------------------------------------------------------------------------------------------------- + +- more reliable NPC position syncing +- more reliable method of handling players dying in multiplayer, there should now be less cases of +the server killing players who have equipped a diving suit or switched an oxygen tank just in time for example +- the "you have died" message in multiplayer now also tells your cause of death +- fixed incorrectly placed waypoints in Aegir + +--------------------------------------------------------------------------------------------------------- +v0.2.3.1 +--------------------------------------------------------------------------------------------------------- + +- fixed some broken items in Aegir Mark II which caused inventories to get messed up +- fixed the gap at observation deck which vents water out from the lower level of the room + +--------------------------------------------------------------------------------------------------------- +v0.2.3 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - major changes to the way the game handles sending reliable messages through UDP, should get rid of + the occasional massive lag spikes + - fixed multiple issues in inventory syncing + - fixed attachable items occasionally crashing the game + - players can be banned from servers + - fixed not being able to kick players while a round is running + - misc optimization + +Items: + - screwdrivers and wrenches are used by left clicking now, so it's possible to start rewiring a + button without activating it for example + - the inventory slots are "combined" when equipping an item that takes up more than one slot + - door shadows aren't visible if the door is open when loading a map + - fixed projectiles crashing the game if they're stuck to a wall while a hole appears on it + - wrenches can be used as an ineffective melee weapon + +Submarine: + - another minimap and a sonar monitor at the "observation deck" on Aegir + - changed one of the cabins to a holding cell on Aegir + +Misc: + - fixed a bug in UI listboxes that may have caused crashes in the server list screen + + +--------------------------------------------------------------------------------------------------------- +v0.2.2 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - network statistics view which can be enabled by opening the debug console (F3) and entering "netstats" + (only works if you're running a server) + - updated to latest version of Lidgren networking library, which may or may not have an effect + on the chat lag issues + +Items: + - fixed some game-crashing bugs related to detaching and attaching items (such as buttons) + - railgun shells can be bought in single player + +Submarine: + - more tools, diving suits and misc supplies in both default subs + +Misc: + - fixed Moloch spawning inside the level in the tutorial + - the launcher shows an error message instead of crashing if it can't connect to the update server + +--------------------------------------------------------------------------------------------------------- +v0.2.1 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - fixed a bug that crashed the game after successfully retrieving an artifact in quest mode + - fixed client not disconnecting when going back to the main menu + - fixed a bug that caused some map seeds to throw an error + - players can be kicked out of the server by selecting them in the player list, not just through + the debug console + +Items: + - all wires can be used for electrical repairs, not just ones named ''Wire'' + - broken doors can only be fixed by mechanics + - fixed a bug that sometimes made it impossible to pick/select items after reattaching them on a wall + - wires are disconnected and dropped if the item at either end is removed + +--------------------------------------------------------------------------------------------------------- +v0.2 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - major optimization and much better lag compensation + - tons of bugfixes that should fix most of the syncing issues + - admins can play on their own server without launching another instance of the game + - setting the job preferences actually does something now + - reconnecting to a server if the connection is temporarily lost works much better now + - proper error messages if UPnP port forwarding fails + +Items: + - security guard gear: ballistic vest, helmet and stun baton + - wifi components that can be used for transmitting signals between devices + - wall labels with a configurable text + - a bunch of new sprites and sounds + - wearing a diving suit slows the characters down + - supercapacitors + - attempting to fire the railgun when there are no shells loaded doesn't consume power anymore + +Submarine: + - improved version of Aegir + - a new submarine, "Vellamo" + - nuclear reactors overheat much more slowly and there are warning signals for overheating and a remote + shutdown button in both of the default subs + - ambient sounds change according to the speed of the sub + - fixed parts of the submarine getting stuck in the level on collision + - the autopilot is a much better driver now (although it may still crash at very tight spots) + +Crew: + - aiming underwater is much easier + - improved humanoid animations + - stunned/dead characters can be dragged + - all characters can now use plasma cutters and welders regardless of their skills, but insufficient + skill level will make them flicker and work much less efficiently + - same for the harpoon gun, anyone can shoot but lower levels will make the gun less accurate + - rewiring devices may cause electric shocks if the electrical engineering level is too low + +Creatures: + - some random "prop fish" swimming in the background + - a new hostile creature + +Misc: + - a tutorial going through all the basic tasks and game mechanics (more in-depth tutorials will be + added in future versions, including one for making custom subs) + - an auto-updater in the launcher + - the game generates a detailed report if it crashes + - physics optimization (i.e. using simplified physics and animation for off-screen characters and + disabling them entirely if they're far enough) + - lighting optimization (caching the lights/shadows if a light source hasn't moved instead of + recalculating them every frame) + - two new background music tracks + - better looking explosions + - better looking water particle effects + - minor UI improvements + - better UI scaling on different resolutions + - health/oxygen bar improvements and status icons for bleeding and water pressure + - gap-hull connections are visible in the sub editor + - pumps don't have to be manually connected to a hull in the editor anymore, they automatically + empty/fill the hull they're inside + + +--------------------------------------------------------------------------------------------------------- +v0.1.3.2 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - some major opimization to networked messages (less lag) + - option to disable UPnP port forwarding (which may have prevented some from hosting a server) + - a new round can't be started if a submarine hasn't been selected (which used to crash the game) + - maximum number of players can be changed + - fixed a bug in the net lobby screen that disabled the start button when the chat box was scrolled + to a specific position + - a window that displays some network statistics when hosting a server (can be activated by entering + "debugview" to the debug console) + +--------------------------------------------------------------------------------------------------------- +v0.1.3.1 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - chat messages are sent reliably + +--------------------------------------------------------------------------------------------------------- +v0.1.3 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - fixed master server connection errors in server list screen + - fixed a bug that caused other characters to get "stuck" to the railgun controller, causing them + to fly back to it as they try to move away + +Items: + - putting items inside other items works properly now (i.e. by pulling a spear to the same slot as + a harpoon, not the other way around) + - C4 blocks loaded inside a railgun shell won't explode inside the submarine when firing the railgun + - fixed another game-crashing railgun bug + - fixed a bug that caused characters to spawn with an incorrect number of items + +--------------------------------------------------------------------------------------------------------- +v0.1.2 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - a "lobby screen" showing a list of servers that are currently running + - password protected servers + - traitor rounds end when the traitor dies/disconnects or if the submarine reaches the end of the level + +Items: + - fixed the crashing when firing the railgun or activating a detonator + +Other: + - optimized lightning and "line of sight" rendering + - an unfinished tutorial which can currently only be accessed by entering "tutorial" into the + debug console + +--------------------------------------------------------------------------------------------------------- +v0.1.1 +--------------------------------------------------------------------------------------------------------- + +Multiplayer: + - player names are shown + - assigning jobs and selecting job preferences works now (jobs are assigned when the round starts) + - a menu that shows the crew members and their jobs and skills + - reduced lag spikes + - fixed a bug that caused disconnected players to stay in the player list + - server admin can see which player is the traitor + +Items: + - plasma cutter / welding tool bugfixes and some light and sound effects + - stun grenades, detonators and c4 blocks work now + - captain's uniform + - items can be placed inside railgun shells (explosives for example) + - buttons can be attached and detached + - on-screen message when trying to use a button without the right ID card + - wire sprites don't overlap and "flicker" on top of each other anymore + - trying to set the color of a lightcomponent to an invalid value doesn't crash the game anymore + +Submarine: + - some signs on the walls of Aegir to make navigation a bit easier + - moved the railgun and changed the rotation limits to increase it's area of effect while preventing + shooting at the windows + - fixed waypoint selection bug in submarine editor + - the ".gz" extension is automatically added when saving a map + +Other: + - decreased fall/impact damage + - dead characters can be looted diff --git a/Lua For Barotrauma/Binary/clrcompression.dll b/Lua For Barotrauma/Binary/clrcompression.dll new file mode 100644 index 0000000..27416db Binary files /dev/null and b/Lua For Barotrauma/Binary/clrcompression.dll differ diff --git a/Lua For Barotrauma/Binary/clretwrc.dll b/Lua For Barotrauma/Binary/clretwrc.dll new file mode 100644 index 0000000..47f7c3e Binary files /dev/null and b/Lua For Barotrauma/Binary/clretwrc.dll differ diff --git a/Lua For Barotrauma/Binary/clrjit.dll b/Lua For Barotrauma/Binary/clrjit.dll new file mode 100644 index 0000000..ad9e959 Binary files /dev/null and b/Lua For Barotrauma/Binary/clrjit.dll differ diff --git a/Lua For Barotrauma/Binary/coreclr.dll b/Lua For Barotrauma/Binary/coreclr.dll new file mode 100644 index 0000000..35bbb14 Binary files /dev/null and b/Lua For Barotrauma/Binary/coreclr.dll differ diff --git a/Lua For Barotrauma/Binary/crashreport.log b/Lua For Barotrauma/Binary/crashreport.log new file mode 100644 index 0000000..60a8d81 --- /dev/null +++ b/Lua For Barotrauma/Binary/crashreport.log @@ -0,0 +1,51 @@ +Barotrauma Client crash report (generated on 02/05/2022 18:37:51) + + +Barotrauma seems to have crashed. Sorry for the inconvenience! + + +28D80F2FA4850B8644E5F1BBED452ED2 + + +Game version 0.17.15.0 (ReleaseWindows, branch master, revision 79daf2ed3) +Graphics mode: 1280x1024 (BorderlessWindowed) +VSync ON +Language: English +Selected content packages: None +Level seed: no level loaded +Loaded submarine: None +Selected screen: None +SteamManager initialized + + +System info: + Operating system: Microsoft Windows NT 10.0.19044.0 64 bit + GPU name: AMD Radeon(TM) Vega 8 Graphics + Display mode: {Width:1280 Height:1024 Format:Color AspectRatio:1,25} + GPU status: Normal + + +Exception: Could not find file 'B:\programming\c#\Barotrauma\Barotrauma\bin\ReleaseWindows\net6.0\win-x64\publish\Content\Effects\waterbump.png'. (System.IO.FileNotFoundException) +Target site: Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, System.IO.FileOptions) +Stack trace: + at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options) + at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) + at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) + at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) + at System.IO.Strategies.FileStreamHelpers.ChooseStrategy(FileStream fileStream, String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Int64 preallocationSize) + at System.IO.File.Open(String path, FileMode mode, FileAccess access, FileShare share) + at Barotrauma.IO.File.Open(String path, FileMode mode, FileAccess access, Nullable`1 share) in \Barotrauma\BarotraumaShared\SharedSource\Utils\SafeIO.cs:line 366 + at Barotrauma.IO.File.OpenRead(String path) in \Barotrauma\BarotraumaShared\SharedSource\Utils\SafeIO.cs:line 371 + at Barotrauma.TextureLoader.FromFile(String path, Boolean compress, Boolean mipmap) in \Barotrauma\BarotraumaClient\ClientSource\Utils\TextureLoader.cs:line 193 + at Barotrauma.WaterRenderer..ctor(GraphicsDevice graphicsDevice, ContentManager content) in \Barotrauma\BarotraumaClient\ClientSource\Map\Levels\WaterRenderer.cs:line 78 + at Barotrauma.GameMain.LoadContent() in \Barotrauma\BarotraumaClient\ClientSource\GameMain.cs:line 400 + at Microsoft.Xna.Framework.Game.Initialize() in \Libraries\MonoGame.Framework\Src\MonoGame.Framework\Game.cs:line 551 + at Barotrauma.GameMain.Initialize() in \Barotrauma\BarotraumaClient\ClientSource\GameMain.cs:line 369 + at Microsoft.Xna.Framework.Game.DoInitialize() in \Libraries\MonoGame.Framework\Src\MonoGame.Framework\Game.cs:line 678 + at Microsoft.Xna.Framework.Game.Run(GameRunBehavior runBehavior) in \Libraries\MonoGame.Framework\Src\MonoGame.Framework\Game.cs:line 381 + at Microsoft.Xna.Framework.Game.Run() in \Libraries\MonoGame.Framework\Src\MonoGame.Framework\Game.cs:line 367 + at Barotrauma.Program.Main(String[] args) in \Barotrauma\BarotraumaClient\ClientSource\Program.cs:line 58 + + +Last debug messages: +[02/05/2022 18:37:47] Logged in as Evil Factory (SteamID STEAM_1:1:53859811) diff --git a/Lua For Barotrauma/Binary/createdump.exe b/Lua For Barotrauma/Binary/createdump.exe new file mode 100644 index 0000000..08249df Binary files /dev/null and b/Lua For Barotrauma/Binary/createdump.exe differ diff --git a/Lua For Barotrauma/Binary/daedalic_privacypolicy.txt b/Lua For Barotrauma/Binary/daedalic_privacypolicy.txt new file mode 100644 index 0000000..3f55a52 --- /dev/null +++ b/Lua For Barotrauma/Binary/daedalic_privacypolicy.txt @@ -0,0 +1,71 @@ +1. Name and contact data of the controllers responsible for processing, as well as the company data protection officer + +This data protection information applies to data processing by: + +Controller: + Daedalic Entertainment GmbH + Papenreye 51 + 22453 Hamburg + +represented by the CEO Carsten Fichtelmann and the COO Stephan Harms, + e-mail: info@daedalic.com, + fax: + 49 40 356 741 36 + +The companies’ data protection officer is + + Frederik Bockslaff + +who can be reached under: + + Nimrod Rechtsanwälte + Emser Straße 9 + 10719 Berlin + E-mail: info@nimrod-rechtsanwaelte.de + tel: +49 (0)30 544 61 793 + fax: +49 (0)30 544 61 794 + +2. Collection and storage of personal data and the purpose of their use +Your personal data will be processed by Valve Corporation as the provider of the Steam store. You can find further relevant information regarding your rights in this respect in the privacy statements of Valve Corporation under the following link: + +https://store.steampowered.com/privacy_agreement/ + +Additionally, subject to your consent, for the purposes of quality management, analytics and marketing purposes the following personal data is processed and controlled by GameAnalytics Ltd: + • Time spent playing different game modes + • Round statistics (e.g. selected submarine, duration, mission success/failure, difficulty, selected job, visited caves/wrecks/ruins etc...) + • Campaign statistics (e.g. number of visited outposts and completed missions, amount of money, time used per campaign, purchased/sold items, radiation enabled/disabled, etc...) + • Tutorial completion + • Purchased submarine upgrades + • Character deaths and causes of death + • Info of server settings (anti-griefing and traitor settings) + • Enabled mods + • Error messages + • Crash logs + +The legal basis for the data processing is Art. 6 (1) lit. b, f GDPR. Our legitimate interest is derived from the purposes listed above for data collection. +For more information about privacy related to GameAnalytics Ltd, see the following link: https://gameanalytics.com/privacy/ + +3. Duration of personal data processing +The personal data which is processed according to clause 2, is processed as long, as your player client is active. If you delete your account, any personal data processed so far will be erased. + +4. Forwarding data +Unless stated otherwise under clause 2, your personal data will not be transferred to any third party for any purpose other than those listed below. +We shall forward your personal data to third parties only + • if you have given your explicit consent, in accordance with Art. 6 (1) lit. a GDPR + • if under Art. 6 (1) lit. f GDPR the transfer is necessary for the establishment, exercise or defence of legal claims, and there is no reason to assume that you have an overriding interest, which must be protected, in the non-forwarding of your data + • in the event that there is a legal obligation to forward the data under Art. 6 (1) lit. c GDPR and + • if this is legally permissible and necessary under Art. 6 (1) lit. b GDPR for the processing of contractual relationships with you. + +5. Data subject rights +You have the right: +• pursuant to Art. 15 GDPR, to demand information about your personal data that we have processed. In particular, you can obtain information about the purposes of the processing, The categories of personal data concerned, the recipients or category of recipients to whom you data have been or will be disclosed, the envisaged period for which the data will be stored, the existence of the right to request rectification, erasure, or restriction of the processing, or to object to it, the right to lodge a complaint with a supervisory authority, the source of your data, if these have not been collected by us, and on the existence of automated decision-making, including profiling, and any other meaningful information about their details or the logic involved; + + • pursuant to Art. 16 GDPR, to demand the immediate rectification or completion of inaccurate personal data stored by us; + • pursuant to Art. 17 GDPR, to demand the erasure of personal data stored by us, unless their processing is necessary for exercising the right of freedom of expression and information, for compliance with a legal obligation, for reasons of public interest, or for the establishment, exercise or defence of legal claims; + • pursuant to Art. 18 GDPR, to demand the restriction of the processing of your personal data in cases where you contest the accuracy of the data, where the processing is unlawful yet you oppose the erasure of the personal data, where we no longer need the data but you still require them to establish, exercise or defend legal claims, or where you have objected to the processing of the data pursuant to Art. 21 GDPR; + • pursuant to Art. 20 GDPR, to obtain your personal data that you have provided to us in a structured, commonly used and machine-readable format and to demand the transfer of these data to another controller; + • pursuant to Art. 7 (3) GDPR, to withdraw your consent at any time, which will mean that in future we may no longer carry out the data processing that was contingent upon this consent and + • pursuant to Art. 77 GDPR, to lodge a complaint with a supervisory authority. In general, you can contact the supervisory authority of your usual residence or place of employment, or that of our company headquarters for this purpose. + +6. Right of objection +Insofar as your personal data is processed on the basis of legitimate interests in accordance with Art. 6 (1) f GDPR, you have the right, under Art. 21 GDPR, to object to the processing of your personal data, provided there are reasons relating to your particular situation or if the objection relates to direct marketing. In the latter case, you have a general right to object, which shall be implemented by us without any reference to a particular situation. +If you wish to avail of your right to withdraw or object, an e-mail to info@nimrod-rechtsanwaelte.de will suffice. \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/dbgshim.dll b/Lua For Barotrauma/Binary/dbgshim.dll new file mode 100644 index 0000000..67542dd Binary files /dev/null and b/Lua For Barotrauma/Binary/dbgshim.dll differ diff --git a/Lua For Barotrauma/Binary/freetype6.dll b/Lua For Barotrauma/Binary/freetype6.dll new file mode 100644 index 0000000..640fe2b Binary files /dev/null and b/Lua For Barotrauma/Binary/freetype6.dll differ diff --git a/Lua For Barotrauma/Binary/hintmanager.xml b/Lua For Barotrauma/Binary/hintmanager.xml new file mode 100644 index 0000000..be74d87 --- /dev/null +++ b/Lua For Barotrauma/Binary/hintmanager.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lua For Barotrauma/Binary/hostfxr.dll b/Lua For Barotrauma/Binary/hostfxr.dll new file mode 100644 index 0000000..d1a7806 Binary files /dev/null and b/Lua For Barotrauma/Binary/hostfxr.dll differ diff --git a/Lua For Barotrauma/Binary/hostpolicy.dll b/Lua For Barotrauma/Binary/hostpolicy.dll new file mode 100644 index 0000000..83e39f4 Binary files /dev/null and b/Lua For Barotrauma/Binary/hostpolicy.dll differ diff --git a/Lua For Barotrauma/Binary/liblinux_steam_env.so b/Lua For Barotrauma/Binary/liblinux_steam_env.so new file mode 100644 index 0000000..db4fdec Binary files /dev/null and b/Lua For Barotrauma/Binary/liblinux_steam_env.so differ diff --git a/Lua For Barotrauma/Binary/libsteam_api.dylib b/Lua For Barotrauma/Binary/libsteam_api.dylib new file mode 100644 index 0000000..97b6446 Binary files /dev/null and b/Lua For Barotrauma/Binary/libsteam_api.dylib differ diff --git a/Lua For Barotrauma/Binary/libsteam_api64.dylib b/Lua For Barotrauma/Binary/libsteam_api64.dylib new file mode 100644 index 0000000..97b6446 Binary files /dev/null and b/Lua For Barotrauma/Binary/libsteam_api64.dylib differ diff --git a/Lua For Barotrauma/Binary/libsteam_api64.so b/Lua For Barotrauma/Binary/libsteam_api64.so new file mode 100644 index 0000000..33762a7 Binary files /dev/null and b/Lua For Barotrauma/Binary/libsteam_api64.so differ diff --git a/Lua For Barotrauma/Binary/mscordaccore.dll b/Lua For Barotrauma/Binary/mscordaccore.dll new file mode 100644 index 0000000..23b47eb Binary files /dev/null and b/Lua For Barotrauma/Binary/mscordaccore.dll differ diff --git a/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_4.700.21.26205.dll b/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_4.700.21.26205.dll new file mode 100644 index 0000000..10813b4 Binary files /dev/null and b/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_4.700.21.26205.dll differ diff --git a/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_6.0.822.36306.dll b/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_6.0.822.36306.dll new file mode 100644 index 0000000..a77000f Binary files /dev/null and b/Lua For Barotrauma/Binary/mscordaccore_amd64_amd64_6.0.822.36306.dll differ diff --git a/Lua For Barotrauma/Binary/mscordbi.dll b/Lua For Barotrauma/Binary/mscordbi.dll new file mode 100644 index 0000000..0f36dce Binary files /dev/null and b/Lua For Barotrauma/Binary/mscordbi.dll differ diff --git a/Lua For Barotrauma/Binary/mscorlib.dll b/Lua For Barotrauma/Binary/mscorlib.dll new file mode 100644 index 0000000..e073fc8 Binary files /dev/null and b/Lua For Barotrauma/Binary/mscorlib.dll differ diff --git a/Lua For Barotrauma/Binary/mscorrc.debug.dll b/Lua For Barotrauma/Binary/mscorrc.debug.dll new file mode 100644 index 0000000..d73860e Binary files /dev/null and b/Lua For Barotrauma/Binary/mscorrc.debug.dll differ diff --git a/Lua For Barotrauma/Binary/mscorrc.dll b/Lua For Barotrauma/Binary/mscorrc.dll new file mode 100644 index 0000000..7c97d17 Binary files /dev/null and b/Lua For Barotrauma/Binary/mscorrc.dll differ diff --git a/Lua For Barotrauma/Binary/msquic.dll b/Lua For Barotrauma/Binary/msquic.dll new file mode 100644 index 0000000..e5565ec Binary files /dev/null and b/Lua For Barotrauma/Binary/msquic.dll differ diff --git a/Lua For Barotrauma/Binary/netstandard.dll b/Lua For Barotrauma/Binary/netstandard.dll new file mode 100644 index 0000000..c0567fc Binary files /dev/null and b/Lua For Barotrauma/Binary/netstandard.dll differ diff --git a/Lua For Barotrauma/Binary/soft_oal_x64.dll b/Lua For Barotrauma/Binary/soft_oal_x64.dll new file mode 100644 index 0000000..707098d Binary files /dev/null and b/Lua For Barotrauma/Binary/soft_oal_x64.dll differ diff --git a/Lua For Barotrauma/Binary/steam_api64.dll b/Lua For Barotrauma/Binary/steam_api64.dll new file mode 100644 index 0000000..2b42812 Binary files /dev/null and b/Lua For Barotrauma/Binary/steam_api64.dll differ diff --git a/Lua For Barotrauma/Binary/ucrtbase.dll b/Lua For Barotrauma/Binary/ucrtbase.dll new file mode 100644 index 0000000..0b41078 Binary files /dev/null and b/Lua For Barotrauma/Binary/ucrtbase.dll differ diff --git a/Lua For Barotrauma/Binary/webm_mem_playback_x64.dll b/Lua For Barotrauma/Binary/webm_mem_playback_x64.dll new file mode 100644 index 0000000..cf16200 Binary files /dev/null and b/Lua For Barotrauma/Binary/webm_mem_playback_x64.dll differ diff --git a/Lua For Barotrauma/Binary/workshop.txt b/Lua For Barotrauma/Binary/workshop.txt new file mode 100644 index 0000000..e69de29 diff --git a/Lua For Barotrauma/Binary/x64/SDL2.dll b/Lua For Barotrauma/Binary/x64/SDL2.dll new file mode 100644 index 0000000..8c6230e Binary files /dev/null and b/Lua For Barotrauma/Binary/x64/SDL2.dll differ diff --git a/Lua For Barotrauma/dummyitem.xml b/Lua For Barotrauma/dummyitem.xml new file mode 100644 index 0000000..d1e4d8a --- /dev/null +++ b/Lua For Barotrauma/dummyitem.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Lua For Barotrauma/filelist.xml b/Lua For Barotrauma/filelist.xml new file mode 100644 index 0000000..1c988c9 --- /dev/null +++ b/Lua For Barotrauma/filelist.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Lua Linker/.gitattributes b/Lua Linker/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/Lua Linker/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Lua Linker/.vscode/settings.json b/Lua Linker/.vscode/settings.json new file mode 100644 index 0000000..9ad96dd --- /dev/null +++ b/Lua Linker/.vscode/settings.json @@ -0,0 +1,48 @@ +{ + "Lua.diagnostics.globals": [ + "Game", + "Player", + "Random", + "Hook", + "Timer", + "bit32", + "TotalTime", + "DoFile", + "WayPoint", + "SpawnType", + "Level", + "Submarine", + "Vector2", + "PositionType", + "ServerLog_MessageType", + "Character", + "TraitorMessageType", + "ChatMessageType", + "CauseOfDeathType", + "CreateVector2", + "Item", + "ChatMessage", + "AfflictionPrefab", + "Gap", + "File", + "Networking", + "printNoLog", + "Client", + "SERVER", + "setmodulepaths", + "Type", + "BindingFlags", + "UserData", + "LuaUserData", + "CLIENT", + "ContentPackageManager" + ], + "Lua.diagnostics.libraryFiles": "Enable", + "Lua.workspace.library": [ + "G:\\globalShare\\Documents\\luatypes\\types\\server", + "G:\\globalShare\\Documents\\luatypes\\types\\shared", + "/mnt/ShareBig/globalShare/Documents/luatypes/types/client", + "/mnt/ShareBig/globalShare/Documents/luatypes/types/server", + "/mnt/ShareBig/globalShare/Documents/luatypes/types/shared" + ] +} \ No newline at end of file diff --git a/Lua Linker/Item.xml b/Lua Linker/Item.xml new file mode 100644 index 0000000..1f43f59 --- /dev/null +++ b/Lua Linker/Item.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lua Linker/LICENSE b/Lua Linker/LICENSE new file mode 100644 index 0000000..e62ec04 --- /dev/null +++ b/Lua Linker/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Lua Linker/Lua/Autorun/luaDisplaySideBySide.lua b/Lua Linker/Lua/Autorun/luaDisplaySideBySide.lua new file mode 100644 index 0000000..6fe1d34 --- /dev/null +++ b/Lua Linker/Lua/Autorun/luaDisplaySideBySide.lua @@ -0,0 +1,84 @@ +local findtarget = dofile(... .. "/Lua/findtarget.lua") + +local function AddMessage(text, client) + local message = ChatMessage.Create("Lua Linker", text, ChatMessageType.Default, nil, nil) + message.Color = Color(60, 100, 255) + + if CLIENT then + Game.ChatBox.AddMessage(message) + else + Game.SendDirectChatMessage(message, client) + end +end + +local linksDisplaySideBySide = {} + +Hook.Add("luaDisplaySideBySide.onUse", "lualinker.luaDisplaySideBySide",function(statusEffect, delta, item) + local target = findtarget.findtarget(item) + if CLIENT and Game.IsMultiplayer then + return + end + local owner = findtarget.FindClientCharacter(item.ParentInventory.Owner) + + if target == nil then + AddMessage("No item found", owner) + return + end + + if linksDisplaySideBySide[item] == nil then + linksDisplaySideBySide[item] = target + -- AddMessage(string.format("Link Start: \"%s\"", target.Name), owner) + + if target.DisplaySideBySideWhenLinked == true then + + target.DisplaySideBySideWhenLinked = false + AddMessage(string.format( + "Removed DisplaySideBySideWhenLinked from \"%s\"", + target.Name), owner) + + if SERVER then + -- lets send a net message to all clients so they remove our DisplaySideBySideWhenLinked + local msg = Networking.Start("luaDisplaySideBySide.remove") + msg.WriteUInt16(UShort(target.ID)) + Networking.Send(msg) + end + + linksDisplaySideBySide[item] = nil + return + else + + -- target.AddLinked(otherTarget) + -- otherTarget.AddLinked(target) + -- otherTarget.DisplaySideBySideWhenLinked = true + + target.DisplaySideBySideWhenLinked = true + AddMessage(string.format( + "Added DisplaySideBySideWhenLinked to \"%s\"", + target.Name), owner) + + if SERVER then + -- lets send a net message to all clients so they add our DisplaySideBySideWhenLinked + local msg = Networking.Start("luaDisplaySideBySide.add") + msg.WriteUInt16(UShort(target.ID)) + Networking.Send(msg) + end + + linksDisplaySideBySide[item] = nil + return + end + end +end) + +if CLIENT and Game.IsMultiplayer then + Networking.Receive("luaDisplaySideBySide.add", function(msg) + local target = Entity.FindEntityByID(msg.ReadUInt16()) + + target.DisplaySideBySideWhenLinked = true + end) + + Networking.Receive("luaDisplaySideBySide.remove", function(msg) + local target = Entity.FindEntityByID(msg.ReadUInt16()) + + target.DisplaySideBySideWhenLinked = false + end) +end diff --git a/Lua Linker/Lua/Autorun/lualinker.lua b/Lua Linker/Lua/Autorun/lualinker.lua new file mode 100644 index 0000000..b726b6e --- /dev/null +++ b/Lua Linker/Lua/Autorun/lualinker.lua @@ -0,0 +1,105 @@ +-- TODO add some comments and clean up the code, this is bad for now lol +-- add split up to funcion's file and the file with hooks and shit + +local findtarget = dofile(... .. "/Lua/findtarget.lua") + +local function LinkAdd(target, otherTarget) + target.AddLinked(otherTarget) + otherTarget.AddLinked(target) + otherTarget.DisplaySideBySideWhenLinked = true + target.DisplaySideBySideWhenLinked = true +end + +local function LinkRemove(target, otherTarget) + target.RemoveLinked(otherTarget) + otherTarget.RemoveLinked(target) +end + +local function AddMessage(text, client) + local message = ChatMessage.Create("Lua Linker", text, ChatMessageType.Default, nil, nil) + message.Color = Color(60, 100, 255) + + if CLIENT then + Game.ChatBox.AddMessage(message) + else + Game.SendDirectChatMessage(message, client) + end +end + +local links = {} + +Hook.Add("luaLinker.onUse", "lualinker.luaLinker", function(statusEffect, delta, item) + local target = findtarget.findtarget(item) + if CLIENT and Game.IsMultiplayer then + return + end + local owner = findtarget.FindClientCharacter(item.ParentInventory.Owner) + + if target == nil then + AddMessage("No item found", owner) + return + end + + if links[item] == nil then + links[item] = target + AddMessage(string.format("Link Start: \"%s\"", target.Name), owner) + findtarget.currsor_pos = 0 + else + local otherTarget = links[item] + + if otherTarget == target then + AddMessage("The linked items cannot be the same", owner) + links[item] = nil + return + end + + for key, value in pairs(target.linkedTo) do + if value == otherTarget then + LinkRemove(target, otherTarget) + + AddMessage(string.format("Removed link from \"%s\" and \"%s\"", target.Name, otherTarget.Name), owner) + links[item] = nil + + if SERVER then + -- lets send a net message to all clients so they remove our link + local msg = Networking.Start("lualinker.remove") + msg.WriteUInt16(UShort(target.ID)) + msg.WriteUInt16(UShort(otherTarget.ID)) + Networking.Send(msg) + end + + return + end + end + + LinkAdd(target, otherTarget) + + local text = string.format("Linked \"%s\" into \"%s\"", otherTarget.Name, target.Name) + AddMessage(text, owner) + + if SERVER then + -- lets send a net message to all clients so they add our link + local msg = Networking.Start("lualinker.add") + msg.WriteUInt16(UShort(target.ID)) + msg.WriteUInt16(UShort(otherTarget.ID)) + Networking.Send(msg) + end + + links[item] = nil + findtarget.currsor_pos = 0 + end +end) + +if CLIENT and Game.IsMultiplayer then + Networking.Receive("lualinker.add", function (msg) + local target = Entity.FindEntityByID(msg.ReadUInt16()) + local otherTarget = Entity.FindEntityByID(msg.ReadUInt16()) + LinkAdd(target, otherTarget) + end) + + Networking.Receive("lualinker.remove", function (msg) + local target = Entity.FindEntityByID(msg.ReadUInt16()) + local otherTarget = Entity.FindEntityByID(msg.ReadUInt16()) + LinkRemove(target, otherTarget) + end) +end \ No newline at end of file diff --git a/Lua Linker/Lua/findtarget.lua b/Lua Linker/Lua/findtarget.lua new file mode 100644 index 0000000..8b59d53 --- /dev/null +++ b/Lua Linker/Lua/findtarget.lua @@ -0,0 +1,80 @@ +local findtarget = {} + +-- findowner +findtarget.FindClientCharacter = function(character) + if CLIENT then return nil end + + for key, value in pairs(Client.ClientList) do + if value.Character == character then + return value + end + end +end + +findtarget.cursor_pos = Vector2(0, 0) +findtarget.cursor_updated = false + +local function FindClosestItem(submarine, position) + local closest = nil + for key, value in pairs(submarine and submarine.GetItems(false) or Item.ItemList) do + if value.Linkable and not value.HasTag("notlualinkable") and not value.HasTag("crate") and not value.HasTag("ammobox") and not value.HasTag("door") and not value.HasTag("smgammo") and not value.HasTag("hmgammo") and value.NonInteractable == false then + -- check if placable or if it does not have holdable component + local check_if_p_or_nh = false + local holdable = value.GetComponentString("Holdable") + if holdable == nil then + check_if_p_or_nh = true + else + if holdable.attachable == true then + check_if_p_or_nh = true + end + end + if check_if_p_or_nh == true then + if Vector2.Distance(position, value.WorldPosition) < 100 then + if closest == nil then closest = value end + if Vector2.Distance(position, value.WorldPosition) < + Vector2.Distance(position, closest.WorldPosition) then + -- this should prevent items that are inside inventories from being linkable + if value.ParentInventory == nil then + closest = value + end + end + end + end + end + end + return closest +end + +findtarget.findtarget = function(item) + if CLIENT and Game.IsMultiplayer then + -- for better accuracy + local client_cursor_pos = (item.ParentInventory.Owner).CursorWorldPosition + local msg = Networking.Start("lualinker.clientsidevalue") + msg.WriteSingle(client_cursor_pos.X) + msg.WriteSingle(client_cursor_pos.Y) + Networking.Send(msg) + return + end + + -- SinglePlayer + if not Game.IsMultiplayer then + findtarget.cursor_pos = item.ParentInventory.Owner.CursorWorldPosition + end + -- fallback + if not findtarget.cursor_updated and Game.IsMultiplayer then + findtarget.cursor_pos = item.WorldPosition + end + + if item.ParentInventory == nil or item.ParentInventory.Owner == nil then return end + + local target = FindClosestItem(item.Submarine, findtarget.cursor_pos) + return target +end + +Networking.Receive("lualinker.clientsidevalue", function(msg) + local position = Vector2(msg.ReadSingle(), msg.ReadSingle()) + findtarget.cursor_pos = position + findtarget.cursor_updated = true +end) + +return findtarget diff --git a/Lua Linker/Lualinker.ogg b/Lua Linker/Lualinker.ogg new file mode 100644 index 0000000..7b7c40d --- /dev/null +++ b/Lua Linker/Lualinker.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f08151094ca2b30f405af074425d627b007b1d9a0e4005ad493e4c484f53781 +size 6377 diff --git a/Lua Linker/README.md b/Lua Linker/README.md new file mode 100644 index 0000000..f110aec --- /dev/null +++ b/Lua Linker/README.md @@ -0,0 +1,2 @@ +# Lua Linker + diff --git a/Lua Linker/TODO.txt b/Lua Linker/TODO.txt new file mode 100644 index 0000000..97896a0 --- /dev/null +++ b/Lua Linker/TODO.txt @@ -0,0 +1 @@ +nothing \ No newline at end of file diff --git a/Lua Linker/filelist.xml b/Lua Linker/filelist.xml new file mode 100644 index 0000000..b95f2b7 --- /dev/null +++ b/Lua Linker/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lua Linker/toolgun.png b/Lua Linker/toolgun.png new file mode 100644 index 0000000..d42c62c --- /dev/null +++ b/Lua Linker/toolgun.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b157a04a42c0e2946959894ac73ffc336ae1c39f1c1e9b0a989e9bca1562150f +size 73661 diff --git a/NT Informative Descriptions/Localization/English/Afflictions.xml b/NT Informative Descriptions/Localization/English/Afflictions.xml new file mode 100644 index 0000000..524f074 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/Afflictions.xml @@ -0,0 +1,318 @@ + + + + + + The entry site is a small, dark, bruised hole oozing a little blood. The exit wound, however, is a large ragged mess of exposed tissue, and it's pouring blood. An infection will likely occur, and there are probably still bullets inside. This wound does not naturally heal beyond 50%. + The bullet missed all the important bits, but the pain is real and so is the risk of infection. There may still be bullets inside. + The area is an ugly shade of purple, and apparently very painful to touch. You suspect a bone might be broken. This wound can't be stitched. + A light bruise shows where something hit, but it doesn’t look like anything is broken. This wound can't be stitched, however. + The skin is pierced and there are deep, bleeding wounds. This will probably cause an infection. This wound does not naturally heal beyond 50% + The cuts look worse than they really are, but a possible infection should not be ruled out. + There is extensive damage to soft tissue in the area and there are asymmetrical, bleeding wounds. This will probably cause an infection. This wound does not naturally heal beyond 100%. + Something tried to take a big chomp but luckily only caught a nibble. It might cause an infection, though. + The area is colored purple. The tissue underneath feels different than the surrounding skin. An infection is likely, and so is shrapnel. This wound does not naturally heal beyond 50%. + The area of skin appears slightly bruised. There might be an infection or remaining shrapnel. + Blood pours freely from this ragged and particularly nasty open wound. If it gets any worse, it may induce an arterial rupture. + Blood is slowly dripping out from the wound. + Blood is gushing out at an alarming rate. It might induce an arterial rupture. + The skin is clammy and the patient is vomiting periodically. Vomiting will cause alkalosis. + Feeling queasy, but nothing a rest wouldn't fix. Vomiting will cause alkalosis. + You are really sick. Should you worry about it or just rest? Vomiting will cause alkalosis. + The rush of adrenaline is making the patient less easily stunned. + The rush of adrenaline is making you less easily stunned. + Miracle In Progress + Your lifeforces are fading, yet one Doctor shines bright like a beacon. While they're nearby, you won't give in, not even to neurotrauma. + + + Fractured right humerus + The right arm is broken, likely due to physical trauma. It will be painful and prevent the use of this arm until a gypsum cast is put on, or it is surgically repaired. + Fractured left humerus + The left arm is broken, likely due to physical trauma. It will be painful and prevent the use of this arm until a gypsum cast is put on, or it is surgically repaired. + Fractured right femur + The right leg is broken, likely due to physical trauma. It will be painful and movement will be difficult until a gypsum cast is put on, or it is surgically repaired. + Fractured left femur + The right leg is broken, likely due to physical trauma. It will be painful and movement will be difficult until a gypsum cast is put on, or it is surgically repaired. + Fractured ribs + One or more ribs have been broken, likely due to physical trauma. The structural instability may cause pneumothorax. It must be repaired in an osteosynthesis surgery. + Fractured skull + The skull has been broken, likely due to physical trauma. Bone fragments and structural instability will cause a small amount of neurotrauma. It must be repaired in an osteosynthesis surgery. + Fractured neck + The neck has been broken due to trauma. Structural instability exposes the spinal cord, causing injury to it with ease. It must be repaired in an osteosynthesis surgery. + Traumatic amputation + Most of the right arm was torn off by physical trauma, causing an artery to rupture. This limb must be replaced after sawing bones. + Traumatic amputation + Most of the left arm was torn off by physical trauma, causing an artery to rupture. This limb must be replaced after sawing bones. + Traumatic amputation + Most of the right leg was torn off by physical trauma, causing an artery to rupture. This limb must be replaced after sawing bones. + Traumatic amputation + Most of the left leg was torn off by physical trauma, causing an artery to rupture. This limb must be replaced after sawing bones. + Traumatic amputation + The head has been torn off by an explosion, causing immediate death. + Spinal cord injury + The spine has been injured due to exposure from a neck fracture, causing full-body paralysis and analgesia. They are still conscious. It must be surgically repaired using spinal cord implants. + Dislocation + A bone in the right leg has been displaced by physical trauma, causing pain and making movement difficult. A bandage will restore use of this limb, and a wrench may be used to relocate the bone. + Dislocation + A bone in the left leg has been displaced by physical trauma, causing pain and making movement difficult. A bandage will restore use of this limb, and a wrench may be used to relocate the bone. + Dislocation + A bone in the right arm has been displaced by physical trauma, causing pain and inability to use this limb. A bandage will restore use of this limb, and a wrench may be used to relocate the bone. + Dislocation + A bone in the left arm has been displaced by physical trauma, causing pain and inability to use this limb. A bandage will restore use of this limb, and a wrench may be used to relocate the bone. + Femoral artery bleeding + The left femoral artery has been cut by foreign bodies or induced by severe bleeding, and is causing severe bloodloss. It should be suppressed by a tourniquet until surgically fixed. + Femoral artery bleeding + The right femoral artery has been cut by foreign bodies or induced by severe bleeding, and is causing severe bloodloss. It should be suppressed by a tourniquet until surgically fixed. + Brachial artery bleeding + The left brachial artery has been cut by foreign bodies or induced by severe bleeding, and is causing severe bloodloss. It should be suppressed by a tourniquet until surgically fixed. + Brachial artery bleeding + The right brachial artery has been cut by foreign bodies or induced by severe bleeding, and is causing severe bloodloss. It should be suppressed by a tourniquet until surgically fixed. + Carotid artery bleeding + The carotid artery has been cut by foreign bodies or induced by severe bleeding, and is causing severe bloodloss. It is dangerous to stop it using a tourniquet, and must be surgically fixed. + Gangrene + The extremity has shrunk and turned black, due to sepsis or suppressed bloodflow. The limb must be amputated beyond 15%, as it will no longer heal. + First-degree burn + The area is red and painful to the touch, but it will not cause an infection unless it is severe. Bandages or antibiotic gels are sufficient treatment, if necessary. + Second-degree burn + There are very painful blisters littering the affected area. There is a high rate of infection, which will lead to self-destructive sepsis. Bandages or antibiotic gels are sufficient treatment. + Third-degree burn + It is painless in this leathery, stiff area. Infection is almost immediate, and the onset of sepsis is rapid. Antibiotic glue is the most rapid treatment. + + Increased heartrate + Heartrate is abnormally high. If increasing in strength, potentially-lethal fibrillation is occurring, usually due to hypotension or hypoxemia. + Irregular heartbeat + Heartbeat has an abnormal pattern. Fibrillation is potentially lethal, usually caused by hypotension or hypoxemia. + Cardiac arrest + No heartbeat. A lethal status that will prevent blood pressure from normalizing, along with causing a coma if untreated. The ultimate result of fibrillation, as well being caused by hypoxemia. The heart must be restarted using a defibrillator, adrenaline, or AutoPulse. + Respiratory arrest + No breathing. A lethal status that will prevent oxygenation of blood. Typically caused by hypoxemia or opiate overdose. Artificial ventilation will bypass this affliction and the acidosis caused by it. + Hyperventilation + Breathing rate is abnormally high. Gradually increases non-lethal alkalosis, and is usually caused by hypotension, hypoxemia, or pneumothorax. + Hypoventilation + Breathing rate is abnormally low. Gradually increases potentially-lethal acidosis, which can be prevented by artificial ventilation. It is usually caused by analgesia. Severe acidosis will cause fibrillation. + Shortness of breath + Breathing is difficult. Usually caused by cardiac tamponade, pneumothorax, or hypoxemia. + Cough + Periodic coughing. Caused by cardiac tamponade, lung, or heart damage. + Pale skin + The skin is pale. Caused by hypoxemia or blood loss. + Lightheadedness + Dizzy sensation. Caused by hypotension. + Blurred vision + Difficulty in ocular focus. Usually caused by hypotension or a concussion. + Confusion + Difficulty in forming thoughts. Usually caused by hypoxemia, acidosis, or a concussion. + Headache + Pain in the head. Usually caused by hypoxemia, a skull fracture, acidosis, a concussion, or a stroke. + Leg swelling + A buildup of fluid in the legs. Caused by liver, kidney, or severe heart damage. + Weakness + Reduced muscular ability in the extremities. Caused by cardiac tamponade, bloodloss, or acidosis. + Wheezing + Breathing produces high-pitched noises. Caused by hemotransfusion shock. + Vomiting + Periodic vomiting. Usually caused by kidney damage, alcohol, or hemotransfusion shock. Vomiting will cause alkalosis. + Vomiting blood + Periodic vomiting of blood. Usually caused by severe internal bleeding or liver failure. + Fever + Abnormally high body temperature. Usually caused by sepsis. + Abdominal discomfort + Discomfort in the abdomen. Caused by liver damage. + Bloating + Bloating abdomen. Caused by liver damage. + Jaundice + The skin is yellow. Caused by severe liver damage. + Sweating + Abnormally excessive sweating. Caused by a heart attack or drug withdrawal. + Palpitations + Sensation of a pounding heartbeat. Caused by alkalosis. + Unconsciousness + They are unconscious. Usually caused by severe physical trauma, hypoxemia, neurotrauma, an aortic rupture, or opiate overdose. + Inflammation + Tissue appears swollen. Caused by an infection or foreign bodies. + Spasm + Involuntary muscle contractions caused by a seizure. Usually caused by severe acidosis or alkalosis, a stroke, opiate overdose, or radiation sickness. + Seizure + They are having a full-body seizure. Usually caused by severe acidosis or alkalosis, a stroke, opiate overdose, or radiation sickness. + Craving + A craving for drugs, caused by withdrawal. + On fire! + Burn those who dare to care for me... + Chest pain + Piercing pain in the chest. Caused by rib fractures or hemotransfusion shock. + Abdominal pain + Pain in the abdomen. Caused by hemotransfusion shock. + Intense pain + Very strong pain. Usually caused by dislocations or fractures. + Nausea + A nauseous sensation. Usually caused by kidney damage, a concussion, drug withdrawal, or hemotransfusion shock. Vomiting will cause alkalosis. + + + Traumatic shock + Usually occurring during unsafe surgery conditions, causing potentially-lethal hypotension. For safe surgery, a patient must be analgesized and near any bed, or be unconscious. + Surgery Incision + An incision has been made by a scalpel. It is painful. It also causes bloodloss, which is prevented by a hemostat. + Clamped Bleeding + Surgical bleeders have been staunched. This doesn't prevent pain from the incision. + Retracted Skin + The skin is being held open by a set of retractors. It is indescribably uncomfortable, and can only be safely done near a surgery table or hospital bed, when laying down on any bed, or when unconscious. + Stitched Incision + An incision has been closed via sutures. + Drilled Bones + The bones have been drilled, allowing the installation of osteosynthesis implants. + Sawed Bones + The bone has been surgically sawed off to remove a limb, or to prepare for the installation of another. + Heart removed + The heart has been surgically removed. A heart is required to pump oxygenated blood. Heart damage is usually caused by hypoxemia, a heart attack, or gunshot wounds. + Brain removed + The brain has been surgically removed. A brain is required for consciousness. Neurotrauma is usually caused by hypoxemia, a stroke, or the lack of a brain. Additionally, they splatter when hitting the ground. + Lungs removed + The lungs have been surgically removed. Lungs are required to oxygenate blood. Lung damage is usually caused by hypoxemia, gunshot wounds, or heavy smoking. + Kidneys removed + The kidneys have been surgically removed. Kidneys are required to regulate acidosis, strong bones, and blood pressure, but a person can live with only one. Kidney damage is usually caused by hypoxemia or gunshot wounds. + Liver removed + The liver has been surgically removed. A liver is required to clot bleeding and regulate blood pressure. Liver damage is usually caused by hypoxemia, gunshot wounds, or heavy drinking. + Clamped arteries + Bleeding from artery has been stopped, but blood flow to the extremity is severely reduced, causing gangrene if left on for too long. + Ballooned aorta + The aorta has stopped bleeding, but bloodflow to the extremities is gone, causing gangrene if left on for too long. + Amputation + The right arm has been surgically amputated. This procedure does not rupture arteries. + Amputation + The left arm has been surgically amputated. This procedure does not rupture arteries. + Amputation + The right leg has been surgically amputated. This procedure does not rupture arteries. + Amputation + The left leg has been surgically amputated. This procedure does not rupture arteries. + Amputation + The head has been surgically amputated. This procedure does not rupture arteries... but causes immediate death. + + + Splint + Fracture has been splinted. + Bandaged + Protects from infection, stabilizes dislocations and fractures, and promotes wound healing. It restricts movement slightly. Does not improve the healing of open wounds if they are too severe. + Dirty bandage + A bandage that has been overused and should be removed or replaced, as it promotes infections. + Plaster Cast + Fully stabilizes fractures, allowing them to heal. It restricts movement notably. + Ointment + A layer of antibiotic gel protects and cleans the wound from any germs. + Needle + A needle with an air valve in the chest is preventing pneumothorax from worsening. + Stimulated Bone Growth + Bone regrowth has been stimulated. To cure bone death, this affliction needs to be on every bodypart. + Analgesia + Painlessness suppresses certain symptoms and makes surgery possible. At high levels, increases damage and stun resistance. + Anesthesia + A drug has induced controlled unconsciousness. It is safe to perform surgery on this person. + Stitched wound + Wounds have been sutured shut. Sutured wounds will heal much faster than open wounds, and are impervious to infection. + Chilled + A cold gel pack is improving the healing of blunt force trauma. It restricts movement slightly and worsens infections. + + Lualess + Lua isn't running. That means neurotrauma and any other mods that use it won't work. Please read the workshop pages of mods you plan to use. + Mod conflict + There is a mod conflict. A different mod is overriding some of the same items Neurotrauma does. Some things may not function correctly. Please adjust your load order, or if this is intended, disable the mod conflict check in the Neurotrauma config. + + + Died of paralysis + You have died of paralysis. + Necrosis + + Died from a necrotic wound. + You have died from necrosis. + Aortic rupture + Immunity + + Infected wound + + Sepsis + + Adrenaline + + Anti-clot + + Thiamine + + Blood pressure reducers + + Saline + + Ringer's solution + + Mannitol + + Antibiotics + + Immunosuppressants + + Hemotransfusion shock + + Foreign body + + Cardiac tamponade + + Internal bleeding + + Heart attack + + Heart damage + + Heart failure + + Neurotrauma + + Death by neurotrauma + You have died of neurotrauma. + Stroke + + Seizure + + Coma + + Blood pressure + + Hypoxemia + + Alkalosis + + Acidosis + + Radiation induced lung injury + + Pneumothorax + + Lung damage + + Lung failure + + Kidney damage + + Kidney failure + + Bone damage + + Bone death + + Liver damage + + Liver failure + + Alive + Conscious + Patient_name + Vitality + Heartrate + Breathingrate + Bloodpressure + Bloodoxygen + Neurotrauma + Organdamage + In_surgery + Cause_of_death + Blood_pH + Surgical + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/Cybernetics.xml b/NT Informative Descriptions/Localization/English/Cybernetics.xml new file mode 100644 index 0000000..282c745 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/Cybernetics.xml @@ -0,0 +1,87 @@ + + + + + + Makes electrical repairs and rewiring possible. Also used to ‖color:gui.green‖tighten screws‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖, and to surgically ‖color:gui.green‖repair‖end‖ ‖color:gui.blue‖cyberorgans‖end‖. + A screwdriver that has gone through a process of hardening using depleted fuel. The strengthened material allows for more efficient repairs and heavier swings. Also used to ‖color:gui.green‖tighten screws‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖, and to surgically ‖color:gui.green‖repair‖end‖ ‖color:gui.blue‖cyberorgans‖end‖. + Fabricated from the poorly understood alien material dementonite. Holding it evokes a strange sense of unease. Also used to ‖color:gui.green‖tighten screws‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖, and to surgically ‖color:gui.green‖repair‖end‖ ‖color:gui.blue‖cyberorgans‖end‖. + Field-programmable gate array—a multipurpose circuit that can be reconfigured for use in a large variety of electrical devices. Also used to replace ‖color:gui.green‖broken circuitry‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖. + One of the most crucial tools on board the submarine. Also works underwater, and is used to repair ‖color:gui.green‖bent metal‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖. + A strong metal alloy of iron and carbon. Used in fuel rod manufacturing, as well as many military applications. Also used to replace ‖color:gui.green‖lost material‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖. + + Cyberarm + A powerful inorganic arm which cannot ‖color:gui.green‖bleed‖end‖ or ‖color:gui.green‖fracture‖end‖. Additionally, it will increase ‖color:gui.green‖swimming speed‖end‖ and ‖color:gui.green‖melee damage‖end‖. However, it requires ‖color:gui.red‖maintenance‖end‖ and is susceptible to ‖color:gui.red‖water damage‖end‖. It can be installed after amputation. + Cyberleg + A powerful inorganic leg which cannot ‖color:gui.green‖bleed‖end‖ or ‖color:gui.green‖fracture‖end‖. Additionally, it will increase ‖color:gui.green‖running speed‖end‖. However, it requires ‖color:gui.red‖maintenance‖end‖ and is susceptible to ‖color:gui.red‖water damage‖end‖. It can be installed after amputation. + Waterproof Cyberarm + A powerful inorganic arm which cannot ‖color:gui.green‖bleed‖end‖ or ‖color:gui.green‖fracture‖end‖. Additionally, it will increase ‖color:gui.green‖swimming speed‖end‖ and ‖color:gui.green‖melee damage‖end‖. It requires ‖color:gui.red‖maintenance‖end‖, but is not susceptible to ‖color:gui.green‖water damage‖end‖. It can be installed after amputation. + Waterproof Cyberleg + A powerful inorganic leg which cannot ‖color:gui.green‖bleed‖end‖ or ‖color:gui.green‖fracture‖end‖. Additionally, it will increase ‖color:gui.green‖running speed‖end‖. It requires ‖color:gui.red‖maintenance‖end‖, but is not susceptible to ‖color:gui.green‖water damage‖end‖. It can be installed after amputation. + + Cyberarm + This inorganic arm is impervious to biological faults, but it must be maintained to be effective. It can be brutally removed using a crowbar. + Cyberleg + This inorganic leg is impervious to biological faults, but it must be maintained to be effective. It can be brutally removed using a crowbar. + Loose screws + Screws have loosened as a result of physical trauma, or from other loose screws. If the screws are not tightened using a screwdriver, motion may loosen more screws. + Damaged electronics + Delicate circuitry has been damaged by water or physical trauma. If the circuits are not replaced by FPGAs, the limb may occasionally malfunction. + Bent metal + The limb has been bent by physical trauma, making it harder to use. It can be welded back in place. + Material loss + The limb has lost parts due to physical trauma. It can be repaired using steel. If too many parts are lost, the limb may be destroyed. Loose screws make it easier to lose parts. + Waterproof + This cyberlimb does not take water damage. + + Cyber-Augmented Liver + A partially synthetic human liver. Cyber-enhanced metabolism improves resistance against ‖color:gui.green‖poisons‖end‖, ‖color:gui.green‖negative drug effects‖end‖, and dampens ‖color:gui.green‖nausea‖end‖. Negative drug effects include drunkenness, addiction, withdrawal, and overdose. It is more resistant to ‖color:gui.green‖damage‖end‖ than a biological liver, and takes the place of the liver. + Cyber-Augmented Kidney + A pair of partially synthetic human kidneys. Cyber-enhanced metabolism improves ‖color:gui.green‖blood clotting‖end‖ and ‖color:gui.green‖synthesis‖end‖. Blood type changes to C+, preventing cyberorgan ‖color:gui.green‖rejection‖end‖, and allowing ‖color:gui.green‖acceptance‖end‖ from all other blood types. It is more resistant to ‖color:gui.green‖damage‖end‖ than biological kidneys, and takes the place of both kidneys. + Cyber-Augmented Heart + A partially synthetic human heart. Cyber-enhanced metabolism slightly increases ‖color:gui.green‖health‖end‖ and improves ‖color:gui.green‖blood pressure normalization‖end‖ rate. Causes ‖color:gui.green‖hyperactivity‖end‖, which is further increased with the use of ‖color:gui.blue‖cyber-enhanced lungs‖end‖. It is more resistant to ‖color:gui.green‖damage‖end‖ than a biological heart, and takes the place of the heart. + Cyber-Augmented Lungs + A pair of partially synthetic human lungs. Cyber-enhanced metabolism improves oxygen capacity, increasing resistance against ‖color:gui.green‖hypoxemia‖end‖. Provides temporary pressure resistance. Causes ‖color:gui.green‖hyperactivity‖end‖, which is further increased with the use of a ‖color:gui.blue‖cyber-enhanced heart‖end‖. It is more resistant to ‖color:gui.green‖damage‖end‖ and ‖color:gui.green‖pneumothorax‖end‖ than biological lungs, and takes the place of the lungs. + Cyber-Augmented Brain Implant + A neural augmentation chip. Cyber-enhanced neural processing improves ‖color:gui.green‖intelligence‖end‖, and ‖color:gui.green‖pain receptors‖end‖ are permanently inhibited. It increases resistance to ‖color:gui.green‖neurotrauma‖end‖, and is implanted into the brain. + Cyberliver + A synthetic human liver. Cyber-metabolism greatly improves resistance against ‖color:gui.green‖poisons‖end‖, ‖color:gui.green‖negative drug effects‖end‖, and greatly dampens ‖color:gui.green‖nausea‖end‖. Negative drug effects include drunkenness, addiction, withdrawal, and overdose. It is significantly more resistant to ‖color:gui.green‖damage‖end‖ than a biological liver, and takes the place of the liver. + Cyberkidney + A pair of synthetic human kidneys. Cyber-metabolism greatly improves ‖color:gui.green‖blood clotting‖end‖ and ‖color:gui.green‖synthesis‖end‖. Blood type changes to C+, preventing cyberorgan ‖color:gui.green‖rejection‖end‖, and allowing ‖color:gui.green‖acceptance‖end‖ from all other blood types. It is significantly more resistant to ‖color:gui.green‖damage‖end‖ than biological kidneys, and takes the place of both kidneys. + Cyberheart + A synthetic human heart. Cyber-metabolism increases ‖color:gui.green‖health‖end‖ and greatly improves ‖color:gui.green‖blood pressure normalization‖end‖ rate. Greatly increases ‖color:gui.green‖fast-twitch muscle speed‖end‖, which is further increased with the use of ‖color:gui.blue‖cyber-enhanced lungs‖end‖. It is significantly more resistant to ‖color:gui.green‖damage‖end‖ than a biological heart, and takes the place of the heart. + Cyberlungs + A pair of synthetic human lungs. Cyber-metabolism greatly improves oxygen capacity, greatly increasing resistance against ‖color:gui.green‖hypoxemia‖end‖. Provides temporary pressure resistance. Greatly increases ‖color:gui.green‖fast-twitch muscle speed‖end‖, which is further increased with the use of a ‖color:gui.blue‖cyber-enhanced heart‖end‖. It is significantly more resistant to ‖color:gui.green‖damage‖end‖ and ‖color:gui.green‖pneumothorax‖end‖ than biological lungs, and takes the place of the lungs. + Cyberbrain Positronic Implant + A positronic neural chipset. Cybernetic computational processors greatly improve ‖color:gui.green‖intelligence‖end‖, and ‖color:gui.green‖pain receptors‖end‖ are permanently inhibited. It greatly increases resistance to ‖color:gui.green‖neurotrauma‖end‖, and is implanted into the brain. + + Pressurized Cyberlung + The Cyberlung has self-pressurized, briefly preventing implosion. + The Cyberlung has resisted severe pressure, and is undertaking self-repair routines. + + Blood Pack C+ + Administerable to: C+ + Donor card C+ + Can take blood from: all of them + Can give blood to: C+ + Immunoblocker Inhaler + Partially inhibits the ‖color:gui.red‖immune system‖end‖, sufficient enough to prevent ‖color:gui.green‖cyberpsychosis‖end‖. Cyberpsychosis is caused by the use of fully synthetic ‖color:gui.blue‖cyberorgans‖end‖. + + Cyberpsychosis + The patient is suffering from Cyberpsychosis, a mental disorder caused by excessive cybernetic implants. + Cyberpsychosis Resistance + The patient has resistance to Cyberpsychosis. + Inhaled Immunosuppressants + + Cyberliver + An installed cybernetic liver. Provides resistance against poisons, negative drug effects, nausea, and liver damage. + Cyberkidneys + Installed cybernetic kidneys. Provides resistance against bleeding, bloodloss, kidney damage, and changes blood type to C+. + Cyberlungs + Installed cybernetic lungs. Provides resistance against hypoxemia, temporary pressure, lung damage, pneumothorax, and increases muscle speed. + Cyberheart + An installed cybernetic heart. Provides resistance against heart damage, increases health, blood pressure normalization rate, and muscle speed. + Cyberbrain Implant + An installed brain implant. Provides resistance against neurotrauma, increases intelligence, and inhibits pain. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/ImmersiveRepairs.xml b/NT Informative Descriptions/Localization/English/ImmersiveRepairs.xml new file mode 100644 index 0000000..d15ede4 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/ImmersiveRepairs.xml @@ -0,0 +1,11 @@ + + + + + + Welding Torch + Welds twice as fast as the welding tool, but can't be used underwater. Also can be used to repair ‖color:gui.green‖bent metal‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖. + Multitool + An incredibly fast and easy to use tool for repairs. No skills required! Just point directly at whatever you want to repair and pull the trigger. Breaks down rapidly from usage. Can be repaired by installing a new fpga circuit. Also used to ‖color:gui.green‖tighten screws‖end‖ on a ‖color:gui.blue‖cyberlimb‖end‖. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/Items.xml b/NT Informative Descriptions/Localization/English/Items.xml new file mode 100644 index 0000000..4f56ac1 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/Items.xml @@ -0,0 +1,260 @@ + + + + + + + Health Scanner + A tool that uses battery power to display afflictions. It can be aimed at a person for a full-body scan, or administered in the Health UI to show afflictions on a specific body part. Using the scanner causes a minor amount of ‖color:gui.red‖radiation sickness‖end‖. Will not display blood type, sepsis, immunity, acidosis, alkalosis, or drugs, as a ‖color:gui.blue‖hematology analyzer‖end‖ is required. + Makes mechanical repairs possible. It is also used to fix ‖color:gui.green‖dislocations‖end‖, which only requires half the skill to do if the patient does not feel pain. Failing to fix a dislocation will result in a ‖color:gui.red‖fracture‖end‖, however. + + Allows limited access to areas of the sub. A ‖color:gui.blue‖printed donor card‖end‖ can be slotted into it. + A ‖color:gui.blue‖printed donor card‖end‖ can be slotted into it. + Blood extracted from a Europan lifeform. It is ‖color:gui.red‖incompatible‖end‖ with human blood. + A sodium chloride infusion used to increase ‖color:gui.green‖blood pressure‖end‖, and additionally causes ‖color:gui.green‖acidosis‖end‖. On failure, it is less effective. + Basic bandages, useful in the treatment of ‖color:gui.green‖bleeding‖end‖, and promotes the healing of ‖color:gui.green‖minor burns‖end‖ and ‖color:gui.green‖wounds‖end‖. Additionally, bandages stabilize ‖color:gui.green‖fractures‖end‖, preventing them from causing internal damage. On failure, it is less effective. + A synthetic skin with hemostatic properties, able to effectively seal ‖color:gui.green‖bleeds‖end‖, and is a good treatment against ‖color:gui.green‖minor burns‖end‖ while promoting the healing of ‖color:gui.green‖wounds‖end‖. Additionally, plastiseal stabilizes ‖color:gui.green‖fractures‖end‖, preventing them from causing internal damage. Finally, they can be used to treat ‖color:gui.green‖third-degree burns‖end‖ after ‖color:gui.blue‖skin retraction‖end‖. On failure, it is less effective. + A relatively mild opioid ‖color:gui.green‖analgesic‖end‖ obtained from aquatic poppy. Most commonly used to manufacture morphine and fentanyl. On failure, it is less effective and there is a greater risk of ‖color:gui.red‖addiction‖end‖ and ‖color:gui.red‖overdose‖end‖. + A powerful opiate ‖color:gui.green‖analgesic‖end‖, but overuse will cause ‖color:gui.red‖addiction‖end‖ and ‖color:gui.red‖overdose‖end‖. On failure, it is less effective and there is a greater risk of ‖color:gui.red‖addiction‖end‖ and ‖color:gui.red‖overdose‖end‖. + A very potent opiate ‖color:gui.green‖analgesic‖end‖, but overuse will cause ‖color:gui.red‖addiction‖end‖ and ‖color:gui.red‖overdose‖end‖. Analgesia will not only prevent ‖color:gui.green‖pain‖end‖, but will also reduce ‖color:gui.green‖damage taken‖end‖ and increase ‖color:gui.green‖stun resistance‖end‖. On failure, it is less effective and there is a greater risk of ‖color:gui.red‖addiction‖end‖ and ‖color:gui.red‖overdose‖end‖. + An opioid antagonist for the treatment of opiate ‖color:gui.green‖withdrawal‖end‖ and ‖color:gui.green‖overdose‖end‖. Additionally, it will reduce the ‖color:gui.green‖analgesic‖end‖ effect of opiates. On failure, it is less effective and may cause a short ‖color:gui.red‖coma‖end‖. + An antibiotic that acts against a wide range of disease-causing bacteria, making it an effective treatment for ‖color:gui.green‖sepsis‖end‖ and to a lesser extent, ‖color:gui.green‖husk infection‖end‖. However, it has low specificity and causes ‖color:gui.red‖organ damage‖end‖. Used as an ingredient in multiple medical compounds. On failure, it is less effective. + A naturally occurring hormone. For a short amount of time, it will raise the patient's ‖color:gui.green‖blood pressure‖end‖, increase ‖color:gui.green‖melee damage‖end‖, halve ‖color:gui.green‖fibrillation rate‖end‖, and prevent ‖color:gui.green‖pain‖end‖. Upon use, it will also cure ‖color:gui.green‖cardiac arrest‖end‖, remove ‖color:gui.green‖stun‖end‖, and briefly reduce ‖color:gui.green‖incoming stuns‖end‖. + For calming the nerves when the sea is stormy. It is hard on the lungs, though. + A submariner's life is mentally taxing, but perhaps this exquisitely crafted cigar can help you soothe your nerves a bit. It is hard on the lungs, though. + A ‖color:gui.red‖volatile‖end‖ syringe of oxygenite that can be injected, forcefully ‖color:gui.green‖oxygenating the blood‖end‖ for a short period of time. However, its toxicity causes slight ‖color:gui.red‖organ damage‖end‖. On failure, oxygenation is ‖color:gui.red‖momentary‖end‖ and ‖color:gui.red‖organs are further harmed‖end‖. Hypoxemia damages the brain and organs, and is the main cause of death resulting from combat injuries. + A stimulant that increases ‖color:gui.green‖muscular endurance‖end‖ and can be used in the treatment of ‖color:gui.green‖internal damage‖end‖, ‖color:gui.green‖oxygen deprivation‖end‖, and ‖color:gui.green‖blood loss‖end‖. On failure, it is less effective. + An antibiotic glue with hemostatic properties. Seals ‖color:gui.green‖bleeding‖end‖ wounds almost immediately and prevents them from getting ‖color:gui.green‖infected‖end‖. Also effective against ‖color:gui.green‖burns‖end‖. On failure, it may cause ‖color:gui.red‖mobile clots‖end‖ in the bloodstream. + A potent nervous system stimulant, temporarily boosting the user's ‖color:gui.green‖muscular speed‖end‖. However, it is ‖color:gui.red‖addictive‖end‖, slightly damages ‖color:gui.red‖organs‖end‖, and will cause some ‖color:gui.red‖brain damage‖end‖. On failure, it is less effective, more ‖color:gui.red‖addicting‖end‖, and will cause increased ‖color:gui.red‖damage‖end‖. + Temporarily boosts ‖color:gui.green‖muscular strength‖end‖ and ‖color:gui.green‖endurance‖end‖. It is addictive. On failure, it is less effective and more ‖color:gui.red‖addicting‖end‖. + An extremely potent muscle stimulant for those moments when you gotta go fast. Boosts ‖color:gui.green‖muscular strength‖end‖, ‖color:gui.green‖endurance‖end‖, and ‖color:gui.green‖speed‖end‖, and reduces ‖color:gui.green‖stun susceptibility‖end‖. It is ‖color:gui.red‖addictive‖end‖ and causes a small amount of ‖color:gui.red‖brain damage‖end‖. On failure, it is more ‖color:gui.red‖addictive‖end‖ and causes more ‖color:gui.red‖brain damage‖end‖. + A strong ‖color:gui.green‖antipsychotic‖end‖ drug, effective against treatment of ‖color:gui.green‖alcohol withdrawal‖end‖. On failure, it is less effective. + A cure for ‖color:gui.green‖paralysis‖end‖ and prematurely ends ‖color:gui.green‖general anesthesia‖end‖. Excessive use may cause ‖color:gui.red‖psychosis‖end‖. On failure, it is less effective and causes more ‖color:gui.red‖psychosis‖end‖. + A medical solution that's mildly effective as a treatment for ‖color:gui.green‖internal damage‖end‖, but is more commonly used to ‖color:gui.green‖increase the duration‖end‖ of bloodstream and performance-enhancing drugs. + A highly unstable liquid that may explode when subjected to heat or physical shock. When administered to a patient, it will cause vasodilation and decrease ‖color:gui.green‖blood pressure‖end‖. + Concentrated pomegrenade juice. It offers minor ‖color:gui.green‖wound-healing‖end‖ properties, including that of ‖color:gui.green‖stitched wounds‖end‖. On failure, it is less effective. + A highly advanced stimulant that makes the user rapidly recover from ‖color:gui.green‖damage‖end‖, ‖color:gui.green‖burns‖end‖, and ‖color:gui.green‖bloodloss‖end‖. In addition, the user will rapidly coagulate ‖color:gui.green‖external‖end‖ and ‖color:gui.green‖internal bleeding‖end‖. It is ‖color:gui.red‖addictive‖end‖. On failure, it is more ‖color:gui.red‖addicting‖end‖. + Medical alcohol used as an ingredient in the manufacture of various medicines. Drinking while on duty is not advised, and binge-drinking is hard on the liver. + A fine liquor made from raptor bane or pomegrenade juice. Some purists insist real rum is made from sugarcane, but good luck finding any of that on Europa. Its potency is sufficient to damage early ‖color:gui.green‖husk infections‖end‖, but binge-drinking is hard on the liver. + Stabs, pokes, cuts and slashes. Also can be used to remove old ‖color:gui.green‖bandages‖end‖. On failure, causes ‖color:gui.red‖lacerations‖end‖ and ‖color:gui.red‖bleeding‖end‖. + Concentrated raptorbane juice. Mildly toxic for humans, catastrophically toxic for mudraptors. It will induce vomiting in humans, making it a decent treatment for ‖color:gui.green‖acidosis‖end‖. On failure, it does not induce vomiting. + May contain traces of galena. Treats some external ‖color:gui.green‖damage‖end‖ and ‖color:gui.green‖burns‖end‖. + Used as an ingredient in the manufacture of various medicines. On its own, can be used to slow down the effects of ‖color:gui.green‖poisons‖end‖ and ‖color:gui.green‖radiation sickness‖end‖. On failure, it is less effective. + Hallucinogenic toxin secreted by some Europan species. Serves as an ‖color:gui.green‖antiparalysant‖end‖ in a pinch. + A highly toxic chemical that causes a rapid death once a sufficiently large dose has been administered. Can be used as a risky method for eliminating ‖color:gui.green‖husk infections‖end‖. + A double-edged chemical brew. While it activates the immune system to moderately treat ‖color:gui.green‖poisons‖end‖, it also significantly weakens the target, making them more susceptible to all ‖color:gui.red‖damage‖end‖, ‖color:gui.red‖burns‖end‖, and ‖color:gui.red‖husk infection‖end‖. + A stealthy neurotoxin, undetectable in early stages. Causes a loss of vision and, ultimately, death. Can be used as a risky method for eliminating ‖color:gui.green‖husk infections‖end‖. + Slows down cellular degradation caused by radiation. On failure, it is less effective. + An antiparasitic drug used in the treatment of ‖color:gui.green‖husk parasite infections‖end‖. On failure, it is less effective. + A handheld carbon dioxide extinguisher. Also puts out flaming people. + An atmospheric diving suit capable of withstanding the immense pressure under Europa's crust. Only offers adequate protection up to the depth of 4,000 meters—beyond this point, an Abyss or Combat suit is required. Vacuum-sealed suits such as these will easily smother flames. + + Manual Defibrillator + A tool that uses battery power to cure ‖color:gui.green‖cardiac arrest‖end‖ or reset ‖color:gui.green‖fibrillation‖end‖. For curing cardiac arrest, use the ‖color:gui.blue‖AED‖end‖ instead if medical skill is below 80. On failure, causes ‖color:gui.red‖cardiac arrest‖end‖. + Automated External Defibrillator + The AED uses battery power to cure ‖color:gui.green‖cardiac arrest‖end‖ and is guaranteed to reset ‖color:gui.green‖fibrillation‖end‖. For curing cardiac arrest, use the ‖color:gui.blue‖manual defibrillator‖end‖ instead if medical skill is above 80. It will never cause cardiac arrest. + Ambu Bag + The BVM will treat ‖color:gui.green‖oxygen low‖end‖ when provided an with oxygen tank, and additionally treats ‖color:gui.green‖respiratory arrest‖end‖ when provided with an oxygenite tank. + AutoPulse + A machine that occupies a patient's Outerwear slot. Over time, cures ‖color:gui.green‖cardiac arrest‖end‖ and ‖color:gui.green‖fibrillation‖end‖, and prevents the negative effects of ‖color:gui.green‖respiratory arrest‖end‖. Wearing the AutoPulse will additionally increase ‖color:gui.green‖blood pressure‖end‖ over time, which may useful in an emergency. Remember to take it off when no longer needed! + Hematology Analyzer + A tool that displays a patient's blood type and immunity. Additionally shows if a patient has bloodloss, sepsis, acidosis, alkalosis, or drugs in the bloodstream. If a ‖color:gui.blue‖blank donor card‖end‖ is inserted, it will print the patient's bloodtype onto their ID card. If a ‖color:gui.blue‖blood pack‖end‖ is inserted, any existing sepsis, alkalosis, or acidosis will be shown. Each use of the analyzer requires a bit of ‖color:gui.red‖blood‖end‖. + Blank Donor Card + An empty donor card used by the ‖color:gui.blue‖hematology analyzer‖end‖ to imprint a patient's blood type. + Trauma Shears + A tool used to remove ‖color:gui.green‖bandages‖end‖ or ‖color:gui.green‖plaster casts‖end‖. On failure, causes ‖color:gui.red‖bleeding‖end‖ and ‖color:gui.red‖lacerations‖end‖. + Wheelchair + A tool that occupies a patient's Outerwear slot. Allows utilizing arms for movement, making it easier to walk with damaged legs. + Blue Shark + A cute plushie that will slightly reduce ‖color:gui.green‖psychosis‖end‖ each time it is administered to a patient. + Body Bag + A bag that occupies a patient or corpse's Outerwear slot. Allows them to be ‖color:gui.green‖dragged at full speed‖end‖, but a living person cannot breathe through the bag, causing ‖color:gui.red‖oxygen low‖end‖. + Stasis Bag + A bag that occupies a patient's Outerwear slot, protecting against pressure down to 10,000 meters. This will cause ‖color:gui.red‖cardiac arrest‖end‖, ‖color:gui.red‖respiratory arrest‖end‖, ‖color:gui.red‖unconsciousness‖end‖, and ‖color:gui.red‖prevent surgical operations‖end‖, but will ‖color:gui.green‖pause the progression of negative afflictions‖end‖ while worn. When worn, the bag deteriorates by 1% every four seconds. + You will go unconscious. Are you sure you want to equip the stasis bag? + + Scalpel + A tool used to make ‖color:gui.green‖incisions‖end‖ during surgery. Incisions are the first step in all surgical operations, but will cause ‖color:gui.red‖bloodloss‖end‖ unless the ‖color:gui.blue‖hemostat‖end‖ is used afterwards. Additionally, incisions can only be performed if the patient does not feel pain, and patients who become pain-aware during surgery will gain ‖color:gui.red‖traumatic shock‖end‖. On failure, causes ‖color:gui.red‖bleeding‖end‖ and ‖color:gui.red‖lacerations‖end‖. + Hemostat + A tool used to ‖color:gui.green‖clamp blood vessels‖end‖ during surgery. The second step in most surgical operations, done after ‖color:gui.blue‖scalpel incisions‖end‖. + Skin Retractors + A tool used to ‖color:gui.green‖retract skin‖end‖ during surgery. Retracting the skin is the third step in most surgical operations, but will cause ‖color:gui.red‖traumatic shock‖end‖ if the patient is conscious and not laying on a bed, or close to a ‖color:gui.blue‖surgery table‖end‖ or hospital bed. Used after ‖color:gui.blue‖hemostat clamping‖end‖. On failure, causes ‖color:gui.red‖internal damage‖end‖. + Tweezers + A small tool that allows for removing unwanted tissue. After ‖color:gui.blue‖skin retraction‖end‖, tweezers can be used to remove some ‖color:gui.green‖foreign bodies‖end‖ or convert ‖color:gui.green‖blunt force trauma‖end‖ and ‖color:gui.green‖internal damage‖end‖ into ‖color:gui.blue‖suturable‖end‖ ‖color:gui.red‖lacerations‖end‖. ‖color:gui.green‖Foreign bodies‖end‖ can also be removed through open gunshot or deep tissue wounds, but this will cause minor ‖color:gui.red‖traumatic shock‖end‖. On failure, causes ‖color:gui.red‖internal damage‖end‖. + Surgical Saw + A tool used to ‖color:gui.green‖saw bones‖end‖. After ‖color:gui.blue‖skin retraction‖end‖, bones can be sawed to remove existing limbs or add new ones. Replacing limbs is required if gangrene exceeds 15%. On failure, causes ‖color:gui.red‖bleeding‖end‖, ‖color:gui.red‖internal damage‖end‖, and ‖color:gui.red‖lacerations‖end‖. + Suture + Biodegradeable sutures used to complete surgery. On use, ends surgical operations at any step. Additionally, they can be used to ‖color:gui.red‖stitch‖end‖ ‖color:gui.green‖open wounds‖end‖ closed, and reduce a significant amount of external ‖color:gui.green‖bleeding‖end‖. On failure, causes ‖color:gui.red‖internal damage‖end‖. + Surgical Drill + A tool used to ‖color:gui.green‖drill bones‖end‖ during surgery. After ‖color:gui.blue‖skin retraction‖end‖, bones can be drilled to perform ‖color:gui.blue‖osteosynthesis‖end‖ and fix fractures. On failure, causes ‖color:gui.red‖bleeding‖end‖ and ‖color:gui.red‖internal damage‖end‖. + Osteosynthesis Implants + Titanium implants used to repair fractures. They can be installed after ‖color:gui.blue‖drilling bones‖end‖. In the event of total bone death, osteosynthesis must be performed on all body parts. On failure, causes ‖color:gui.red‖bleeding‖end‖ and ‖color:gui.red‖internal damage‖end‖. + Spinal Cord Implants + Titanium implants used to repair spinal cord injuries. They can be installed after ‖color:gui.blue‖skin retraction‖end‖. However, the spinal cord will be injured again if the neck fracture is not repaired with ‖color:gui.blue‖osteosynthesis‖end‖. On failure, causes ‖color:gui.red‖bleeding‖end‖ and ‖color:gui.red‖internal damage‖end‖. + Endovascular Balloon + A balloon inserted into a ruptured aorta. This will prevent ‖color:gui.green‖bloodloss‖end‖ caused by the rupture, but the clog will cause ‖color:gui.red‖gangrene‖end‖ over time. It can be installed after a ‖color:gui.blue‖scalpel incision‖end‖. + Medical Stent + A stent that can be inserted into the aorta to repair a rupture. It must be used after the ‖color:gui.blue‖endovascular balloon‖end‖. + Drainage + Treats ‖color:gui.green‖pneumothorax‖end‖ by draining air out of the pleural cavity. Can be used after ‖color:gui.blue‖skin retraction‖end‖. Pneumothorax is a potentially threatening condition, as it prevents hypoxemia from decreasing. + Surgery Table + A portable version of the hospital bed, intended to be installed on submarines. Like the hospital bed, it comes with ‖color:gui.green‖artificial ventilation‖end‖. Additionally, it has electrical pins installed that can output a person's vitals. + Liver Organ Scalpel + A specialized scalpel for the removal of livers. Can be used after ‖color:gui.blue‖skin retraction‖end‖ on the torso. + Kidney Organ Scalpel + A specialized scalpel for the removal of kidneys. Can be used after ‖color:gui.blue‖skin retraction‖end‖ on the torso. + Lung Organ Scalpel + A specialized scalpel for the removal of the lungs. Can be used after ‖color:gui.blue‖skin retraction‖end‖ on the torso. + Heart Organ Scalpel + A specialized scalpel for the removal of the heart. Can be used after ‖color:gui.blue‖skin retraction‖end‖ on the torso. + Brain Organ Scalpel + A specialized scalpel for the removal of the brain. Can be used after ‖color:gui.blue‖skin retraction‖end‖ on the head. + Multipurpose Scalpel + A scalpel that can be used for incisions, organ extraction, removing bandages/casts, or malpractice. Equip in hand to change mode. + Mode: Surgery incision. Equip in hand to change mode. + Mode: Extract kidneys + Mode: Extract liver + Mode: Extract lungs + Mode: Extract heart + Mode: Extract brain + Mode: Remove bandages, casts, and malpractice. Equip in hand to change mode. + Mode: Adaptive organ extraction. Use on head for brain, left arm for kidneys, torso for liver, right arm for heart, left leg for lungs. Equip in hand to change mode. + Incision + Kidneys + Liver + Lungs + Heart + Brain + Bandages, casts, malpractice + Adaptive organ extraction + + Empty Blood Pack + An empty blood pack for the drawing of blood. The drawn blood will retain a small amount of the donor's ‖color:gui.red‖acidosis‖end‖, ‖color:gui.red‖alkalosis‖end‖, or ‖color:gui.red‖sepsis‖end‖, if they had any. It is safe to draw a single pack of blood from a patient, provided that they are healthy. On failure, it will draw a ‖color:gui.red‖potentially-lethal‖end‖ amount of blood. + Blood Pack O+ + Can be administered to: O+, A+, B+, and AB+ + Blood Pack O- + Can be administered to: Any + Blood Pack A+ + Can be administered to: A+, AB+ + Blood Pack B+ + Can be administered to: B+, AB+ + Blood Pack AB+ + Can be administered to: AB+ + Blood Pack A- + Can be administered to: A-, A+, AB-, AB+ + Blood Pack B- + Can be administered to: B-, B+, AB-, AB+ + Blood Pack AB- + Can be administered to: AB-, AB+ + + Blood Pack O- + Can be administered to: Any + + Donor Card O- + Can take blood from: O- + Can give blood to: all of them + Donor Card O+ + Can take blood from: O-, O+ + Can give blood to: O+, A+, B+, AB+ + Donor Card A- + Can take blood from: O-, A- + Can give blood to: A-, A+, AB-, AB+ + Donor Card A+ + Can take blood from: O-, O+, A-, A+ + Can give blood to: A+, AB+ + Donor Card B- + Can take blood from: O-, B- + Can give blood to: B-, B+, AB-, AB+ + Donor Card B+ + Can take blood from: O-, O+, B-, B+ + Can give blood to: B+, AB+ + Donor Card AB- + Can take blood from: O-, A-, B-, AB- + Can give blood to: AB-, AB+ + Donor Card AB+ + Can take blood from: all of them + Can give blood to: AB+ + + Medical Container + Can store medicine and medical instruments. + Surgery Toolbox + Can store many small items that are used during surgery. + Refrigerated Container + A container to store precious transplant-ready organs and limbs. Organs will decay quickly when left outside, while limbs will decay slower. Organs and limbs will regenerate when refrigerated, but only if the organ is above 90% condition, or the limb is above 95% condition. + Refrigerated Crate + A crate to store precious transplant-ready organs and limbs. Organs will decay quickly when left outside, while limbs will decay slower. Organs and limbs will regenerate when refrigerated, but only if the organ is above 90% condition, or the limb is above 95% condition. + Medical Starter Crate + Once obtained, this crate will spawn first-aid and surgical necessities. + + Right Arm + A severed right arm. Can be surgically reattached after ‖color:gui.blue‖sawing bones‖end‖. If left outside, limbs will slowly decay until destroyed, but the condition of a limb does not matter for transplanting purposes. The bones are rich in ‖color:gui.green‖calcium‖end‖. + Left Arm + A severed left arm. Can be surgically reattached after ‖color:gui.blue‖sawing bones‖end‖. If left outside, limbs will slowly decay until destroyed, but the condition of a limb does not matter for transplanting purposes. The bones are rich in ‖color:gui.green‖calcium‖end‖. + Right Leg + A severed right leg. Can be surgically reattached after ‖color:gui.blue‖sawing bones‖end‖. If left outside, limbs will slowly decay until destroyed, but the condition of a limb does not matter for transplanting purposes. The bones are rich in ‖color:gui.green‖calcium‖end‖. + Left Leg + A severed left leg. Can be surgically reattached after ‖color:gui.blue‖sawing bones‖end‖. If left outside, limbs will slowly decay until destroyed, but the condition of a limb does not matter for transplanting purposes. The bones are rich in ‖color:gui.green‖calcium‖end‖. + Right Arm Bionic + A bionic right arm. Can be used to treat amputation, transforming into a biological arm. Can be attached after ‖color:gui.blue‖sawing bones‖end‖. + Left Arm Bionic + A bionic left arm. Can be used to treat amputation, transforming into a biological arm. Can be attached after ‖color:gui.blue‖sawing bones‖end‖. + Right Leg Bionic + A bionic right leg. Can be used to treat amputation, transforming into a biological leg. Can be attached after ‖color:gui.blue‖sawing bones‖end‖. + Left Leg Bionic + A bionic left leg. Can be used to treat amputation, transforming into a biological leg. Can be attached after ‖color:gui.blue‖sawing bones‖end‖. + Liver + A human liver. Liver damage compromises the body's natural ability to heal ‖color:gui.red‖bleeding‖end‖, along with causing some ‖color:gui.red‖neurotrauma‖end‖, increasing ‖color:gui.red‖blood pressure‖end‖, and causing continuous ‖color:gui.red‖internal bleeding‖end‖ upon total failure. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if left outside. + Liver + A human liver. Liver damage compromises the body's natural ability to heal ‖color:gui.red‖bleeding‖end‖, along with causing some ‖color:gui.red‖neurotrauma‖end‖, increasing ‖color:gui.red‖blood pressure‖end‖, and causing continuous ‖color:gui.red‖internal bleeding‖end‖ upon total failure. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if left outside. + Lungs + A pair of human lungs. Total lung failure causes ‖color:gui.red‖respiratory arrest‖end‖. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the one new placed in. Organs decay quickly if not refrigerated or in a human. + Lungs + A pair of human lungs. Total lung failure causes ‖color:gui.red‖respiratory arrest‖end‖. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if not refrigerated or in a human. + Kidney + A human kidney. Heavy kidney damage will cause ‖color:gui.red‖acidosis‖end‖, some ‖color:gui.red‖neurotrauma‖end‖, ‖color:gui.red‖bone damage‖end‖, and increases ‖color:gui.red‖blood pressure‖end‖. Kidneys fail one at a time, with one failing past 50% damage. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if not refrigerated or in a human. + Kidney + A human kidney. Heavy kidney damage will cause ‖color:gui.red‖acidosis‖end‖, ‖color:gui.red‖neurotrauma‖end‖, ‖color:gui.red‖bone damage‖end‖, and increases ‖color:gui.red‖blood pressure‖end‖. Kidneys fail one at a time, with one failing past 50% damage. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if not refrigerated or in a human. + Heart + A human heart. Total heart failure causes ‖color:gui.red‖cardiac arrest‖end‖. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if not refrigerated or in a human. + Heart + A human heart. Total heart failure causes ‖color:gui.red‖cardiac arrest‖end‖. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Organs decay quickly if not refrigerated or in a human. + Brain + A human brain. Removal of the brain causes rapidly increasing ‖color:gui.red‖neurotrauma‖end‖. However, a person's brain can be transplanted into another individual for that person to take control of them. To transplant an organ, the old one must be removed with the appropriate ‖color:gui.blue‖organ scalpel‖end‖, and the new one placed in. Brains decay extremely quickly when not in a human, and are exceedingly fragile. + Non-functional Right Hand + This hand is not working, due to the right arm being ‖color:gui.red‖dislocated‖end‖, ‖color:gui.red‖fractured‖end‖, or ‖color:gui.red‖missing entirely‖end‖. + Non-functional Left Hand + This hand is not working, due to the left arm being ‖color:gui.red‖dislocated‖end‖, ‖color:gui.red‖fractured‖end‖, or ‖color:gui.red‖missing entirely‖end‖. + + Mannitol + A sugar alcohol used to treat a significant amount of ‖color:gui.green‖neurotrauma‖end‖ and halve its rate of increase. However, it will not work unless the patient has over 70% blood pressure and oxygenated blood. Additionally, it will cause ‖color:gui.red‖heart‖end‖ and ‖color:gui.red‖kidney damage‖end‖. On failure, it is less effective and will cause more ‖color:gui.red‖heart‖end‖ and ‖color:gui.red‖kidney damage‖end‖. + Streptokinase + An enzyme that breaks down blood clots, useful in the treatment of ‖color:gui.green‖heart attacks‖end‖. However, it will make ‖color:gui.red‖strokes‖end‖ worse. Additionally, it is used to treat ‖color:gui.green‖hemotransfusion shock‖end‖. + Azathioprine + An immunosuppressant that will reduce a patient's ‖color:gui.green‖immunity‖end‖. This is useful to prevent ‖color:gui.green‖organ rejection‖end‖ or to ‖color:gui.green‖administer incompatible blood types‖end‖ without triggering an immune response. However, a lower immunity will make the patient more susceptible to ‖color:gui.red‖sepsis‖end‖. If a patient is given an organ transplant but it immediately fails, it has been rejected by the immune system. On failure, causes ‖color:gui.red‖sepsis‖end‖. + Thiamine + Vitamin B1 will provide a slight boost to ‖color:gui.green‖organ regeneration‖end‖. On failure, it is less effective. + Sodium Nitroprusside + A medication used to lower ‖color:gui.green‖blood pressure‖end‖. On failure, it is less effective. + Antibiotic Ointment + An antiseptic gel that will aid against fighting ‖color:gui.green‖infected wounds‖end‖ and relieve minor ‖color:gui.green‖burns‖end‖. On failure, it is less effective. + Tourniquet + An item that prevents ‖color:gui.green‖major arteries from bleeding‖end‖. It cannot be used for the ‖color:gui.red‖carotid artery‖end‖. Clamping arteries will cause ‖color:gui.red‖gangrene‖end‖ over time, and it is removed during surgery. On failure, causes ‖color:gui.red‖blunt force trauma‖end‖. + Needle + A specialized needle used to depressurize air in the pleural cavity, as a first aid option for ‖color:gui.green‖pneumothorax‖end‖. If the patient does not already have pneumothorax, it will ‖color:gui.red‖cause it instead‖end‖. On failure, causes ‖color:gui.red‖organ damage‖end‖ and ‖color:gui.red‖bleeding‖end‖. Pneumothorax is a potentially threatening condition, as it prevents hypoxemia from decreasing. + Ringer's Solution + An isotonic solution used to increase ‖color:gui.green‖blood pressure‖end‖. On failure, it is less effective. + Antiseptic + Used by the ‖color:gui.blue‖antiseptic spray‖end‖, it is effective against treating ‖color:gui.green‖infected wounds‖end‖. + Antiseptic Spray + Applies ‖color:gui.blue‖antiseptic‖end‖ to combat ‖color:gui.green‖infected wounds‖end‖. + Propofol + A general ‖color:gui.green‖anesthetic‖end‖. Its effects take place after some time, and will not last very long. Anesthesized patients are ‖color:gui.red‖unconscious‖end‖ and do not gain ‖color:gui.green‖traumatic shock‖end‖ from surgical operations. Usage may come with a variety of non-lethal ‖color:gui.red‖side effects‖end‖. + Gypsum + A powder that can be formed into a cast. It is used to encase ‖color:gui.green‖long bone fractures‖end‖, allowing them to heal. Used after ‖color:gui.blue‖bandaging‖end‖ the limb. On failure, it is consumed without forming a cast. + Gel Ice Pack + A package of cold gel that will greatly promote the healing of ‖color:gui.green‖blunt force trauma‖end‖ and significantly treats ‖color:gui.green‖internal bleeding‖end‖. It is ineffective against ‖color:gui.red‖other types of injuries‖end‖ and will worsen ‖color:gui.red‖infections‖end‖. Can be used up to thrice, and will lose effectiveness if not refrigerated. When refrigerated, its condition will regenerate over time. On failure, its chilling duration is decreased. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/LoadingScreenTips.xml b/NT Informative Descriptions/Localization/English/LoadingScreenTips.xml new file mode 100644 index 0000000..0515b75 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/LoadingScreenTips.xml @@ -0,0 +1,13 @@ + + + ‖color:gui.orange‖Neurotrauma: ‖end‖Non-medical experts can treat ‖color:gui.red‖cardiac arrest‖end‖ with the use of ‖color:gui.blue‖adrenaline‖end‖ or an ‖color:gui.blue‖AutoPulse‖end‖. + ‖color:gui.orange‖Neurotrauma: ‖end‖On ‖color:gui.red‖fire‖end‖? You may be closer to a ‖color:gui.blue‖diving suit‖end‖ than the ballast or fire extinguisher. + ‖color:gui.orange‖Neurotrauma: ‖end‖If you cannot safely treat a ‖color:gui.red‖dislocation‖end‖, a ‖color:gui.blue‖bandage‖end‖ will restore the limb's function. + ‖color:gui.orange‖Neurotrauma: ‖end‖Analgesia isn't limited to surgical use. Painlessness is a good friend to soldiers. + ‖color:gui.orange‖Neurotrauma: ‖end‖The ‖color:gui.blue‖AED‖end‖ will always reset ‖color:gui.red‖fibrillation‖end‖ regardless of medical skill. + ‖color:gui.orange‖Neurotrauma: ‖end‖Drugs can still be administered to a patient in a ‖color:gui.blue‖Stasis Bag‖end‖. + ‖color:gui.orange‖Neurotrauma: ‖end‖Not enough time to treat yourself before passing out? ‖color:gui.blue‖Liquid oxygenite‖end‖ prevents unconsciousness caused by ‖color:gui.red‖hypoxemia‖end‖. + ‖color:gui.orange‖Neurotrauma: ‖end‖Remember to pick up your limb after it is traumatically amputated. + ‖color:gui.orange‖Neurotrauma: ‖end‖Is your patient stable, but not recovering from ‖color:gui.red‖neurotrauma‖end‖? ‖color:gui.red‖Kidney‖end‖ and ‖color:gui.red‖liver damage‖end‖ will cause neurotrauma. + ‖color:gui.orange‖Neurotrauma: ‖end‖For a full range of diagnosis, remember to check the Health UI, Health Scanner, and Hematology Analyzer. + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/Pharmacy.xml b/NT Informative Descriptions/Localization/English/Pharmacy.xml new file mode 100644 index 0000000..c8a6c31 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/Pharmacy.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/SurgeryPlus.xml b/NT Informative Descriptions/Localization/English/SurgeryPlus.xml new file mode 100644 index 0000000..e5b81f2 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/SurgeryPlus.xml @@ -0,0 +1,90 @@ + + + + + + + + Mannitol Plus + An improved mannitol formula. It will treat some ‖color:gui.green‖neurotrauma‖end‖, regardless of patient stability, and does not damage organs. + Artificial brain + An artificial brain transplant that keeps a body alive when the original brain is removed. + Surgeon outfit + A sterile surgical scrub for the prevention of infection during surgery. + Surgical mask + A mask that keeps airborne pathogens away from your patient during surgery. + Brain jar + A container to hold brain transplants indefinitely. + Surgical drapes + Sterile sheets to prevent infection during surgery. + 'Medical Misconduct' + A handbook containing numerous surgical procedures and steps to reproduce them. + Triage tag (automatic) + A label that is used to efficiently determine the type and urgency of care required for a patient in the case of a mass casualty event. + Triage tag (manual) + A manual triage tag. Apply to the legs for green, arms for yellow, torso for red and head for black. + Experimental treatment + A highly experimental drug that can cause either a little (or a lot) of good (or bad). + + A layer of antibiotic gel protects and cleans the wound from any germs. Prevents sepsis during surgery. + + Preventative Permit + Serious injury is less likely. + Artificial brain + The patient is permanently unconscious, but the body remains alive. + Tagged: Minor + The patient has been gived the "minor" triage tag. They don't require treatment. + Tagged: Delayed + The patient has been gived the "delayed" triage tag. Their injuries are not life-threatening. + Tagged: Immediate + The patient has been gived the "immediate" triage tag. They require immediate treatment. + Tagged: Deceased + The patient has been gived the "deceased" triage tag. Medical attention is better spent elsewhere. They are as good as gone. + + Surgeon + While the medical doctor is better suited for first aid and quick response, the surgeon specializes in the optimization of surgical procedures. Lower risk of infection, faster execution, if it's related to surgery, the surgeon has it. + Surgical + Ethical Medicine + Dabbling Pharmacist + Field Surgeon + Adrenaline Pump + Drag bodies at full speed. + Gain additional movement speed equal to [skillpercentage]% of your surgery skill. + Autodidact + Gain [amount]% bonus XP on completing a mission where you perform medical services on a crew member. + Surgeon's Intuition + Whenever you open a medical (or alien) container for the first time, you have a [probability]% chance of finding additional items. + How do you do, fellow engineers? + Preperation Package + At the start of every round, gain: + Injector General + Medical items you apply gain [amount]% effectiveness. + Under Pressure + Unconscious patients next to you gain [amount]% bloodloss, organ damage and neurotrauma resistance. + Fish are specimens, not food! + When you or another crewmember kills a monster while outside your submarine, you have a [amount]% chance of finding a random genetic material on it. + Fine Bedside Manner + Patients near you passively heal at an accelerated rate. The effect is doubled if they are laying in bed. + My name's Bruce... Reitz + Organs you extract sell for full price and organs you transplant never get rejected. + Ultrasonic Cleaner + Drainages, endovascular balloons and needles no longer get consumed when you use them. + Gain [amount] bonus to sterility checks, less sepsis - horray! + Therapist-in-Training + Gain [amount]% extra health. + Unethical Sourcing + Mannitol Maniac + Self Care + Gain [amount]% [affliction] resistance. + Rapid Deployment + Please stop shooting me for fun captain + I've fallen and I can't get up! + Preventative Permit + The last person you ordered gains [physicalresistance]% damage resistance and is less likely to suffer serious injuries. + I'm a surgeon, not a... + Using your superior "Surgeon Intellect™" you can gain [amount] bonus skill, just like that! + Or, you can select [jobname], which will instead give you [amount] bonus skills to everything. + Don't you die on me, Soldier! + [itemname] that you administer instantly takes effect. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/English/Symbiote.xml b/NT Informative Descriptions/Localization/English/Symbiote.xml new file mode 100644 index 0000000..c8a6c31 --- /dev/null +++ b/NT Informative Descriptions/Localization/English/Symbiote.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Russian/Afflictions.xml b/NT Informative Descriptions/Localization/Russian/Afflictions.xml new file mode 100644 index 0000000..51e687a --- /dev/null +++ b/NT Informative Descriptions/Localization/Russian/Afflictions.xml @@ -0,0 +1,316 @@ + + + + + + Входное отверстие - небольшое, чуть темное и немного кровоточит. На выходе все гораздо хуже - открытая рана, разорванная плоть и сильное кровотечение. Возможно заражение раны, и, скорее всего, внутри остались осколки пуль. + Пуля не задела важные органы, но боль сильная, как и риск заражения раны. Также внутри могут быть осколки пуль. + На месте ушиба уже налился синяк, прикосновение к которому причиняет боль. Возможно, сломана кость. Эту рану нельзя зашить. + Есть небольшой синяк от удара, но переломов вроде бы нет. Эту рану нельзя зашить. + Кожа повреждена на месте глубокой, рваной раны. Есть риск заражения раны. + Порезы выглядят страшнее, чем на самом деле, но не следует исключать риск заражения раны. + Мягкие ткани сильно повреждены из-за ассиметричных кровоточащих ран. Вполне возможно заражение раны. + Что-то пыталось отгрызть большой ломоть, но урвало лишь кусочек. Но шрам останется. Также есть риск заражения раны. + Область имеет пурпурный цвет. Ткани в этом месте отличаются от кожи вокруг. Вполне возможно заражение раны, и, скорее всего, внутри осталась шрапнель. + Часть кожи немного посинела. Есть риск заражения раны, и, возможно, внутри осталась шрапнель. + Из рваной открытой раны фонтаном бьет кровь. Если рана достаточно сильная, то она может разорвать артерию. + Из раны медленно сочится кровь. + Кровь струей хлещет из раны. Рана достаточно сильная и способна разорвать артерию. + Кожа пациента покрыта потом, и его периодически рвет. Рвота вызывает алкалоз. + Слегка подташнивает, просто надо немного отдохнуть. Рвота вызывает алкалоз. + Ты в плохом состоянии. Стоит беспокоиться об этом или лучше отдохнуть? Рвота вызывает алкалоз. + Прилив адреналина делает пациента менее легко оглушаемым. + Из-за прилива адреналина вас не так легко оглушить. + + + Перелом правой плечевой кости + Правая рука была сломана, скорее всего из-за физической травмы. Перелом не позволит использовать эту руку до тех пор, пока не будет проведено хирургическое вмешательство или пока не наложен гипс. + Перелом левой плечевой кости + Левая рука была сломана, скорее всего из-за физической травмы. Перелом не позволит использовать эту руку до тех пор, пока не будет проведено хирургическое вмешательство или пока не наложен гипс. + Перелом правой бедренной кости + Правая нога была сломана, скорее всего из-за физической травмы. Передвижение будет затруднено до тех пор, пока не будет проведено хирургическое вмешательство или пока не наложен гипс. + Перелом левой бедренной кости + Левая нога была сломана, скорее всего из-за физической травмы. Передвижение будет затруднено до тех пор, пока не будет проведено хирургическое вмешательство или пока не наложен гипс. + Сломанные ребра + Одно или более ребер сломаны, скорее всего из-за физической травмы. Есть риск пневмоторакса из-за нестабильной структуры. Необходимо провести остеосинтетическую хирургию для восстановления. + Перелом черепа + Череп был сломан, скорее всего из-за физической травмы. Осколки черепа и структурная неустойчивость могут вызвать травму мозга. Необходимо провести остеосинтетическую хирургию для восстановления. + Перелом шеи + Шея была сломана, скорее всего из-за физической травмы. Структурная нестабильность обнажает спинной мозг, с легкостью травмируя позвоночный столб. Необходимо провести остеосинтетическую хирургию для восстановления. + Травматическая ампутация + Большая часть правой руки была оторвана в результате физической травмы, вызывая разрыв артерии. Необходимо распилить кости и заменить конечность. + Травматическая ампутация + Большая часть левой руки была оторвана результате физической травмы, вызывая разрыв артерии. Необходимо распилить кости и заменить конечность. + Травматическая ампутация + Большая часть правой ноги была оторвана результате физической травмы, вызывая разрыв артерии. Необходимо распилить кости и заменить конечность. + Травматическая ампутация + Большая часть тканей левой ноги была оторвана физическим путем, вызывая разрыв артерии. Необходимо распилить кости и заменить конечность. + Травматическая ампутация + Голова была грубо сорвана с плеч из-за действия взрыва, вызывая моментальную смерть. + Травма позвоночного столба + Позвоночный столб был поврежден из-за перелома шеи, вызывая полный паралич и анальгезию. Пациент все так же в сознании. Необходимо провести остеосинтетическую хирургию для восстановления. + Вывих + Сустав правой ноги был вывихнут из-за физической травмы, вызывая боль и затрудняя движения. Гаечный ключ может вернуть кость на место. + Вывих + Сустав левой ноги был вывихнут из-за физической травмы, вызывая боль и затрудняя движения. Гаечный ключ может вернуть кость на место. + Вывих + Сустав правой руки был вывихнут из-за физической травмы, вызывая боль и затрудняя движения. Гаечный ключ может вернуть кость на место. + Вывих + Сустав левой руки был вывихнут из-за физической травмы, вызывая боль и затрудняя движения. Гаечный ключ может вернуть кость на место. + Кровотечение из бедренной артерии + Левая бедренная артерия была разорвана инородным телом или вызвана огромным кровотечением, она вызывает обильную кровопотерю. Наложение жгута временно остановит кровопотерю, пока не будет хирургически закрыта. + Кровотечение из бедренной артерии + Правая бедренная артерия была разорвана инородным телом или вызвана огромным кровотечением, она вызывает обильную кровопотерю. Наложение жгута временно остановит кровопотерю, пока не будет хирургически закрыта. + Кровотечение из плечевой артерии + Левая плечевая артерия была разорвана инородным телом или вызвана огромным кровотечением, она вызывает обильную кровопотерю. Наложение жгута временно остановит кровопотерю, пока не будет хирургически закрыта. + Кровотечение из плечевой артерии + Правая плечевая артерия была разорвана инородным телом или вызвана огромным кровотечением, она вызывает обильную кровопотерю. Наложение жгута временно остановит кровопотерю, пока не будет хирургически закрыта. + Кровотечение из сонной артерии + Сонная артерия была разорвана инородным телом или вызвана огромным кровотечением, она вызывает обильную кровопотерю. Наложение жгута опасно для временной остановки кровотечения и может вызвать повреждение мозга, Необходимо ее хирургически закрыть. + Гангрена + Конечность усохла и почернела из-за сепсиса или остановленного кровотечения. Если ее сила выше 15%, конечность сама по себе не вылечится и должна быть ампутирована. + Ожог первой степени + Область покраснела и болит при нажатии, если она не достаточно сильная, то риска заражения раны нет. Бинт или антибиотическая мазь вылечивают эту рану. + Ожог второй степени + На пораженном участке появляются очень болезненные волдыри. Есть высокий риск заражения раны, что следовательно вызовит сепсис. Бинт или антибиотическая мазь вылечивают эту рану. + Ожог третьей степени + Кожа погрубела и потеряла чувствительность. Заражение раны приходит моментально, и сепсис будет расти быстро. Антибиотический клей экстренно вылечивает эту рану. + + Ускоренное сердцебиение + Сердцебиение аномально высокое. Если оно увеличивается, возникает потенциально смертельно опасная фибрилляция. Обычно вызвано либо гипотензией, либо гипоксемией. + Фибрилляция + Сердце сокращается быстро, слабо и обрывисто. Фибрилляция потенциально смертальная, обычно вызвана либо гипотензией, либо гипоксемией. + Остановка сердца + Нет пульса. Смертельное состояние которое предотвращает нормализацию кровяного давления, а при отсутствии лечения вызывает кому. Окончательный результат фибрилляции, вызываемой чаще всего гипоксемией. Сердце должно быть снова запущено дефибриллятором, адреналином или СЛР вручную. + Остановка дыхания + Нет дыхания. Смертельное состояние которове предотвращает насыщение крови кислородом. Обычно вызывается гипоксемией или передозировкой опиатов. + Гипервентиляция + Дыхание в тревожно быстром темпе. Постепенно увеличивает несмертельный алкалоз, и обычно вызывается гипотензией, гипоксемией или пневмотораксом. + Гиповентиляция + Дыхание в тревожно медленном темпе. Постепенно увеличивает потенциально смертельный ацидоз. Обычно вызывается анальгезией. Если ацидоз достаточно сильный, то он вызовет фибрилляцию. + Сбивчивое дыхание + Дыхание затруднительное. Обычно вызывается сердечной тампонадой, пневмотораксом или гипоксемией. + Кашель + Периодический кашель. Вызывается сердечной тампонадой, поврежденными легкими или сердцем. + Бледная кожа + Кожа неестественно бледная. Вызывается гипоксемией или кровопотерей. + Головокружение + Кружится голова. Вызывается гипотензией. + Размытое зрение + Трудность в фокусировании объектов зрением. Обычно вызывается гипотензией или сотрясением. + Спутанность сознания + Трудность в постановке мыслей. Обычно вызывается гипоксемией, ацидозом или сотрясением. + Головная боль + Боль в голове. Обычно вызывается гипоксемией, переломом черепа, ацидозом, сотрясением или инсультом. + Отек ног + Скопление жидкости в ногах. Вызывается поврежденной печенью, почкой или сильным повреждением сердца. + Слабость + Сниженная активность мускулатуры в конечностях. Вызывается сердечной тампонадой, кровопотерей или ацидозом. + Свистящие хрипы + При дыхании издаются посторонние звуки. Вызывается гемотрансфузионным шоком. + Рвота + Периодическая рвота. Обычно вызывается повреждением почек, опьянением или гемотрансфузионным шоком. Рвота вызывает алкалоз. + Рвота с кровью + Периодическая рвота кровью. Обычно вызывается внутренним кровотечением или отказом печени. + Лихорадка + Неестественно высокая температура тела. Обычно вызывается сепсисом. + Дискомфорт в животе + Дискомфорт в участке живота. Вызывается повреждением печени. + Вздутие + Вздутие брюшной полости. Вызывается повреждением печени. + Желтуха + Кожа окрасилась в желтый цвет. Вызывается сильным повреждением печени. + Потеет + Обильное потение. Вызывается инфарктом сердца или воздержанием от алкоголя, химии, опиатов. + Тремор + Ощущение колотящегося сердца. Вызывается алкалозом. + Без сознания + Они без сознания. Обычно вызывается достаточно сильной физической травмой, гипоксемией, нейротравмой, разрывом аорты или передозировкой опиатов. + Воспаление + Область покрасневшая, теплая и отекшая. Вызывается заражением раны или инородными телами. + Спазм + Неконтроллируемые сокращения мускулатуры, появляющиеся из-за припадка. Обычно вызывается сильным ацидозом или алкалозом, инсультом, передозировкой опиатов или лучевой болезнью. + Припадок + Они испытывают полноценный припадок. Обычно вызывается сильным ацидозом или алкалозом, инсультом, передозировкой опиатов или лучевой болезнью. + Ломка + Тяга к химии, алкоголю или опиатам. Вызывается воздержанием от веществ. + Горит! + Я пламя; Что сжигает всех, кто осмелится меня полюбить. + Боль в груди + Острая боль в груди. Вызывается сломанными ребрами или гемотрансфузионным шоком. + Боль в животе + Болезненное ощущение в животе. Вызывается гемотрансфузионным шоком. + Сильная боль + Сильная боль в конечности. Обычно вызывается вывихом или переломом. + Тошнота + Состояние тошноты. Обычно вызывается повреждением почек, сотрясением, воздержанием от веществ или гемотрансфузионным шоком. Тошнота вызывает алкалоз. + + + Травматический шок + Обычно вызывается из-за небезопасных условий для хирургии, вызывая потенциально опасную гипотензию. Для безопасных условий хирургии пациент должен быть под анальгезией и рядом с больничной кроватью, либо находится без сознания. + Хирургический надрез + Сделанный скальпелем разрез. Он больный. Также вызывает кровопотерю, которая останавливается зажимами. + Прижатое кровотечение + Хирургическое кровотечение сдержано. Разрез все также болезненный. + Кожа растянута + Кожа удерживается открытой при помощи расширителя. Это очень болезненно, но безопасно рядом с больничной кроватью, если пациент лежит в любой кровати или если пациент без сознания. + Зашитый надрез + Надрез закрыт швами. + Просверленные кости + Кости были просверлены, позволяя использование остеосинтетических имплантов. + Кость распилена + Кость была хирургически распилена, чтобы удалить конечность, либо вставить ее. + Сердце удалено + Сердце хирургически удалено. Орган необходим для перекачки насыщенной кислородом крови. Повреждение сердца обычно вызывается гипоксемией, инфарктом или огнестрельным ранением. + Мозг удален + Мозг хирургически удален. Орган необходим для сознания. Нейротравма обычно вызывается гипоксемией или инсультом. + Удаленные легкие + Легкие хирургически удалены. Орган необходим для насыщения кислородом крови. Повреждение легких обычно вызывается гипоксемией, огнестрельным ранением или частым курением. + Удаленные почки + Почки хирургически удалены. Орган необходим для регуляции ацидоза, здоровых костей и кровяного давления. Для человека необходима хотя бы 1 почка. Повреждение почек обычно вызывается гипоксемией или огнестрельным ранением. + Печень удалена + Печень хирургически удалена. Орган необходим для заживления кровотечений и регуляции кровяного давления. Повреждение печени обычно вызывается гипоксемией, огнестрельным ранением или сильным опьянением. + Сжатые артерии + Артериальное кровотечение остановлено, приток крови к конечности значительно снизился и, если оно была оставлено на достаточно продолжительное время, вызывает гангрену. + Закупореная баллоном аорта + Аортальное кровотечение остановлено, нет притока крови к конечностям и органам и, если оно оставлено на достаточно продолжительное время, вызывает гангрену. + Ампутация + Правая рука была хирургически ампутирована. Эта процедура не разрывает артерию. + Ампутация + Левая рука была хирургически ампутирована. Эта процедура не разрывает артерию. + Ампутация + Правая нога была хирургически ампутирована. Эта процедура не разрывает артерию. + Ампутация + Левая нога была хирургически ампутирована. Эта процедура не разрывает артерию. + Ампутация + Голова была хирургически ампутирована. Эта процедура не разрывает артерию... но вызывает моментальную смерть. + + + Шина + На перелом наложена шина. + Перевязка + Защищает от инфицирования, стабилизирует вывихи и переломы. Немного затрудняет движение. + Грязная перевязка + Перевязка которая долго использовалась и нуждающаяся в удалении или замене, так как она ускоряет заражение ран. + Гипсовый слепок + Обездвиживает переломы, позволяя им заживать. Заметно затрудняет движение. + Мазь + Слой антибиотической мази защищает от заражения и сохраняет рану стерильной. + Игла + Вставленная в грудь игла с воздушным клапаном предотвращает ухудшение пневмоторакса. + Стимулированный рост костей + Простимулированное отрастание костей. Для лечения костной смерти, этот статус должен быть на каждой части тела. + Анальгезия + Нечувствительность к боли подавляет некоторые симптомы, позволяет безопасную хирургию и дает больше времени для сражений. + Анестезия + Влияние наркотика вызывающего бессознательном состояние. Проводить хирургию безопасно. + Зашитая рана + Рана была закрыта швами. Зашитые раны заживают намного быстрее чем открытые, и они невосприимчивы к заражению. + Охлаждено + Холодный гелевый пакет способствует заживлению ушибов. Он слегка ограничивает движения и ухудшает инфекции. + + Без Lua + Lua не работает. Это значит, что Нейротравма и прочие модификации, использующие Lua не будут функционировать. Пожалуйста, прочитайте страницы мастерской модов которые вы планируете использовать. + Конфликт мода + Замечен конфликт. Другой мод перезаписывает некоторые предметы которые также перезаписывает Нейротравма. Некоторые вещи будут вести себя неправильно. Пожалуйста, отрегулируйте Ваш порядок модов, но если должно быть так, то уберите галочку проверки конфликтов в меню конфигурации Нейротравмы. + + + Умер от паралича + Вы умерли от паралича. + Некроз + + Вы умерли от некроза раны. + Вы умерли от некроза раны. + Аортальное кровотечение + Иммунитет + + Зараженная рана + + Сепсис + + Адреналин + + Разжижение тромбов + + Тиамин + + Понижатели кровяного давления + + Физраствор + + Раствор Рингера + + Маннитол + + Антибиотики + + Иммунодепрессанты + + Гемотрансфузионный шок + + Инородное тело + + Сердечная тампонада + + Внутреннее кровотечение + + Инфаркт + + Повреждение сердца + + Отказ сердца + + Нейротравма + + Смерть от нейротравмы + Вы умерли от нейротравмы. + Инсульт + + Припадок + + Кома + + Кровяное давление + + Гипоксемия + + Алкалоз + + Ацидоз + + Радиационное поражение легких + + Пневмоторакс + + Повреждение легких + + Отказ легких + + Повреждение почек + + Отказ почек + + Поврежденная кость + + Костная смерть + + Повреждение печени + + Отказ печени + + Жив + В сознании + Имя_пациента + Здоровье + Частота_сердцебиения + Скорость_дыхания + Кровяное_давление + Насыщенность_крови_кислородом + Нейротравма + Урон_органам + Оперируется + Причина_смерти + pH_Крови + Операционная + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Russian/Cybernetics.xml b/NT Informative Descriptions/Localization/Russian/Cybernetics.xml new file mode 100644 index 0000000..b8cefdd --- /dev/null +++ b/NT Informative Descriptions/Localization/Russian/Cybernetics.xml @@ -0,0 +1,87 @@ + + + + + + Позволяет чинить электрику и работать с проводкой. Также используется для ‖color:gui.green‖Подтягивания Винтов‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖. + Отвёрка которая прошла процесс процесс закалки с помощью пустого топливного стрежня. закалённый материал позволяет совершать более эффективные удары и починки. Также нужна для ‖color:gui.green‖Подтягивания Винтов‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖, и хирургически ‖color:gui.green‖Ремонтировать‖end‖ ‖color:gui.blue‖Кибернетичиские Органы‖end‖. + Создана из слабо изученного материала Дементонит. Держа это вы получаете непонятные и странные чувства. Также нужна для ‖color:gui.green‖Подтягивания Винтов‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖, и хирургически ‖color:gui.green‖Ремонтировать‖end‖ ‖color:gui.blue‖Кибернетичиские Органы‖end‖. + Программируемая пользователем вентильная матрица - универсальная схема, конфигурацию которой можно свободно менять для использования в ряде электрических устройств. Также используется для замены ‖color:gui.green‖Поврежденной Электроники‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖. + Один из важнейших инструментов на борту подлодки. Работает даже под водой и используется для выравнивания ‖color:gui.green‖Погнутого Металла‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖. + Прочный металлический сплав железа и углерода. Используется в производстве топливных стержней, а также во многих военных целях. Также используется для восстановления ‖color:gui.green‖Потери Материала‖end‖ на ‖color:gui.blue‖Кибернетической Конечности‖end‖. + + Кибернетическая Рука + Мощная неорганическая рука которая не может ‖color:gui.green‖Получить Кровотечение‖end‖ или ‖color:gui.green‖Перелом‖end‖. Дополонительно, оно увеличет ‖color:gui.green‖Скорость Плавания‖end‖ и ‖color:gui.green‖melee damage‖end‖. Но, Оно требует ‖color:gui.red‖Обслуживания‖end‖ и может получить ‖color:gui.red‖Повреждения От Воды‖end‖. Можно Установить после ампутации. + Кибернетическая Нога + Мощная неорганическая нога которая не может ‖color:gui.green‖Получить Кровотечение‖end‖ или ‖color:gui.green‖Перелом‖end‖. Дополонительно, оно увеличет ‖color:gui.green‖Скорость Бега‖end‖. Но, Оно требует ‖color:gui.red‖Обслуживания‖end‖ и может получить ‖color:gui.red‖Повреждения От Воды‖end‖. Можно Установить после ампутации. + Водонепроницаемая Кибернетическая Рука + Мощная неорганическая рука которая не может ‖color:gui.green‖Получить Кровотечение‖end‖ или ‖color:gui.green‖Перелом‖end‖. Дополонительно, оно увеличет ‖color:gui.green‖Скорость Плавания‖end‖ и ‖color:gui.green‖melee damage‖end‖. Но, Оно требует ‖color:gui.red‖Обслуживания‖end‖, И защищено от ‖color:gui.green‖Повреждения От Воды‖end‖. Можно Установить после ампутации. + Водонепроницаемая Кибернетическая Нога + Мощная неорганическая нога которая не может ‖color:gui.green‖Получить Кровотечение‖end‖ или ‖color:gui.green‖Перелом‖end‖. Дополонительно, оно увеличет ‖color:gui.green‖Скорость Бега‖end‖. Но, Оно требует ‖color:gui.red‖Обслуживания‖end‖, И защищено от ‖color:gui.green‖Повреждения От Воды‖end‖. Можно Установить после ампутации. + + Кибернетическая Рука + Эта неорганическая рука невосприимчива к биологическим повреждениям, но требует ремонта чтобы быть эффективной. Она может быть грубо удалена ломом. + Кибернетическая Нога + Эта неорганическая нога невосприимчива к биологическим повреждениям, но требует ремонта чтобы быть эффективной. Она может быть грубо удалена ломом. + Расшатанные Винты + Винты расшатались в результате физической травмы или от остальных расшатанных винтов. Если винты не будут затянуты отверткой, движение может ослабить больше винтов. + Поврежденная Электроника + Хрупкие электрические схемы были повреждены водой или физической травмой. Если поврежденная электроника не заменена используя схемы на базе ППВМ, то конечность может иногда давать сбои. + Погнутый Металл + Конечость была погнута в результате физической травмы, затрудняя ее пользование. Её можно выровнять используя сварочный аппарат. + Потеря Материала + Конечность потеряла материал в результате физической травмы. Она может быть восстановлена используя сталь. Если сила потери материала слишком большая, то конечность будет уничтожена. Расшатанные винты увеличивают потерю материала. + Водонепроницаемая Кибернетическая Конечность + Эта Кибернетическая конечность не получит урон от воды. + + Кибердополненная Печень + Частично синтетическая печень. кибернетически улучшенный метоболизм помогает в борьбе против ‖color:gui.green‖Ядов‖end‖, ‖color:gui.green‖Негативными Эффектами Препаратов‖end‖, и смягчает ‖color:gui.green‖Тошноту‖end‖. негативные эффекты препаратов включают алкогольное опьянение, зависимость, ломку, и передоз. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологическая печень, и занимет место печени. + Кибердополненная Почка + Частично синтетические почки. кибернетически улучшенный метоболизм помогает в ‖color:gui.green‖Свертивание Крови‖end‖ и ‖color:gui.green‖Синтезе‖end‖. Тип крови меняется на C+, предотвращая ‖color:gui.green‖Отторжение‖end‖ кибер органов, и позволяет ‖color:gui.green‖Принимать‖end‖ ВСЕ типы крови. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологические почки, и занимает место обоих почек. + Кибердополненное Сердце + Частично синтетическое сердце. кибернетически улучшенный метоболизм слегка увеличивает ‖color:gui.green‖Здоровье‖end‖ и улучшает ‖color:gui.green‖Скорость Нормализации Кровяного Давления‖end‖. усиливает ‖color:gui.green‖Быстрое Сокрощение Мышц‖end‖, которая увеличится сильнее с использованием ‖color:gui.blue‖Кибердополненных Лёгких ИЛИ Кибернетические Лёгкие‖end‖. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологическое сердце, и занимает место седрца. + Кибердополненные Лёгкие + Частично синтетические лёгкие. кибернетически улучшенный метоболизм увеличивает количество кислорода, усиливает сопротивление против ‖color:gui.green‖Гипоксемии‖end‖. даёт временное сопротивление против давления. усиливает ‖color:gui.green‖Быстрое Сокрощение Мышц‖end‖, которая увеличится сильнее с использованием ‖color:gui.blue‖Кибердополненного Сердца ИЛИ Кибернетического Сердца‖end‖. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ и ‖color:gui.green‖Пневмоторакса‖end‖ чем биологические лёгкие, и и занимает место лёгких. + Кибердополненный Мозговой Имплант + Чип для нейроной аугментации. кибернетически улучшенная нейронная обработка улучшает ‖color:gui.green‖Интеллект‖end‖, и ‖color:gui.green‖Болевые Рецепторы‖end‖ навсегда ослаблены. усиливает сопротивление против ‖color:gui.green‖нейротрамвы‖end‖, и вставляется поверх мозга. + Кибернетическая Печень + Синтетическая печень. Кибернетический метоболизм сильно помогает в борьбе против ‖color:gui.green‖Ядов‖end‖, ‖color:gui.green‖Негативными Эффектами Препаратов‖end‖, и сильно смягчает ‖color:gui.green‖Тошноту‖end‖. негативные эффекты препаратов включают алкогольное опьянение, зависимость, ломку, и передоз. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологическая печень, и занимет место печени. + Кибернетическая Почка + Пара синтетических почек. Кибернетический метоболизм сильно помогает в ‖color:gui.green‖Свертивание Крови‖end‖ и ‖color:gui.green‖Синтезе‖end‖. Тип крови меняется на C+, предотвращая ‖color:gui.green‖Отторжение‖end‖ кибер органов, и позволяет ‖color:gui.green‖Принимать‖end‖ ВСЕ типы крови. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологические почки, и занимает место обоих почек. + Кибернетическое Сердце + Синтетическое сердце. Кибернетический метоболизм сильно увеличивает ‖color:gui.green‖Здоровье‖end‖ и улучшает ‖color:gui.green‖Скорость Нормализации Кровяного Давления‖end‖. Усиливает ‖color:gui.green‖Быстрое Сокрощение Мышц‖end‖, которая увеличится сильнее с использованием ‖color:gui.blue‖Кибердополненных Лёгких ИЛИ Кибернетические Лёгкие‖end‖. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ чем биологическое сердце, и занимает место седрца. + Кибернетические Лёгкие + Пара синтетических лёгких. Кибернетически метоболизм сильно увеличивает количество кислорода, усиливает сопротивление против ‖color:gui.green‖Гипоксемии‖end‖. Даёт временное сопротивление против давления. усиливает ‖color:gui.green‖Быстрое Сокрощение Мышц‖end‖, которая увеличится сильнее с использованием ‖color:gui.blue‖Кибердополненного Сердца ИЛИ Кибернетического Сердца‖end‖. Имеет более лучшую защиту от ‖color:gui.green‖Повреждения‖end‖ и ‖color:gui.green‖Пневмоторакса‖end‖ чем биологические лёгкие, и и занимает место лёгких. + Позитронно-Кибер Мозговой имплант + Позитронный нейронный набор микросхем. Кибернетические компотационные процессоры сильно увеличивают ‖color:gui.green‖Интеллект‖end‖, и ‖color:gui.green‖Болевые Рецепторы‖end‖ навсегда ослаблены. усиливает сопротивление против ‖color:gui.green‖нейротрамвы‖end‖, и вставляется поверх мозга. + + Сжатое Кибер Лёгкое + Кибер Лёгкое сжалось, быстро предотвращая разрыв из-за давления. + Кибер Лёгкое сопротивилось сильному давлению, и оно сейчас самовосстанавливается. + + Пакет Крови C+ + Можно переливать реципиентам с: C+ + Карточка донора C+ + Реципиент для: Всех Типов Крови + Донор для: C+ + Иммуно Блокирующий Ингалятор + Уменьшает ‖color:gui.red‖Иммунную систему‖end‖, достаточен силён чтобы предотвратить ‖color:gui.green‖Киберпсихоз‖end‖. Киберпсихоз вызван использованием полностью искусственных ‖color:gui.blue‖Кибернетических Органов‖end‖. + + Киберпсихоз + Пациент страдает от Киберпсихоза, психическое заболевание вызванное большим количеством кибернетических имплантов. + Сопротивление Киберпсихозу + Пациент устойчив к киберпсихозу. + Имунно Блокирующий Ингалятор + + Кибернетическая Печень + установлена Кибернетическая печень. Помогает в борьбе с ядами, негативными эффектами препаратов, тошнотой, повреждению печени. + Кибернетические Почки + установлены кибернетические почки. помогают в борьбе с кровотечениями, кровопотерей, повреждением почек, меняет тип крови на C+. + Кибернетические Лёгкие + установлены кибернетические лёгкие. помогают в борьбе с гипоксемией, временным сильным давлением, повреждением лёгких, пневмотораксом, и усиливают скорость мышц. + Кибернетическое Сердеце + установлено кибернетичское сердце. помогает в борьбе с повреждением седрца, увеличивает здоровье, ускоряет нормализацию кровяного давления, и скорость мышц. + Кибер Мозговой Имплант + установлен Кибер Мозговой Имплант. помогает в борьбе с нейротравмой, увеличивает интеллект, и ослабляет боль. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Russian/Items.xml b/NT Informative Descriptions/Localization/Russian/Items.xml new file mode 100644 index 0000000..1a67a18 --- /dev/null +++ b/NT Informative Descriptions/Localization/Russian/Items.xml @@ -0,0 +1,250 @@ + + + + + + + Сканер здоровья + Питаемый аккумулятором прибор, отображающий статусы. Он может быть прицелен на человека для сканирования всего тела, либо лечением в интерфейсе здоровья отобразить статус выбранной конечности. Использование вызывает небольшую ‖color:gui.red‖радиационную болезнь‖end‖. Не показывает группу крови, сепсис, иммунитет, алкалоз, ацидоз, наркотики, ибо необходим ‖color:gui.blue‖гематологический анализатор‖end‖. + Позволяет чинить механические устройства. Еще используется для вправления ‖color:gui.green‖вывихов‖end‖, что требует в два раза меньше навыка если пациент не чувствителен к боли. + + Обеспечивает ограниченный доступ в различные части подлодки. Можно вставить ‖color:gui.blue‖карту донора‖end‖ в слот. + Можно вставить ‖color:gui.blue‖карту донора‖end‖ в слот. + Кровь одного из обитателей Европы. Она ‖color:gui.red‖несовместима‖end‖ с кровью человека. + Инъекция раствора натрия и хлора, использующаяся для увеличения ‖color:gui.green‖кровяного давления‖end‖, при этом вызывает ‖color:gui.green‖ацидоз‖end‖. При неудачном применении действует менее эффективно. + Обычный бинт, помогающий справиться с ‖color:gui.green‖кровотечениями‖end‖, и способствует заживлению ‖color:gui.green‖небольших ожогов‖end‖ и ‖color:gui.green‖ран‖end‖. При этом забинтованные конечности временно стабилизируют ‖color:gui.green‖переломы‖end‖, предотвращая внутренние травмы. При неудачном применении действует менее эффективно. + Синтетическая кожа с кровоостанавливающими свойствами, способная быстро исцелить ‖color:gui.green‖кровотечения‖end‖, является хорошим медикаментом против ‖color:gui.green‖небольших ожогов‖end‖, спобоствует заживлению ‖color:gui.green‖ран‖end‖. При применении на ‖color:gui.blue‖растянутой кожи‖end‖, полностью вылечивает ‖color:gui.green‖ожоги‖end‖ любой степени. При этом забинтованные конечности временно стабилизируют ‖color:gui.green‖переломы‖end‖, предотвращая внутренние травмы. При неудачном применении действует менее эффективно. + Относительно безопасный ‖color:gui.green‖анальгезирующий‖end‖ опиат, добываемый из водяного мака. Чаще всего используется в производстве морфина и фентанила. При неудачном применении действует менее эффективно и вызывает больше ‖color:gui.red‖зависимости‖end‖ и ‖color:gui.red‖передозировки‖end‖. + Сильный ‖color:gui.green‖анальгезирующий‖end‖ опиат, но при частом употреблении вызывает ‖color:gui.red‖зависимость‖end‖ и ‖color:gui.red‖передозировку‖end‖. При неудачном применении действует менее эффективно и вызывает больше ‖color:gui.red‖зависимости‖end‖ и ‖color:gui.red‖передозировки‖end‖. + Очень сильный ‖color:gui.green‖анальгезирующий‖end‖ опиат, но при частом употреблении вызывает ‖color:gui.red‖зависимость‖end‖ и ‖color:gui.red‖передозировку‖end‖. Анальгезия не только подавляет ‖color:gui.green‖боль‖end‖, но и ‖color:gui.green‖поддерживает ткань‖end‖ против урона. При неудачном применении действует менее эффективно и вызывает больше ‖color:gui.red‖зависимости‖end‖ и ‖color:gui.red‖передозировки‖end‖. + Препарат, нейтрализующий опиатные ‖color:gui.green‖воздержание‖end‖ и ‖color:gui.green‖передозировку‖end‖. При этом снижает ‖color:gui.green‖анальгезирующий‖end‖ эффект от опиатов. При неудачном применении действует менее эффективно и есть риск короткой ‖color:gui.red‖комы‖end‖. + Антибиотик, уничтожающий большинство болезнетворных бактерий, делая его эффективным медикаментом от ‖color:gui.green‖сепсиса‖end‖ и в меньшей степени, ‖color:gui.green‖заражения паразитами‖end‖. Однако, он обладает пониженной специфичностью и вызывает ‖color:gui.red‖повреждение органов‖end‖. Используется в качестве компонента многих медикаментов. При неудачном применении действует менее эффективно. + Природный гормон. На короткое время повышает ‖color:gui.green‖кровяное давление‖end‖, увеличивает ‖color:gui.green‖урон в ближнем бою‖end‖, сокращает вдвое ‖color:gui.green‖частоту фибрилляции‖end‖ и предотвращает ‖color:gui.green‖боль‖end‖. При применении он также лечит ‖color:gui.green‖остановку сердца‖end‖, снимает ‖color:gui.green‖оглушение‖end‖ и ненадолго даёт ‖color:gui.green‖сопротивление к оглушению‖end‖. + Для успокоения нервов, когда на море качка. Хотя, это будет вредно для легких. + Жизнь на подлодке давит на психику, а эта эксклюзивная сигара ручной работы помогает успокоить нервы. Хотя, это будет вредно для легких. + ‖color:gui.red‖Токсичный‖end‖ шприц с кислородитом который можно ввести, принудительно ‖color:gui.green‖насыщая кислородом кровь‖end‖ на короткий промежуток времени. Однако, токсичность кислородита вызывает немного ‖color:gui.red‖повреждения органов‖end‖. При неудачном применении, насыщение ‖color:gui.red‖моментально‖end‖ и ‖color:gui.red‖органам наносится дополнительный вред‖end‖. Гипоксемия вызывает нейротравму и повреждения органов, являясь собой главным источником смертей от боевых ранений. + Стимулятор увеличивающий ‖color:gui.green‖выносливость мускулатуры‖end‖ и используется как медикамент для лечения ‖color:gui.green‖внутренних травм‖end‖, ‖color:gui.green‖кислородного голодания‖end‖ и ‖color:gui.green‖кровопотери‖end‖. При неудачном применении действует менее эффективно. + Антибиотический клей с кровоостанавливающими свойствами. Почти мгновенно останавливает ‖color:gui.green‖кровотечение‖end‖ и предотвращает ‖color:gui.green‖заражение раны‖end‖. Также эффективен против ‖color:gui.green‖ожогов‖end‖. Используйте с осторожностью, так как при неудаче оно может вызвать ‖color:gui.red‖подвижные тромбы‖end‖ в кровеносной системе. + Сильнодействующий стимулятор нервной системы, временно повышающий ‖color:gui.green‖скорость мускулатуры‖end‖. Однако, он вызывает ‖color:gui.red‖зависимость‖end‖, слегка повреждает ‖color:gui.red‖органы‖end‖ и вызывает немного ‖color:gui.red‖нейротравмы‖end‖. При неудачном применении действует менее эффективно, вызывает более сильную ‖color:gui.red‖зависимость‖end‖ и нанесет больше ‖color:gui.red‖повреждений‖end‖. + Временно повышает ‖color:gui.green‖силу мускулатуры‖end‖ и ‖color:gui.green‖выносливость‖end‖. Он вызывает зависимость. При неудачном применении действует менее эффективно и вызывает более сильную ‖color:gui.red‖зависимость‖end‖. + Крайне мощный мышечный стимулятор - то что нужно, чтобы совершить тот самый важный рывок. Повышает ‖color:gui.green‖силу мускулатуры‖end‖, ‖color:gui.green‖выносливость‖end‖ и ‖color:gui.green‖скорость‖end‖, понижает ‖color:gui.green‖восприимчивость к оглушению‖end‖. Он вызывает ‖color:gui.red‖зависимость‖end‖ и немного ‖color:gui.red‖нейротравмы‖end‖. При неудачном применении действует менее эффективно и вызывает больше ‖color:gui.red‖зависимости‖end‖ и ‖color:gui.red‖нейротравмы‖end‖. + Сильный ‖color:gui.green‖антипсихотический‖end‖ препара, также эффективнен для лечения ‖color:gui.green‖алкогольной ломки‖end‖. При неудачном применении действует менее эффективно. + Лекарство от ‖color:gui.green‖паралича‖end‖, преждевременно прекращает ‖color:gui.green‖общую анестезию‖end‖. Чрезмерное использование может привести к ‖color:gui.red‖психозу‖end‖. При неудачном применении действует менее эффективно и вызывает больший ‖color:gui.red‖психоз‖end‖ + Медицинский раствор, который иногда применяется для лечения ‖color:gui.green‖внутренних травм‖end‖, но обычно используется, чтобы ‖color:gui.green‖продлить действие‖end‖ препаратов действующих на кровеносную систему или стимуляторов. + Крайне неустойчивая жидкость, которая может взорваться при нагревании или от удара. При приеме внутрь, он вызовет расширение сосудов и понизит ‖color:gui.green‖кровяное давление‖end‖. + Концентрированный сок взрывного граната. Обладает некоторыми ‖color:gui.green‖ранозаживляющими‖end‖ свойствами, в том числе ‖color:gui.green‖зашитые раны‖end‖. При неудачном применении действует менее эффективно. + Усовершенствованный стимулятор, быстро излечивает пользователя от ‖color:gui.green‖ран‖end‖, ‖color:gui.green‖ожогов‖end‖ и ‖color:gui.green‖кровопотери‖end‖. Также воздействие свертывающего реагента залечит ‖color:gui.green‖внешние‖end‖ и ‖color:gui.green‖внутренние кровотечения‖end‖. Он вызывает ‖color:gui.red‖зависимость‖end‖. При неудачном применении, он вызовет больше ‖color:gui.red‖зависимости‖end‖. + Медицинский спирт, который используется в качестве компонента различных медикаментов. Пить его на службе не рекомендуется, а чрезмерное употребление вредно для печени. + Выпивка на основе сока бича раптора или взрывного граната. Пуристы считают, что настоящий ром можно сделать только из сахарного тростника – но попробуй найди его на Европе. Его высокое содержание алкоголя достаточно что бы истребить раннее ‖color:gui.green‖заражение паразитом‖end‖, но чрезмерное употребление вредно для печени. + Режет, колет, рубит и рассекает. Также используется чтобы снять старые ‖color:gui.green‖бинты‖end‖. При неудачном применении, вызывает ‖color:gui.red‖рваные раны‖end‖ и ‖color:gui.red‖кровотечение‖end‖. + Концентрированный сок бича раптора. Умеренно токсичен для людей, катастрофически токсичен для грязевых рапторов. При применении вызывает рвоту у людей, что является достойным лечением ‖color:gui.green‖ацидоза‖end‖. При неудачном применении, он не вызывает рвоту. + + Ручной дефибриллятор + Инструмент использующий заряд аккумулятора для лечения ‖color:gui.green‖остановки сердца‖end‖ или ‖color:gui.green‖фибрилляции‖end‖. Используйте ‖color:gui.blue‖автоматизированый внешний дефибрилятор‖end‖ если навык медицины ниже 80. При неудачном применении, вызывает ‖color:gui.red‖остановку сердца‖end‖. + Автоматизированый внешний дефибрилятор + Автоматизированный вариант дефибриллятора использует заряд аккумулятора для лечения ‖color:gui.green‖остановки сердца‖end‖. Используйте ‖color:gui.blue‖ручной дефибриллятор‖end‖ если навык медицины выше 80. + Мешок амбу + Инструмент лечит ‖color:gui.green‖нехватку кислорода‖end‖ при наличии кислородного баллона, и дополнительно лечит ‖color:gui.green‖остановку дыхания‖end‖ при наличии баллона с кислородитом. + АвтоПульс + Механизм занимающий слот верхней одежды. После некоторого времени, лечит ‖color:gui.green‖остановку сердца‖end‖ и ‖color:gui.green‖фибрилляцию‖end‖. Предотвращает отрицательные эффекты от статуса ‖color:gui.green‖остановки дыхания‖end‖. Ношение АвтоПульса дополнительно увеличивает ‖color:gui.green‖кровяное давление‖end‖ во время использования, что может быть полезно в экстренной ситуации. Не забудьте снять его, если он больше не нужен! + Гематологический анализатор + Инструмент который отображает иммунитет, группу и резус фактор крови. Также способен показать кровопотерю, сепсис, алкалоз, ацидоз, действующие препараты в кровотоке. Если в слоте устройства находится ‖color:gui.blue‖пустая карта донора‖end‖, он распечатает группу и резус фактор крови в удостоверение личности пациента, если там есть пустой слот. Использование гематологического анализатора требует немного ‖color:gui.red‖крови‖end‖. + Пустая карта донора + Пустая карта использующаяся в ‖color:gui.blue‖гематологическом анализаторе‖end‖, чтобы распечатать карту донора для пациента. + Медицинские ножницы + Инструмент для снятия ‖color:gui.green‖бинтов‖end‖ или ‖color:gui.green‖гипсовых слепков‖end‖. При неудачном применении, вызывает ‖color:gui.red‖кровотечение‖end‖ и ‖color:gui.red‖рваные раны‖end‖. + Инвалидная коляска + Средство передвижения занимающее слот верхней одежды. Позволяет полагаться на свои руки во время движения, улучшая ходьбу при нерабочих ногах. + Синяя акула + Милая акулка, при применении в лечении совсем немного снижает ‖color:gui.green‖психоз‖end‖. + Мешок для трупа + Мешок носимый в слоте верхней одежды. Позволяет тащить пациента или труп в ‖color:gui.green‖полной скорости‖end‖, но еще живой человек не сможет дышать через мешок, что вызывает ‖color:gui.red‖кислородное голодание‖end‖. + Стазис мешок + Мешок носимый в слоте верхней одежды, защищает от давления до 10,000 метров. Позволяет тащить пациента или труп в ‖color:gui.green‖полной скорости‖end‖. При ношении живым человеком он вызывает ‖color:gui.red‖остановку сердца‖end‖, ‖color:gui.red‖остановку дыхания‖end‖, ‖color:gui.red‖бессознательность‖end‖ и ‖color:gui.red‖запрещает проводить хирургию‖end‖, но при этом ‖color:gui.green‖приостанавливает большинство ухудшающих здоровье эффектов‖end‖. Мешок портится на 1% каждые 4 секунды активного ношения. + После надевания Вы потеряете сознание. Вы уверены что хотите надеть стазис мешок? + + Скальпель + Инструмент для хирургических ‖color:gui.green‖надрезов‖end‖. Надрез является первым действием в любой хирургической процедуре, но вызывает ‖color:gui.red‖кровопотерю‖end‖, если после него не использовать ‖color:gui.blue‖зажим‖end‖. Кроме того, надрезы выполняются только если пациент не чувствителен к боли, в ином случае процедура вызовет ‖color:gui.red‖травматический шок‖end‖. При неудачном применении, вызывает ‖color:gui.red‖кровотечение‖end‖ и ‖color:gui.red‖рваные раны‖end‖. + Зажим + Инструмент для хирургического ‖color:gui.green‖зажатия кровеносных сосудов‖end‖. Является вторым действием в большинстве хирургических процедур, выполняемый после ‖color:gui.blue‖надреза скальпелем‖end‖. + Расширитель + Инструмент для хирургического ‖color:gui.green‖растягивания кожи‖end‖. Оттягивание кожи является третьим действием в большинстве хирургических процедур, но вызовет ‖color:gui.red‖травматический шок‖end‖, если пациент в сознании и не близок к больничной кровати или ‖color:gui.blue‖операционному столу‖end‖. Используется после ‖color:gui.blue‖зажима кровеносных сосудов‖end‖. При неудачном применении, вызывает ‖color:gui.red‖внутренние травмы‖end‖. + Полустерильный пинцет + Инструмент позволяющий удалять нежелательную ткань. Может быть использован после ‖color:gui.blue‖растянутой кожи‖end‖, чтобы удалить немного ‖color:gui.green‖инородных тел‖end‖ или конвертации ‖color:gui.green‖сильного ушиба‖end‖ и ‖color:gui.green‖внутренних травм‖end‖ в ‖color:gui.blue‖зашиваемые‖end‖ ‖color:gui.green‖рваные раны‖end‖. ‖color:gui.green‖Инородные тела‖end‖ также могут быть удалены через открытые огнестрельные или повреждение глубоких тканей, но это вызовет немного ‖color:gui.red‖травматического шока‖end‖. При неудачном применении, вызывает ‖color:gui.red‖внутренние травмы‖end‖. + Хирургическая пила + Инструмент для хирургического ‖color:gui.green‖распиливания костей‖end‖. Может быть использован после ‖color:gui.blue‖растянутой кожи‖end‖, чтобы распилить кость и либо удалить конечность, либо пришить ее. Замена конечности необходима если сила гангрены выше 15%. При неудачном применении, вызывает ‖color:gui.red‖кровотечение‖end‖, ‖color:gui.red‖внутренние травмы‖end‖ и ‖color:gui.red‖рваные раны‖end‖. + Медицинские швы + Синтетические рассасывающиеся швы использующиеся для завершения хирургии. При применении, прекращает хирургические операции в любом этапе. Дополнительно, они используются для ‖color:gui.red‖зашивания‖end‖ ‖color:gui.green‖открытых ран‖end‖ и лечения больших внешних ‖color:gui.green‖кровотечений‖end‖. При неудачном применении, вызывает ‖color:gui.red‖внутренние травмы‖end‖. + Хирургическая дрель + Инструмент для хирургического ‖color:gui.green‖просверливания костей‖end‖. Могут быть использованы после ‖color:gui.blue‖растянутой кожи‖end‖, чтобы просверлить кость, вставить ‖color:gui.blue‖остеосинтетический‖end‖ имплант и вылечить переломы. При неудачном применении, вызывает ‖color:gui.red‖кровотечение‖end‖ и ‖color:gui.red‖внутренние травмы‖end‖. + Остеосинтетические импланты + Титановые импланты для лечения переломов. Могут быть вставлены после ‖color:gui.blue‖просверленных костей‖end‖. В случае костной смерти, остеосинтетическая процедура должна быть сделана в каждом участке тела. При неудачном применении, вызывает ‖color:gui.red‖кровотечение‖end‖ и ‖color:gui.red‖внутренние травмы‖end‖. + Импланты позвоночного столба + Титановые импланты для лечения травм позвоночного столба. Могут быть вставлены после ‖color:gui.blue‖растянутой кожи‖end‖. Однако, позвоночный столб будет снова травмирован, если перелом шеи не вылечен ‖color:gui.blue‖остеосинтетической‖end‖ процедурой. + Эндоваскулярный баллон + Баллон, вставляемый в аорту при его разрыве. Это остановит ‖color:gui.green‖кровопотерю‖end‖ вызываемой разрывом, но закупоренность со временем вызывает ‖color:gui.red‖гангрену‖end‖. Может быть вставлен после ‖color:gui.blue‖надреза скальепелем‖end‖. + Медицинский стент + Пластиковая конструкция которая вставляется в аорту для лечения разрыва аорты. Может быть использован после ‖color:gui.blue‖закупоренной баллоном аорты‖end‖. + Дренаж + Используется для лечения ‖color:gui.green‖пневмоторакса‖end‖, удаляя воздух из плевральной полости. Может быть использован после ‖color:gui.blue‖растянутой кожи‖end‖. Пневмоторакс это потенциально опасный статус, потому что он предотвращает снижение гипоксемии. + Операционный стол + Транспортируемая версия больничной койки, предназначенная для установки на подлодках. Как и больничная койка, он идет в комлекте с ‖color:gui.green‖искусственной вентиляцией‖end‖. В дополнении, он имеет проводимые выводы для отображения данных о здоровье пациента. + Скалпель для извлечения печени + Спец скальпель для извлечения печени. Может использоваться после ‖color:gui.blue‖растянутой кожи‖end‖ на торсе. + Скалпель для извлечения почек + Спец скальпель для извлечения почек. Может использоваться после ‖color:gui.blue‖растянутой кожи‖end‖ на торсе. + Скалпель для извлечения легких + Спец скальпель для извлечения легких. Может использоваться после ‖color:gui.blue‖растянутой кожи‖end‖ на торсе. + Скалпель для извлечения сердца + Спец скальпель для извлечения сердца. Может использоваться после ‖color:gui.blue‖растянутой кожи‖end‖ на торсе. + Скалпель для извлечения мозга + Спец скальпель для извлечения мозга. Может использоваться после ‖color:gui.blue‖растянутой кожи‖end‖ на голове. + Универсальный скальпель + Скальпель для выполнения надрезов, извлечения органов, снятия бинтов / гипсовых слепков или небрежной медицинской практики. Возьмите его в руки для изменения режима действия. + Режим: Хирургический надрез. Возьмите его в руки для изменения режима действия. + Режим: Извлечь почки + Режим: Извлечь печень + Режим: Извлечь легкие + Режим: Извлечь сердце + Режим: Извлечь мозг + Режим: Снять бинт, гипсовый слепок, небрежная практика. Возьмите его в руки для изменения режима действия. + Режим: Адаптивное извлечение органов. Применение на голове извлекает мозг, левая рука - почки, торс - печень, правая рука - сердце, левая нога - легкие. Возьмите его в руки для изменения режима действия. + Надрез + Почки + Печень + Легкие + Сердце + Мозг + Бинт, гипсовые слепки, небрежная практика + Адаптивное извлечение органов + + Пустой пакет для крови + Пустой пакет для переливания крови. При наполнении пакета, учитывается наличие у донора ‖color:gui.red‖алкалоза‖end‖, ‖color:gui.red‖ацидоза‖end‖, ‖color:gui.red‖сепсиса‖end‖. Брать один пакет крови у донора безопасно, если донор здоров. При неудачном изъятии крови, донор потеряет ‖color:gui.red‖потенциально смертельное‖end‖ количество крови. + Пакет крови O+ + Можно переливать реципиентам с: O+, A+, B+, AB+ + Пакет крови O- + Можно переливать любым реципиентам. + Пакет крови A+ + Можно переливать реципиентам с: A+, AB+ + Пакет крови B+ + Можно переливать реципиентам с: B+, AB+ + Пакет крови AB+ + Можно переливать реципиентам с: AB+ + Пакет крови A- + Можно переливать реципиентам с: A-, A+, AB-, AB+ + Пакет крови B- + Можно переливать реципиентам с: B-, B+, AB-, AB+ + Пакет крови AB- + Можно переливать реципиентам с: AB-, AB+ + + Пакет крови O- + Можно переливать любым реципиентам. + + Карточка донора O- + Реципиент для: O- + Донор для любого типа крови + Карточка донора O+ + Реципиент для: O-, O+ + Донор для: O+, A+, B+, AB+ + Карточка донора A- + Реципиент для: O-, A- + Донор для: A-, A+, AB-, AB+ + Карточка донора A+ + Реципиент для: O-, O+, A-, A+ + Донор для: A+, AB+ + Карточка донора B- + Реципиент для: O-, B- + Донор для: B-, B+, AB-, AB+ + Карточка донора B+ + Реципиент для: O-, O+, B-, B+ + Донор для: B+, AB+ + Карточка донора AB- + Реципиент для: O-, A-, B-, AB- + Донор для: AB-, AB+ + Карточка донора AB+ + Реципиент для любого типа крови + Донор для: AB+ + + Аптечка общего назначения + Может хранить только медицинские предметы. + Аптечка хирурга + Может хранить только хирургические предметы. + Холодильный контейнер + Контейнер для хранения донорских органов и конечностей. Органы умирают быстро вне холодильного контейнера, а конечности умирают медленнее чем органы. Органы и конечности регенерируют в холодильном контейнере: органы, если их состояние выше 90%; конечености, если их состояние выше 95%. + Холодильный ящик + Ящик для хранения донорских органов и конечностей. Органы умирают быстро вне холодильного ящика, а конечности умирают медленнее чем органы. Органы и конечности регенерируют в холодильном ящике: органы, если их состояние выше 90%; конечности, если их состояние выше 95%. + Базовый медицинский набор + Набор со всеми базовыми медицинскими предметами в небольшом количестве. + + Правая рука + Ампутированная правая рука. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. Умирает вне холодильного контейнера. Может быть переработана на ‖color:gui.green‖кальций‖end‖. + Левая рука + Ампутированная левая рука. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. Умирает вне холодильного контейнера. Может быть переработана на ‖color:gui.green‖кальций‖end‖. + Правая нога + Ампутированная правая нога. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. Умирает вне холодильного контейнера. Может быть переработана на ‖color:gui.green‖кальций‖end‖. + Левая нога + Ампутированная левая нога. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. Умирает вне холодильного контейнера. Может быть переработана на ‖color:gui.green‖кальций‖end‖. + Бионическая правая рука + Заменяет соответствующую ампутированную конечность и выполняет всё её функции. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. + Бионическая левая рука + Заменяет соответствующую ампутированную конечность и выполняет всё её функции. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. + Бионическая правая нога + Заменяет соответствующую ампутированную конечность и выполняет всё её функции. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. + Бионическая левая нога + Заменяет соответствующую ампутированную конечность и выполняет всё её функции. Может быть пришита после ‖color:gui.blue‖распиливания кости‖end‖. + Печень + Повреждение печени нарушает естественную способность организма к регенерации ‖color:gui.red‖кровотечения‖end‖, а так же влияет на увеличение ‖color:gui.red‖нейротравмы‖end‖, повышает ‖color:gui.red‖кровяное давление‖end‖, и вызывает постоянное ‖color:gui.red‖внутреннее кровотечение‖end‖ при полном отказе органа. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Печень + Повреждение печени нарушает естественную способность организма к регенерации ‖color:gui.red‖кровотечения‖end‖, а так же влияет на постепенное увеличение ‖color:gui.red‖нейротравмы‖end‖, повышает ‖color:gui.red‖кровяное давление‖end‖, и вызывает постоянное ‖color:gui.red‖внутреннее кровотечение‖end‖ при полном отказе органа. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Легкие + Полный отказ легких вызывает ‖color:gui.red‖остановку дыхания‖end‖. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Легкие + Полный отказ легких вызывает ‖color:gui.red‖остановку дыхания‖end‖. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Почка + Высокие повреждения почек вызывают ‖color:gui.red‖ацидоз‖end‖, постепенное увеличение ‖color:gui.red‖нейротравмы‖end‖, ‖color:gui.red‖повреждение костей‖end‖, и повышает ‖color:gui.red‖кровяное давление‖end‖. При повреждении почек на 50% считается, что одна почка отказала и больше не способна к самовосстановлению. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Почка + Высокие повреждения почек вызывают ‖color:gui.red‖ацидоз‖end‖, постепенное увеличение ‖color:gui.red‖нейротравмы‖end‖, ‖color:gui.red‖повреждение костей‖end‖, и повышает ‖color:gui.red‖кровяное давление‖end‖. При повреждении почек на 50% считается, что одна почка отказала и больше не способна к самовосстановлению. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Сердце + Полный отказ сердца вызывает ‖color:gui.red‖остановку сердца‖end‖. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Сердце + Полный отказ сердца вызывает ‖color:gui.red‖остановку сердца‖end‖. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает вне холодильного контейнера. + Мозг + Извлеченный мозг вызывает стремительный рост ‖color:gui.red‖нейротравмы‖end‖. Мозг человека можно пересадить другому человеку, чтобы он мог управлять им. Для пересадки органа, старый орган должен быть извлечен при помощи ‖color:gui.blue‖скальпеля для органа‖end‖. Орган погибает крайне быстро вне человека. + Нерабочая правая рука + Эта рука не работает, так как была ‖color:gui.red‖вывихнута‖end‖, ‖color:gui.red‖сломана‖end‖, или ‖color:gui.red‖полностью потеряна‖end‖. + Нерабочая левая рука + Эта рука не работает, так как была ‖color:gui.red‖вывихнута‖end‖, ‖color:gui.red‖сломана‖end‖, или ‖color:gui.red‖полностью потеряна‖end‖. + + Маннитол + Сахарный спирт применяемый для лечения ‖color:gui.green‖нейротравмы‖end‖. Важно помнить, что это лекарство имеет наилучшую эффективность при ‖color:gui.red‖кровяном давлении‖end‖ выше 70% и при ‖color:gui.red‖гипоксемии‖end‖ ниже 30%. Вызывает повреждение ‖color:gui.red‖сердца‖end‖ и ‖color:gui.red‖почек‖end‖. При неудачном применении действует менее эффективно и вызовет больше повреждений ‖color:gui.red‖сердца‖end‖ и ‖color:gui.red‖почек‖end‖. + Стрептокиназа + Фермент, разрушающий кровяные сгустки. Лечит ‖color:gui.green‖инфаркт‖end‖ и ‖color:gui.green‖гемотрансфузионный шок‖end‖. По неясной причине усугубляет течение ‖color:gui.red‖инсульта‖end‖. + Азатиоприн + Иммунодепрессант, снижающий ‖color:gui.green‖иммунитет‖end‖, для предотвращения ‖color:gui.green‖отторжения органа‖end‖ или для переливания ‖color:gui.green‖несовместимого типа крови‖end‖ без появления гемотрансфузионного шока. Но, чем ниже иммунитет, тем пациент более предрасположен к ‖color:gui.red‖сепсису‖end‖. Если производить трансплантацию чужого органа при иммунитете выше 10%, то орган погибнет. При неудачном применении есть риск вызвать ‖color:gui.red‖сепсис‖end‖. + Тиамин + Витамин B1, немого ускоряющий ‖color:gui.green‖регенерацию органов‖end‖. При неудачном применении действует менее эффективно. + Нитропруссид натрия + Медикамент, предназначенный для снижения ‖color:gui.green‖кровяного давления‖end‖. При неудачном применении действует менее эффективно. + Антибиотическая мазь + Антибиотическая мазь, предназначенная для устранения ‖color:gui.green‖зараженных ран‖end‖ и ‖color:gui.green‖ожогов 1-ой и 2-ой степени‖end‖. При неудачном применении действует менее эффективно. + Жгут + Предмет первой помощи для предотвращения ‖color:gui.green‖кровопотери из кровоточащей артерии‖end‖. Ухудшает состояние пострадавшего при применении на ‖color:gui.red‖голову‖end‖. Пережатые артерии вызывают ‖color:gui.red‖гангрену‖end‖ с течением времени. Жгут снимется после завершения хирургического закрытия артерии. При неудачном применении вызывает ‖color:gui.red‖ушиб‖end‖ + Игла + Специальная игла, предназначенная для оказания первой помощи при ‖color:gui.green‖пневмотораксе‖end‖. Применение вызывает ‖color:gui.red‖пневмоторакс‖end‖, но не позволяет ему стать выше 15%. При неудачном применении наносит ‖color:gui.red‖повреждение органам‖end‖ и ‖color:gui.red‖кровотечение‖end‖. При высоких значениях пневмоторакса, гипоксемия не будет проходить естественным путём. + Раствор Рингера + Изотонический раствор, применяемый для повышения ‖color:gui.green‖кровяного давления‖end‖. При неудачном применении действует менее эффективно. + Антисептик + Используется в ‖color:gui.blue‖антисептическом спрее‖end‖, который применяется для устранения ‖color:gui.green‖зараженных ран‖end‖. + Антисептический спрей + Предназначен для устранения ‖color:gui.green‖зараженных ран‖end‖. Требует ‖color:gui.blue‖антисептик‖end‖ для применения. + Пропофол + Вводит общий ‖color:gui.green‖наркоз‖end‖. Действует постепенно, переводя пациента в статус ‖color:gui.red‖без сознания‖end‖. После чего позволяет избегать ‖color:gui.green‖травматического шока‖end‖ во время операции. Для быстрого выведения из наркоза применяется ‖color:gui.blue‖анапарализатор‖end‖. + Гипс + Используется для стабилизации ‖color:gui.green‖переломов‖end‖, позволяя им заживать. Используется после перевязки конечности ‖color:gui.blue‖бинтом‖end‖. При неудачном применении расходуется без пользы. + Холодный гелевый пакет + Пакет холодного геля, который значительно способствует заживлению ‖color:gui.green‖ушибов‖end‖. Неэффективен против ‖color:gui.red‖других видов травм‖end‖ и ‖color:gui.red‖ухудшает инфекции‖end‖. Может использоваться до трех раз. Теряет эффективность, если его не хранить в холодильнике. При хранении в холодильнике его состояние со временем восстанавливается. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Russian/SurgeryPlus.xml b/NT Informative Descriptions/Localization/Russian/SurgeryPlus.xml new file mode 100644 index 0000000..a58b289 --- /dev/null +++ b/NT Informative Descriptions/Localization/Russian/SurgeryPlus.xml @@ -0,0 +1,89 @@ + + + + + + + Маннитол плюс + Улучшенная формула маннитола. Лечит немного ‖color:gui.green‖нейротравмы‖end‖, при том независимо от состояния крови у пациента и не повреждает органы. + Искусственный мозг + Искуственный головной мозг, поддерживающий тело в вегетативном состоянии до пересадки мозга. + Хирургический костюм + Стерильный хирургический костюм для предотвращения заражения во время операции. + Хирургическая маска + Маска, защищающая пациента от воздушно-капельных патогенов во время операции. + Сосуд для мозга + Сосуд для длительного хранения головного мозга. + Хирургическая простыня + Стерильная простыня для предотвращения заражения во время операции. + "Врачебные ошибки" + Руководство по проведению хирургических процедур. + Первичная медицинская карточка (автоматическая) + Метка, которая используется для эффективного распределения пациентов в порядке срочности лечения. + Первичная медицинская карточка (ручная) + Первичная медицинская карточка. Наносится на ноги для зеленого, на руки для желтого, на туловище для красного и на голову для черного. + Экспериментальный препарат + Непредсказуемый препарат, который может вызвать как незначительное (или значительное) улучшение, так и ухудшение состояния пациента. + + Слой антибиотической мази защищает от заражения и сохраняет рану стерильной. Предотвращает риск вызывания сепсиса во время хирургии. + + Профилактическое разрешение + Серьезные травмы менее вероятны. + Искусственный мозг + Пациент постоянно находится в вегетативном состоянии, но тело остается живым. + Маркер: Незначительные травмы + Пациент получил метку "незначительные травмы". Лечение не требуется. + Маркер: Отложенная помощь + Пациент получил метку "отложенная помощь". Его травмы не опасны для жизни. + Маркер: Неотложная помощь + Пациент получил метку "неотложная помощь". Ему требуется немедленное лечение. + Маркер: Мёртв + Пациент получил метку "мёртв". Медицинская помощь должна быть оказана другим. Спасение пациента маловеротно или невозможно. + + Хирург + В то время как врач лучше лучше оказывает первую медицинскую помощь и быстро реагирует, хирург специализируется на оптимизации хирургических процедур. Меньший риск заражения и более быстрое исполнение работы. + Хирургия + Этичная медицина + Начинающий фармацевт + Полевой хирург + Адреналиновый насос + Таскание тел на полной скорости. + Дает дополнительную скорость передвижения, равную [skillpercentage]% Вашего навыка хирургии. + Самоучка + Дает [amount]% бонусного опыта за выполнение миссии, во время которой Вы производили лечение члена экипажа. + Интуиция хирурга + Впервые открывая медицинский (или инопланетный) контейнер, у Вас есть вероятность в [probability]% найти дополнительные предметы. + Здорово, инженеры! + Аптечка первой помощи + В начале каждого раунда дает: + Главный инъектор + Применяемые вами медицинские предметы становятся на [amount]% эффективнее. + Под давлением + Находящиеся рядом с вами, бессознательные пациенты получают [amount]% устойчивости к кровопотере, повреждению органов и нейротравмам. + Рыба - это образцы, а не еда! + Когда Вы или другой член экипажа убивает монстра за пределами вашей подлодки, у Вас есть вероятность в [amount]% найти случайный генетический материал на нем. + Комфортные условия для пациента + Пациенты рядом с вами восстанавливаются быстрее. Эффект удваивается, если они лежат в постели. + Меня зовут Брюс... Рейц + Органы, которые Вы извлекаете, продаются по полной цене, а трансплантированные Вами органы никогда не отторгаются. + Ультразвуковой очиститель + Дренажи, эндоваскулярные баллоны и иглы больше не расходуются, когда Вы их используете. + Дает бонус в размере [amount] к стерильности, меньше сепсиса - ура! + Терапевт-стажер + Дает [amount]% дополнительного здоровья. + Неэтичная медицина + Маннитоловый маньяк + Самообслуживание + Дает [amount]% устойчивости к [affliction]. + Быстрое развертывание + Пожалуйста, перестаньте стрелять в меня ради удовольствия, капитан + Я упал и не могу встать! + Профилактическое разрешение + Последний человек, которому Вы дали приказ, получает [physicalresistance]% к сопротивлению урону и снижается веротность полочения им тяжёлых травм. + Я хирург, а не... + Используя Ваш превосходный "Интеллект хирурга™", Вы можете получить [amount] бонусного навыка, вот так просто! + Или Вы можете выбрать вариант [jobname], что даст Вам [amount] бонусных навыков ко всему остальному. + Ты не умрёшь, солдат! + [itemname], который Вы применяете, действует мнгновенно. + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Russian/dummy.xml b/NT Informative Descriptions/Localization/Russian/dummy.xml new file mode 100644 index 0000000..88c886e --- /dev/null +++ b/NT Informative Descriptions/Localization/Russian/dummy.xml @@ -0,0 +1,12 @@ + + + + + + Dummy 1 name + Dummy 1 description + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Simplified Chinese/Afflictions.xml b/NT Informative Descriptions/Localization/Simplified Chinese/Afflictions.xml new file mode 100644 index 0000000..5dbe414 --- /dev/null +++ b/NT Informative Descriptions/Localization/Simplified Chinese/Afflictions.xml @@ -0,0 +1,307 @@ + + + + + + 伤口处是一个小而黑暗的淤青孔,渗出少量血液。然而,伤口是一个暴露组织的大而参差不齐的伤口,血流不止。可能会发生感染,而且可能还有子弹残留在体内。 + 子弹避开了所有重要部位,直接穿过,但疼痛是真实的,感染风险也是存在的。可能会发生感染,且可能仍有子弹留在体内。 + 该区域呈现丑陋的紫色,触摸时非常痛苦。你怀疑可能有骨折。这个伤口不能缝合。 + 轻微的瘀伤显示了某物击中的地方,但看起来没有任何骨折。这个伤口不能缝合。 + 皮肤被刺穿,有深深的出血伤口。很可能会引起感染。 + 伤口看起来比实际情况更严重,但不能排除感染的可能性。 + 该区域软组织受到广泛损伤,有不对称的出血伤口。很可能会引起感染。 + 某物试图大咬一口,但幸运的是只咬了一小口。不过可能会引起感染。 + 该区域呈紫色。皮下组织感觉与周围皮肤不同。很可能会发生感染,同时也有弹片残留。 + 皮肤表面看起来稍微有些瘀伤。可能会发生感染或残留弹片。 + 血液从这个参差不齐且特别糟糕的开放性伤口中自由流出。如果情况进一步恶化,可能会引起动脉破裂。 + 血液正在缓慢地从伤口中滴出。 + 血液以惊人的速度喷涌而出。可能会导致动脉破裂。 + + + 右肱骨骨折 + 右臂骨折,可能由于物理创伤引起。在石膏固定或外科修复之前,将无法使用此臂。 + 左肱骨骨折 + 左臂骨折,可能由于物理创伤引起。在石膏固定或外科修复之前,将无法使用此臂。 + 右股骨骨折 + 右腿骨折,可能由于物理创伤引起。在石膏固定或外科修复之前,行动将会困难。 + 左股骨骨折 + 右腿骨折,可能由于物理创伤引起。在石膏固定或外科修复之前,行动将会困难。 + 肋骨骨折 + 一根或多根肋骨骨折,可能由于物理创伤引起。结构不稳定可能导致气胸。必须在骨折修复手术中修复。 + 头骨骨折 + 头骨骨折,可能由于物理创伤引起。骨碎片和结构不稳定将导致少量的神经创伤。必须在骨折修复手术中修复。 + 颈部骨折 + 颈部因创伤骨折。结构不稳定使脊髓暴露,容易受伤。必须在骨折修复手术中修复。 + 创伤性截肢 + 大部分右臂因物理创伤被撕裂,导致动脉破裂。该肢体必须在锯骨后更换。 + 创伤性截肢 + 大部分左臂因物理创伤被撕裂,导致动脉破裂。该肢体必须在锯骨后更换。 + 创伤性截肢 + 大部分右腿因物理创伤被撕裂,导致动脉破裂。该肢体必须在锯骨后更换。 + 创伤性截肢 + 大部分左腿因物理创伤被撕裂,导致动脉破裂。该肢体必须在锯骨后更换。 + 创伤性截肢 + 头部被爆炸撕裂,立即死亡。 + 脊髓损伤 + 由于颈部骨折暴露,脊柱受损,导致全身瘫痪。他们仍然清醒。必须在脊髓手术中修复。 + 脱臼 + 右腿骨骼因物理创伤移位,导致疼痛并使行动困难。可以使用扳手重新定位骨骼。 + 脱臼 + 左腿骨骼因物理创伤移位,导致疼痛并使行动困难。可以使用扳手重新定位骨骼。 + 脱臼 + 右臂骨骼因物理创伤移位,导致疼痛并无法使用此肢体。可以使用扳手重新定位骨骼。 + 脱臼 + 左臂骨骼因物理创伤移位,导致疼痛并无法使用此肢体。可以使用扳手重新定位骨骼。 + 股动脉出血 + 左股动脉被异物切断或因严重出血引起,导致严重失血。应使用止血带抑制,直至手术缝合。 + 股动脉出血 + 右股动脉被异物切断或因严重出血引起,导致严重失血。应使用止血带抑制,直至手术缝合。 + 肱动脉出血 + 左肱动脉被异物切断或因严重出血引起,导致严重失血。应使用止血带抑制,直至手术缝合。 + 肱动脉出血 + 右肱动脉被异物切断或因严重出血引起,导致严重失血。应使用止血带抑制,直至手术缝合。 + 颈动脉出血 + 颈动脉被异物切断或因严重出血引起,导致严重失血。使用止血带止血很危险,必须手术缝合。 + 坏疽 + 由于败血症或血流受阻,肢体萎缩并变黑。该肢体必须截肢超过15%,因为它不会再愈合。 + 一级烧伤 + 该区域发红且触摸时疼痛,但除非严重,否则不会引起感染。如有必要,绷带或抗生素凝胶是足够的治疗方法。 + 二级烧伤 + 受影响区域有非常痛苦的水泡。感染率很高,会导致自毁性败血症。绷带或抗生素凝胶是足够的治疗方法。 + 三级烧伤 + 在这个皮革状、僵硬的区域内无痛感。感染几乎是立即发生的,败血症的发生很迅速。抗生素胶是最迅速的治疗方法。 + + 心率增快 + 心率异常增快。如果强度增加,可能出现潜在致命的颤动,通常由低血压或低氧血症引起。 + 心律不齐 + 心跳模式异常。颤动可能致命,通常由低血压或低氧血症引起。 + 心脏骤停 + 没有心跳。致命状态将导致血压无法正常化,如果不及时治疗,还会导致昏迷。通常是颤动的最终结果,也可能由低氧血症引起。必须使用除颤器、肾上腺素或心肺复苏术重启心脏。 + 呼吸骤停 + 没有呼吸。致命状态将阻止血液的氧合。通常由低氧血症或阿片类药物过量引起。 + 过度换气 + 呼吸频率异常增高。逐渐引起非致命性碱中毒,通常由低血压、低氧血症或气胸引起。 + 呼吸不足 + 呼吸频率异常降低。逐渐引起潜在致命性酸中毒,通常由镇痛引起。严重的酸中毒将导致颤动。 + 呼吸困难 + 呼吸困难。通常由心包填塞、气胸或低氧血症引起。 + 咳嗽 + 周期性咳嗽。由心包填塞、肺部或心脏损伤引起。 + 皮肤苍白 + 皮肤苍白。由低氧血症或失血引起。 + 头晕 + 头晕感。由低血压引起。 + 视力模糊 + 眼睛难以对焦。通常由低血压或脑震荡引起。 + 意识混乱 + 思考困难。通常由低氧血症、酸中毒或脑震荡引起。 + 头痛 + 头部疼痛。通常由低氧血症、颅骨骨折、酸中毒、脑震荡或中风引起。 + 腿部肿胀 + 腿部液体积聚。由肝脏、肾脏或严重的心脏损伤引起。 + 无力 + 肢体肌肉能力减弱。由心包填塞、失血或酸中毒引起。 + 喘息 + 呼吸时发出高音。由输血性休克引起。 + 呕吐 + 周期性呕吐。通常由肾脏损伤、酒精或输血性休克引起。 + 呕血 + 周期性呕血。通常由严重的内部出血或肝衰竭引起。 + 发热 + 体温异常升高。通常由败血症引起。 + 腹部不适 + 腹部不适。由肝损伤引起。 + 腹胀 + 腹部胀气。由肝损伤引起。 + 黄疸 + 皮肤发黄。由严重的肝损伤引起。 + 出汗 + 异常大量出汗。由心脏病发作或戒毒引起。 + 心悸 + 感到心跳加速。由碱中毒引起。 + 昏迷 + 他们昏迷不醒。通常由严重的物理创伤、低氧血症、神经创伤、主动脉破裂或阿片类药物过量引起。 + 炎症 + 组织肿胀。由感染或异物引起。 + 痉挛 + 由癫痫引起的肌肉痉挛。通常由严重的异常血液酸碱度、中风、阿片类药物过量或辐射病引起。 + 癫痫发作 + 他们正在全身癫痫发作。通常由严重的异常血液酸碱度、中风、阿片类药物过量或辐射病引起。 + 渴望 + 强烈的渴望。对药物的。 + 着火! + 烧掉那些敢于关心我的人... + 胸痛 + 胸部刺痛。由肋骨骨折或输血性休克引起。 + 腹痛 + 腹部疼痛。由输血性休克引起。 + 剧痛 + 非常剧烈的疼痛。通常由脱臼或骨折引起。 + 恶心 + 恶心感。通常由肾损伤、脑震荡、戒毒或输血性休克引起。 + + 创伤性休克 + 通常发生在不安全的手术条件下,导致潜在致命的低血压。为了安全手术,患者必须接受镇痛并靠近任何床,或处于昏迷状态。 + 手术切口 + 由手术刀切开的切口。非常痛苦。它也会引起出血,可以通过止血钳防止。 + 夹住的出血 + 手术出血已经止住。这并不能防止切口的疼痛。 + 皮肤牵开 + 皮肤被牵开器拉开。难以形容的难受,只能在床边或昏迷时安全进行。 + 缝合切口 + 切口已通过缝合关闭。 + 钻孔骨头 + 骨头已经锯开,允许安装骨内固定装置。 + 锯骨 + 骨头已外科锯开,以移除肢体或准备安装另一个。 + 心脏移除 + 心脏已外科移除。心脏用于泵送氧合血液。心脏损伤通常由低氧血症、心脏病发作或枪伤引起。 + 大脑移除 + 大脑已外科移除。大脑用于意识。神经创伤通常由低氧血症或中风引起。 + 肺移除 + 肺已外科移除。肺用于氧合血液。肺损伤通常由低氧血症、枪伤或重度吸烟引起。 + 肾移除 + 肾已外科移除。肾用于调节酸碱度、骨矿物质和平衡血压,但一个人可以仅用一个肾生存。肾损伤通常由低氧血症或枪伤引起。 + 肝移除 + 肝已外科移除。肝用于凝血和调节血压。肝损伤通常由低氧血症、枪伤或重度饮酒引起。 + 夹住动脉 + 动脉出血已止住,但血液流向肢体严重减少,如果长时间夹住会导致坏疽。 + 扩张的主动脉 + 主动脉已停止出血,但血流到肢体已经消失,如果长时间夹住会导致坏疽。 + 截肢 + 右臂已外科截肢。此手术不会破裂动脉。 + 截肢 + 左臂已外科截肢。此手术不会破裂动脉。 + 截肢 + 右腿已外科截肢。此手术不会破裂动脉。 + 截肢 + 左腿已外科截肢。此手术不会破裂动脉。 + 截肢 + 头部已外科截肢。此手术不会破裂动脉...但会立即导致死亡。 + + 夹板 + 骨折已被夹板固定。 + 包扎 + 防止感染,稳定脱臼和骨折,促进伤口愈合。它略微限制了活动。 + 脏绷带 + 已过度使用的绷带,应该移除或更换,因为它会促进感染。 + 石膏绷带 + 完全稳定骨折,使其愈合。它显著限制了活动。 + 药膏 + 一层抗生素凝胶保护并清洁伤口,防止任何细菌。 + + 胸部带有空气阀的针防止气胸恶化。 + 骨生长刺激 + 骨再生已被刺激。要治愈骨死亡,此病变需要出现在每个身体部位。 + 镇痛 + 无痛感抑制某些症状,使手术成为可能,并使人能更长时间战斗。 + 麻醉 + 药物已诱导控制性无意识。可以安全地对这个人进行手术。 + 缝合伤口 + 伤口已缝合关闭。缝合伤口将比开放性伤口愈合得更快,并且不易感染。 + + Lua失效 + Lua没有运行。这意味着神经创伤和任何其他使用它的模组将不起作用。请阅读您使用的模组的工作坊页面。 + 模组冲突 + 存在模组冲突。另一个模组正在覆盖一些与神经创伤相同的物品。一些东西可能无法正常工作。请调整您的加载顺序,或者如果这是预期的,请在神经创伤配置中禁用模组冲突检查。 + + + 死于瘫痪 + 你死于瘫痪。 + 坏死 + + 死于坏死伤口。 + 你死于坏死。 + 主动脉破裂 + 免疫力 + + 感染伤口 + + 败血症 + + 肾上腺素 + + 抗凝药 + + 硫胺素 + + 降压药 + + 生理盐水 + + 林格氏液 + + 甘露醇 + + 抗生素 + + 免疫抑制剂 + + 输血性休克 + + 异物 + + 心包填塞 + + 内出血 + + 心脏病发作 + + 心脏损伤 + + 心力衰竭 + + 神经创伤 + + 死于神经创伤 + 你死于神经创伤。 + 中风 + + 癫痫发作 + + 昏迷 + + 血压 + + 低氧血症 + + 碱中毒 + + 酸中毒 + + 辐射诱导肺损伤 + + 气胸 + + 肺损伤 + + 肺衰竭 + + 肾损伤 + + 肾衰竭 + + 骨损伤 + + 骨坏死 + + 肝损伤 + + 肝衰竭 + + 活着 + 清醒 + 病人名字 + 生命值 + 心率 + 呼吸率 + 血压 + 血氧 + 神经创伤 + 器官损伤 + 手术中 + 死亡原因 + 血液pH值 + 手术室 + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Simplified Chinese/Items.xml b/NT Informative Descriptions/Localization/Simplified Chinese/Items.xml new file mode 100644 index 0000000..7512afb --- /dev/null +++ b/NT Informative Descriptions/Localization/Simplified Chinese/Items.xml @@ -0,0 +1,248 @@ + + + + + + + 健康扫描仪 + 一种使用电池电力显示疾病的工具。它可以对准一个人进行全身扫描,或者在健康UI中显示特定身体部位的疾病。使用扫描仪会导致轻微的‖color:gui.red‖辐射病‖end‖。无法显示血型、败血症、免疫力、异常酸性或药物,因为需要‖color:gui.blue‖血液分析仪‖end‖。 + 使机械维修成为可能。它也用于修复‖color:gui.green‖脱臼‖end‖,如果患者没有感觉到疼痛,修复脱臼的难度会减半。然而,修复脱臼失败将导致‖color:gui.red‖骨折‖end‖。 + + 允许有限进入潜艇的区域。可以插入一张‖color:gui.blue‖打印的捐赠卡‖end‖。 + 可以插入一张‖color:gui.blue‖打印的捐赠卡‖end‖。 + + 从欧罗巴生物体中提取的血液。与人类血液‖color:gui.red‖不兼容‖end‖。 + 一种用于增加‖color:gui.green‖血压‖end‖的氯化钠输液,并且还增加‖color:gui.green‖血液酸度‖end‖。 + 用于治疗‖color:gui.green‖出血‖end‖的基本绷带,促进‖color:gui.green‖轻微烧伤‖end‖和‖color:gui.green‖伤口‖end‖的愈合。此外,绷带还能稳定‖color:gui.green‖骨折‖end‖,防止其造成内部损伤。 + 具有止血特性的合成皮肤,能够有效封闭‖color:gui.green‖出血‖end‖,并且是治疗‖color:gui.green‖轻微烧伤‖end‖的好方法,同时促进‖color:gui.green‖伤口‖end‖的愈合。此外,合成皮肤还能稳定‖color:gui.green‖骨折‖end‖,防止其造成损伤。 + 从水生罂粟中获得的相对温和的鸦片类‖color:gui.green‖镇痛药‖end‖。最常用于制造吗啡和芬太尼。失败时效果较差,且有更高的‖color:gui.red‖成瘾‖end‖和‖color:gui.red‖过量‖end‖风险。 + 一种强效鸦片类‖color:gui.green‖镇痛药‖end‖,但过度使用会导致‖color:gui.red‖成瘾‖end‖和‖color:gui.red‖过量‖end‖。失败时效果较差,且有更高的‖color:gui.red‖成瘾‖end‖和‖color:gui.red‖过量‖end‖风险。 + 一种非常强效的鸦片类‖color:gui.green‖镇痛药‖end‖,但过度使用会导致‖color:gui.red‖成瘾‖end‖和‖color:gui.red‖过量‖end‖。镇痛不仅能防止‖color:gui.green‖疼痛‖end‖,还会‖color:gui.green‖增强组织‖end‖抵抗损伤。失败时效果较差,且有更高的‖color:gui.red‖成瘾‖end‖和‖color:gui.red‖过量‖end‖风险。 + 一种用于治疗鸦片类‖color:gui.green‖戒断症状‖end‖和‖color:gui.green‖过量‖end‖的拮抗剂。此外,它会减少鸦片类药物的‖color:gui.green‖镇痛‖end‖效果。失败时效果较差。 + 一种针对广泛致病细菌的抗生素,使其成为治疗‖color:gui.green‖败血症‖end‖和‖color:gui.green‖壳感染‖end‖的有效手段。然而,它的特异性较低,导致‖color:gui.red‖器官损伤‖end‖。用作多种医疗化合物的成分。失败时效果较差。 + 一种天然存在的激素。它会在短时间内引起各种刺激性效果,包括提高患者的‖color:gui.green‖血压‖end‖,减少‖color:gui.green‖昏迷敏感性‖end‖,增强‖color:gui.green‖快肌纤维‖end‖,并在压力下改善‖color:gui.green‖心脏功能‖end‖。此外,它会启动‖color:gui.green‖停止的心脏‖end‖并防止‖color:gui.green‖疼痛‖end‖。用作多种医疗化合物的成分。 + 在海浪汹涌时用来安抚神经。对肺部有害。 + 潜艇生活对精神压力很大,但也许这支精心制作的雪茄可以帮助你舒缓神经。对肺部有害。 + 一支‖color:gui.red‖不稳定的‖end‖氧化剂注射器,可以注射,强制‖color:gui.green‖给血液供氧‖end‖一段时间。然而,它的毒性会导致轻微的‖color:gui.red‖器官损伤‖end‖。失败时,供氧‖color:gui.red‖瞬间‖end‖,‖color:gui.red‖器官受到进一步损伤‖end‖。低氧血症会损伤大脑和器官,是战斗伤害导致死亡的主要原因。 + 一种刺激剂,可增加‖color:gui.green‖肌肉耐力‖end‖,并可用于治疗‖color:gui.green‖内部损伤‖end‖、‖color:gui.green‖缺氧‖end‖和‖color:gui.green‖失血‖end‖。失败时效果较差。 + 具有止血特性的抗生素胶水。几乎立即封闭‖color:gui.green‖出血‖end‖伤口,并防止其‖color:gui.green‖感染‖end‖。对‖color:gui.green‖烧伤‖end‖也有效。谨慎使用,因为它可能会导致血流中形成‖color:gui.red‖移动血栓‖end‖。 + 一种强效的神经系统兴奋剂,暂时增强用户的‖color:gui.green‖肌肉速度‖end‖。然而,它‖color:gui.red‖上瘾‖end‖,会轻微损伤‖color:gui.red‖器官‖end‖,并导致一些‖color:gui.red‖脑损伤‖end‖。失败时效果较差,更‖color:gui.red‖容易上瘾‖end‖,并会导致更多的‖color:gui.red‖损伤‖end‖。 + 暂时增强‖color:gui.green‖肌肉力量‖end‖和‖color:gui.green‖耐力‖end‖。具有成瘾性。失败时效果较差,更容易上瘾。 + 一种极强效的肌肉兴奋剂,适用于需要快速行动的时刻。增强‖color:gui.green‖肌肉力量‖end‖、‖color:gui.green‖耐力‖end‖和‖color:gui.green‖速度‖end‖,减少‖color:gui.green‖昏迷敏感性‖end‖。具有‖color:gui.red‖成瘾性‖end‖并导致少量的‖color:gui.red‖脑损伤‖end‖。失败时成瘾性更高,导致更多的脑损伤。 + 一种强效的‖color:gui.green‖抗精神病药‖end‖。 + 一种治疗‖color:gui.green‖麻痹‖end‖并提前结束‖color:gui.green‖全身麻醉‖end‖的药物。过度使用可能导致‖color:gui.red‖精神病‖end‖。 + 一种医疗溶液,轻度有效治疗‖color:gui.green‖内部损伤‖end‖,但更常用于‖color:gui.green‖延长血液和增强性能的药物‖end‖的持续时间。 + 一种极不稳定的液体,受到热或物理冲击时可能爆炸。给患者使用时会引起血管扩张和降低‖color:gui.green‖血压‖end‖。 + 浓缩的石榴汁。具有轻微的‖color:gui.green‖伤口愈合‖end‖特性,包括‖color:gui.green‖缝合伤口‖end‖。 + 一种高效刺激剂,使用户快速恢复‖color:gui.green‖损伤‖end‖、‖color:gui.green‖烧伤‖end‖和‖color:gui.green‖失血‖end‖。此外,用户会迅速凝结‖color:gui.green‖外部‖end‖和‖color:gui.green‖内部出血‖end‖。具有‖color:gui.red‖成瘾性‖end‖。失败时更容易上瘾。 + 用于制造各种药物的医用酒精。值班时不建议饮酒,酗酒对肺部有害。 + 由猛禽祸害或石榴汁制成的优质烈酒。一些纯粹主义者坚持认为真正的朗姆酒是用甘蔗制成的,但在欧罗巴找到甘蔗是不太可能的。其效力足以损伤早期的‖color:gui.green‖壳感染‖end‖,但酗酒对肺部有害。 + 刺、戳、切和砍。也可以用来移除旧的‖color:gui.green‖绷带‖end‖。失败时会导致‖color:gui.red‖割伤‖end‖和‖color:gui.red‖出血‖end‖。 + + 手动除颤器 + 一种使用电池电力治疗‖color:gui.green‖心脏骤停‖end‖或重置‖color:gui.green‖心房颤动‖end‖的工具。如果医疗技能低于80,请改用‖color:gui.blue‖自动体外除颤器‖end‖。失败时会导致‖color:gui.red‖心脏骤停‖end‖。 + 自动体外除颤器 + 自动体外除颤器使用电池电力治疗‖color:gui.green‖心脏骤停‖end‖。如果医疗技能高于80,请改用‖color:gui.blue‖手动除颤器‖end‖。 + 人工呼吸器 + 提供氧气瓶时,人工呼吸器将治疗‖color:gui.green‖缺氧‖end‖,并在提供氧化剂瓶时治疗‖color:gui.green‖呼吸骤停‖end‖。 + 自动心肺复苏机 + 一台占据患者外衣槽的机器。随着时间的推移,治疗‖color:gui.green‖心脏骤停‖end‖和‖color:gui.green‖心房颤动‖end‖,并防止‖color:gui.green‖呼吸骤停‖end‖的负面影响。佩戴自动心肺复苏机会随着时间的推移增加‖color:gui.green‖血压‖end‖,在紧急情况下可能有用。记得在不再需要时将其摘下! + 血液分析仪 + 一种显示患者血型和免疫力的工具。此外,还显示患者是否有失血、败血症、异常酸性或血液中有药物。如果插入一张‖color:gui.blue‖空白捐赠卡‖end‖,它会将患者的血型打印到他们的身份证上。每次使用分析仪都需要少量的‖color:gui.red‖血液‖end‖。 + 空白捐赠卡 + 一种由‖color:gui.blue‖血液分析仪‖end‖用于印刷患者血型的空白捐赠卡。 + 创伤剪 + 一种用于移除‖color:gui.green‖绷带‖end‖或‖color:gui.green‖石膏的工具‖end‖。失败时会导致‖color:gui.red‖出血‖end‖和‖color:gui.red‖割伤‖end‖。 + 轮椅 + 一种占据患者外衣槽的工具。允许利用手臂移动,使受伤的腿更容易行走。 + 蓝鲨 + 一个可爱的玩偶,每次给患者使用时都会轻微减少‖color:gui.green‖精神病‖end‖。 + 尸体袋 + 一个占据患者或尸体外衣槽的袋子。允许他们以‖color:gui.green‖全速拖动‖end‖,但活人无法通过袋子呼吸,导致‖color:gui.red‖缺氧‖end‖。 + 停滞袋 + 一个占据患者外衣槽的袋子。这将导致‖color:gui.red‖心脏骤停‖end‖、‖color:gui.red‖呼吸骤停‖end‖、‖color:gui.red‖昏迷‖end‖和‖color:gui.red‖防止手术操作‖end‖,但会在佩戴时‖color:gui.green‖暂停负面疾病的进展‖end‖。袋子每四秒钟磨损1%。 + 你将会‖color:gui.green‖昏迷‖end‖。你确定要装备停滞袋吗? + + 手术刀 + 一种在手术中用于‖color:gui.green‖切口‖end‖的工具。切口是所有手术操作的第一步,但除非使用‖color:gui.blue‖止血钳‖end‖,否则会导致‖color:gui.red‖失血‖end‖。此外,只有在患者没有感觉到疼痛时才能进行切口,手术期间意识到疼痛的患者会产生‖color:gui.red‖创伤性休克‖end‖。失败时会导致‖color:gui.red‖出血‖end‖和‖color:gui.red‖割伤‖end‖。 + 止血钳 + 一种在手术中用于‖color:gui.green‖夹闭血管‖end‖的工具。大多数手术操作的第二步,在‖color:gui.blue‖手术刀切口‖end‖之后进行。 + 皮肤牵开器 + 一种在手术中用于‖color:gui.green‖牵开皮肤‖end‖的工具。皮肤牵开是大多数手术操作的第三步,但如果患者在意识清醒且不靠近床或‖color:gui.blue‖手术台‖end‖的情况下进行,将会导致‖color:gui.red‖创伤性休克‖end‖。在‖color:gui.blue‖止血钳夹闭‖end‖之后使用。失败时会导致‖color:gui.red‖内部损伤‖end‖。 + 镊子 + 一种允许去除不需要组织的小工具。在‖color:gui.blue‖皮肤牵开‖end‖之后,镊子可以用来去除一些‖color:gui.green‖异物‖end‖或将‖color:gui.green‖钝力创伤‖end‖和‖color:gui.green‖内部损伤‖end‖转化为‖color:gui.blue‖可缝合‖end‖的‖color:gui.blue‖割伤‖end‖。‖color:gui.green‖异物‖end‖也可以通过开放性枪伤或深层组织伤口去除,但这会导致轻微的‖color:gui.red‖创伤性休克‖end‖。失败时会导致‖color:gui.red‖内部损伤‖end‖。 + 手术锯 + 一种用于‖color:gui.green‖锯骨‖end‖的工具。在‖color:gui.blue‖皮肤牵开‖end‖之后,可以锯骨以移除现有的肢体或添加新的肢体。如果坏疽超过15%,需要更换肢体。失败时会导致‖color:gui.red‖出血‖end‖、‖color:gui.red‖内部损伤‖end‖和‖color:gui.red‖割伤‖end‖。 + 缝合 + 用于完成手术的可生物降解缝线。使用时,在任何步骤结束手术操作。此外,它们还可以用来‖color:gui.red‖缝合‖end‖‖color:gui.green‖开放性伤口‖end‖,并减少大量的外部‖color:gui.green‖出血‖end‖。失败时会导致‖color:gui.red‖内部损伤‖end‖。 + 手术钻 + 一种在手术中用于‖color:gui.green‖钻骨‖end‖的工具。在‖color:gui.blue‖皮肤牵开‖end‖之后,可以钻骨进行‖color:gui.blue‖骨折固定术‖end‖和修复骨折。失败时会导致‖color:gui.red‖出血‖end‖和‖color:gui.red‖内部损伤‖end‖。 + 骨折固定植入物 + 用于修复骨折的钛植入物。可以在‖color:gui.blue‖钻骨‖end‖之后安装。如果发生骨死亡,必须在所有身体部位进行骨折固定术。失败时会导致‖color:gui.red‖出血‖end‖和‖color:gui.red‖内部损伤‖end‖。 + 脊柱植入物 + 用于修复脊柱损伤的钛植入物。可以在‖color:gui.blue‖皮肤牵开‖end‖之后安装。然而,如果颈部骨折未用‖color:gui.blue‖骨折固定术‖end‖修复,脊柱将再次受伤。 + 血管内球囊 + 插入破裂的主动脉中的球囊。这将防止破裂引起的‖color:gui.green‖失血‖end‖,但堵塞会随着时间的推移导致‖color:gui.red‖坏疽‖end‖。可以在‖color:gui.blue‖手术刀切口‖end‖之后安装。 + 医疗支架 + 可以插入主动脉以修复破裂的支架。必须在‖color:gui.blue‖血管内球囊‖end‖之后使用。 + 引流 + 通过排出胸膜腔中的空气治疗‖color:gui.green‖气胸‖end‖。可以在‖color:gui.blue‖皮肤牵开‖end‖之后使用。气胸是一种潜在威胁的情况,因为它阻止低氧血症的减轻。 + 手术台 + 一种便携式的医院病床,旨在安装在潜艇上。与医院病床一样,它配有‖color:gui.green‖人工通气‖end‖。此外,它还安装了可以输出人的生命体征的电极。 + 肝脏手术刀 + 用于移除肝脏的专业手术刀。可以在‖color:gui.blue‖皮肤牵开‖end‖之后在躯干上使用。 + 肾脏手术刀 + 用于移除肾脏的专业手术刀。可以在‖color:gui.blue‖皮肤牵开‖end‖之后在躯干上使用。 + 肺脏手术刀 + 用于移除肺脏的专业手术刀。可以在‖color:gui.blue‖皮肤牵开‖end‖之后在躯干上使用。 + 心脏手术刀 + 用于移除心脏的专业手术刀。可以在‖color:gui.blue‖皮肤牵开‖end‖之后在躯干上使用。 + 大脑手术刀 + 用于移除大脑的专业手术刀。可以在‖color:gui.blue‖皮肤牵开‖end‖之后在头部使用。 + 多功能手术刀 + 一种可以用于切口、器官提取、移除绷带/石膏或不当处理的手术刀。装备在手中以更改模式。 + 模式:手术切口。装备在手中以更改模式。 + 模式:提取肾脏 + 模式:提取肝脏 + 模式:提取肺脏 + 模式:提取心脏 + 模式:提取大脑 + 模式:移除绷带、石膏和不当处理。装备在手中以更改模式。 + 模式:自适应器官提取。用于头部提取大脑,左臂提取肾脏,躯干提取肝脏,右臂提取心脏,左腿提取肺脏。装备在手中以更改模式。 + 切口 + 肾脏 + 肝脏 + 肺脏 + 心脏 + 大脑 + 绷带、石膏、不当处理 + 自适应器官提取 + + 空血包 + 用于抽血的空血包。抽取的血液会保留捐赠者的少量‖color:gui.red‖异常酸性‖end‖或‖color:gui.red‖败血症‖end‖,如果他们有的话。只要患者健康,从患者身上抽取一个血包是安全的。失败时,会抽取‖color:gui.red‖可能致命的‖end‖血量。 + O+血包 + 可以输给:O+、A+、B+、AB+ + O-血包 + 可以输给:任何血型 + A+血包 + 可以输给:A+、AB+ + B+血包 + 可以输给:B+、AB+ + AB+血包 + 可以输给:AB+ + A-血包 + 可以输给:A-、A+、AB-、AB+ + B-血包 + 可以输给:B-、B+、AB-、AB+ + AB-血包 + 可以输给:AB-、AB+ + + O-血包 + 可以输给:任何血型 + + O-捐赠卡 + 可以从:O-抽血 + 可以给:所有人输血 + O+捐赠卡 + 可以从:O-、O+抽血 + 可以给:O+、A+、B+、AB+输血 + A-捐赠卡 + 可以从:O-、A-抽血 + 可以给:A-、A+、AB-、AB+输血 + A+捐赠卡 + 可以从:O-、O+、A-、A+抽血 + 可以给:A+、AB+输血 + B-捐赠卡 + 可以从:O-、B-抽血 + 可以给:B-、B+、AB-、AB+输血 + B+捐赠卡 + 可以从:O-、O+、B-、B+抽血 + 可以给:B+、AB+输血 + AB-捐赠卡 + 可以从:O-、A-、B-、AB-抽血 + 可以给:AB-、AB+输血 + AB+捐赠卡 + 可以从:所有人抽血 + 可以给:AB+输血 + + 医疗箱 + 可以存储药物和医疗器械。 + 手术工具箱 + 可以存储许多手术过程中使用的小物品。 + 冷藏容器 + 用于存储宝贵的移植准备好的器官和肢体的容器。器官在外面会快速腐烂,而肢体腐烂速度较慢。器官和肢体在冷藏时会再生,但仅当器官的状况超过90%或肢体的状况超过95%时才会再生。 + 冷藏板条箱 + 用于存储宝贵的移植准备好的器官和肢体的板条箱。器官在外面会快速腐烂,而肢体腐烂速度较慢。器官和肢体在冷藏时会再生,但仅当器官的状况超过90%或肢体的状况超过95%时才会再生。 + 医疗启动板条箱 + 一旦获得,该板条箱将生成急救和手术必需品。 + + 右臂 + 一只断裂的右臂。可以在‖color:gui.blue‖锯骨‖end‖之后外科重新接上。如果放在外面,肢体会慢慢腐烂直到毁坏,但肢体的状况对移植没有影响。骨头富含‖color:gui.green‖钙‖end‖。 + 左臂 + 一只断裂的左臂。可以在‖color:gui.blue‖锯骨‖end‖之后外科重新接上。如果放在外面,肢体会慢慢腐烂直到毁坏,但肢体的状况对移植没有影响。骨头富含‖color:gui.green‖钙‖end‖。 + 右腿 + 一只断裂的右腿。可以在‖color:gui.blue‖锯骨‖end‖之后外科重新接上。如果放在外面,肢体会慢慢腐烂直到毁坏,但肢体的状况对移植没有影响。骨头富含‖color:gui.green‖钙‖end‖。 + 左腿 + 一只断裂的左腿。可以在‖color:gui.blue‖锯骨‖end‖之后外科重新接上。如果放在外面,肢体会慢慢腐烂直到毁坏,但肢体的状况对移植没有影响。骨头富含‖color:gui.green‖钙‖end‖。 + 右臂仿生 + 一个仿生右臂。可以用于治疗截肢,转化为生物右臂。可以在‖color:gui.blue‖锯骨‖end‖之后接上。 + 左臂仿生 + 一个仿生左臂。可以用于治疗截肢,转化为生物左臂。可以在‖color:gui.blue‖锯骨‖end‖之后接上。 + 右腿仿生 + 一个仿生右腿。可以用于治疗截肢,转化为生物右腿。可以在‖color:gui.blue‖锯骨‖end‖之后接上。 + 左腿仿生 + 一个仿生左腿。可以用于治疗截肢,转化为生物左腿。可以在‖color:gui.blue‖锯骨‖end‖之后接上。 + 肝脏 + 一个人类肝脏。肝脏损伤会削弱身体自然愈合‖color:gui.red‖出血‖end‖的能力,还会导致一些‖color:gui.red‖神经创伤‖end‖,增加‖color:gui.red‖血压‖end‖,并在完全衰竭时引起持续的‖color:gui.red‖内部出血‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官在外面会快速腐烂。 + 肝脏移植 + 一个人类肝脏。肝脏损伤会削弱身体自然愈合‖color:gui.red‖出血‖end‖的能力,还会导致一些‖color:gui.red‖神经创伤‖end‖,增加‖color:gui.red‖血压‖end‖,并在完全衰竭时引起持续的‖color:gui.red‖内部出血‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官在外面会快速腐烂。 + 肺脏 + 一对人类肺脏。完全肺衰竭会引起‖color:gui.red‖呼吸骤停‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 肺脏移植 + 一对人类肺脏。完全肺衰竭会引起‖color:gui.red‖呼吸骤停‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 肾脏 + 一个人类肾脏。严重的肾脏损伤会导致‖color:gui.red‖酸中毒‖end‖、一些‖color:gui.red‖神经创伤‖end‖、‖color:gui.red‖骨损伤‖end‖,并增加‖color:gui.red‖血压‖end‖。肾脏一个接一个地衰竭,一个超过50%损伤时衰竭。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 肾脏移植 + 一个人类肾脏。严重的肾脏损伤会导致‖color:gui.red‖酸中毒‖end‖、‖color:gui.red‖神经创伤‖end‖、‖color:gui.red‖骨损伤‖end‖,并增加‖color:gui.red‖血压‖end‖。肾脏一个接一个地衰竭,一个超过50%损伤时衰竭。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 心脏 + 一个人类心脏。完全心脏衰竭会引起‖color:gui.red‖心脏骤停‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 心脏移植 + 一个人类心脏。完全心脏衰竭会引起‖color:gui.red‖心脏骤停‖end‖。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。器官如果不冷藏或不在人体内,会快速腐烂。 + 大脑 + 一个人类大脑。移除大脑会迅速增加‖color:gui.red‖神经创伤‖end‖。然而,可以将一个人的大脑移植到另一个人身上,让那个人控制他们。要移植器官,必须用适当的‖color:gui.blue‖器官手术刀‖end‖移除旧器官,并放入新器官。大脑在不在人类体内时会迅速腐烂,并且非常脆弱。 + 非功能性右手 + 这只手由于右臂‖color:gui.red‖脱臼‖end‖、‖color:gui.red‖骨折‖end‖或‖color:gui.red‖完全缺失‖end‖而无法工作。 + 非功能性左手 + 这只手由于左臂‖color:gui.red‖脱臼‖end‖、‖color:gui.red‖骨折‖end‖或‖color:gui.red‖完全缺失‖end‖而无法工作。 + + 甘露醇 + 一种用于治疗大量‖color:gui.green‖神经创伤‖end‖的糖醇。然而,除非患者的血压超过70%并且血液氧合,否则无效。此外,它会导致‖color:gui.red‖心脏‖end‖和‖color:gui.red‖肾脏损伤‖end‖。失败时效果较差,并会导致更多的‖color:gui.red‖心脏‖end‖和‖color:gui.red‖肾脏损伤‖end‖。 + 链激酶 + 一种分解血栓的酶,适用于治疗‖color:gui.green‖心脏病发作‖end‖。然而,它会使‖color:gui.red‖中风‖end‖恶化。此外,它还用于治疗‖color:gui.green‖输血休克‖end‖。 + 硫唑嘌呤 + 一种免疫抑制剂,可降低患者的‖color:gui.green‖免疫力‖end‖。这有助于防止‖color:gui.green‖器官排斥‖end‖或‖color:gui.green‖输入不相容的血型‖end‖而不会触发免疫反应。然而,较低的免疫力会使患者更容易患上‖color:gui.red‖败血症‖end‖。如果患者接受了器官移植,但立即失败,则说明被免疫系统排斥了。失败时会导致‖color:gui.red‖败血症‖end‖。 + 硫胺素 + 维生素B1会稍微增强‖color:gui.green‖器官再生‖end‖。失败时效果较差。 + 硝普钠 + 一种用于降低‖color:gui.green‖血压‖end‖的药物。失败时效果较差。 + 抗生素软膏 + 一种抗菌凝胶,有助于对抗‖color:gui.green‖感染伤口‖end‖并缓解轻微‖color:gui.green‖烧伤‖end‖。失败时效果较差。 + 止血带 + 一种防止‖color:gui.green‖大动脉出血‖end‖的急救物品。然而,重要的是要让血液‖color:gui.red‖到达头部‖end‖。堵塞出血会随着时间的推移导致‖color:gui.red‖坏疽‖end‖。手术过程中将其移除。失败时会导致‖color:gui.red‖钝力创伤‖end‖ + 针头 + 一种专用针头,用于作为急救选项减压胸膜腔中的空气,以治疗‖color:gui.green‖气胸‖end‖。气胸是一种潜在威胁的情况,因为它阻止低氧血症的减轻。失败时会导致‖color:gui.red‖器官损伤‖end‖和‖color:gui.red‖出血‖end‖。 + 林格氏溶液 + 一种用于增加‖color:gui.green‖血压‖end‖的等渗溶液。 + 防腐剂 + 由‖color:gui.blue‖防腐喷雾器‖end‖使用,有效治疗‖color:gui.green‖感染伤口‖end‖。 + 防腐喷雾器 + 使用‖color:gui.blue‖防腐剂‖end‖对抗‖color:gui.green‖感染伤口‖end‖。 + 丙泊酚 + 一种全身‖color:gui.green‖麻醉药‖end‖。其效果需要一段时间才能生效,并且不会持续很长时间。麻醉的患者在手术操作中不会获得‖color:gui.green‖创伤性休克‖end‖。使用可能会伴随各种非致命的‖color:gui.red‖副作用‖end‖。 + 石膏 + 一种可以形成石膏的粉末。用于包裹‖color:gui.green‖长骨骨折‖end‖,使其愈合。在‖color:gui.blue‖包扎‖end‖肢体后使用。失败时将消耗而不形成石膏。 + + \ No newline at end of file diff --git a/NT Informative Descriptions/Localization/Simplified Chinese/SurgeryPlus.xml b/NT Informative Descriptions/Localization/Simplified Chinese/SurgeryPlus.xml new file mode 100644 index 0000000..47078c3 --- /dev/null +++ b/NT Informative Descriptions/Localization/Simplified Chinese/SurgeryPlus.xml @@ -0,0 +1,7 @@ + + + + + 一层抗生素凝胶可以保护和清洁伤口免受任何细菌的侵害。防止手术期间感染。 + + \ No newline at end of file diff --git a/NT Informative Descriptions/Lua/Autorun/init.lua b/NT Informative Descriptions/Lua/Autorun/init.lua new file mode 100644 index 0000000..a36b151 --- /dev/null +++ b/NT Informative Descriptions/Lua/Autorun/init.lua @@ -0,0 +1,54 @@ +NTID = {} +NTID.Name="Informative Descriptions" +NTID.Version = "1.14" +NTID.Path = table.pack(...)[1] +Timer.Wait(function() if NTC ~= nil and NTC.RegisterExpansion ~= nil then NTC.RegisterExpansion(NTID) end end,1) + + +--In case neurotrauma doesnt actually register NTC or NT on CLIENTs for MP, gonna bruteforce +NTworkshopIds = { + "3190189044", + "2776270649" +} + + +function IsNTEnabled() + for package in ContentPackageManager.EnabledPackages.All do + for NTworkshopId in NTworkshopIds do + if tostring(package.UgcId) == NTworkshopId then + return true + end + end + end + return false +end + + + +function EnableNTID() + if NTC ~= nil or NT ~= nil or IsNTEnabled() then + dofile(NTID.Path .. '/Lua/main.lua') + if Game.IsSubEditor then + LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.SubEditorScreen"], "UpdateEntityList") + Game.SubEditorScreen.UpdateEntityList() + end + return true + end + return false +end + + + +if CLIENT or Game.IsSingleplayer then + -- Calling UpdateEntityList in short timer crashes subeditor with too many mods + -- longer timer fallback in case NT isnt registered yet on first lua pass + if EnableNTID() then + return + end + Timer.Wait(function() + if EnableNTID() then + return + end + print("Error loading NT Informative Descriptions: it appears Neurotrauma isn't loaded!") + end,1000) +end diff --git a/NT Informative Descriptions/Lua/idcardsuffixes.lua b/NT Informative Descriptions/Lua/idcardsuffixes.lua new file mode 100644 index 0000000..1dda48e --- /dev/null +++ b/NT Informative Descriptions/Lua/idcardsuffixes.lua @@ -0,0 +1,9 @@ +-- getting this from different text files from disabled languages is exorbitantly complicated in lua due to billion different types i have to register. +-- so fuck it just manual table +local suffixes = { + English = "A ‖color:gui.blue‖printed donor card‖end‖ can be slotted into it.", + Russian = "Можно вставить ‖color:gui.blue‖карту донора‖end‖ в слот.", + ["Simplified Chinese"] = "可以插入一张‖color:gui.blue‖打印的捐赠卡‖end‖。" +} + +return suffixes diff --git a/NT Informative Descriptions/Lua/main.lua b/NT Informative Descriptions/Lua/main.lua new file mode 100644 index 0000000..04c87e5 --- /dev/null +++ b/NT Informative Descriptions/Lua/main.lua @@ -0,0 +1,322 @@ +if SERVER then return end +local modconfig = require("modconfig") +local idcardsuffixes = require("idcardsuffixes") +local TextFile = LuaUserData.CreateStatic("Barotrauma.TextFile", true) +local pkg +local FileList = {} + +LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.GameSettings"], "currentConfig") +local ClientLanguage = tostring(GameSettings.currentConfig.Language) +local prev_language = ClientLanguage + +for package in ContentPackageManager.EnabledPackages.All do + local path = string.gsub(tostring(package.Dir),"\\","/") + if path == NTID.Path then + pkg = package + break + end +end + +function EnableTextFile(file, workshopId) + local targetPackage + local targetFile + + if workshopId == nil then + targetPackage = pkg + else + for package in ContentPackageManager.AllPackages do + if tostring(package.UgcId) == workshopId then + targetPackage = package + break + end + end + end + + if targetPackage == nil then + print("Could not find package to enable with workshop id ", workshopId) + return false + end + + if File.Exists(targetPackage.Dir .. "/" .. file) == false then + print("Could not find file " .. file .. " in " .. targetPackage.name) + return false + end + targetFile = TextFile(targetPackage, ContentPath.FromRaw(targetPackage, targetPackage.Dir .. "/" .. file)) + + if targetFile == nil then + print("Could not find file " .. file .. " in " .. targetPackage.name) + return false + end + + targetFile.LoadFile() + table.insert(FileList, targetFile) + + --print("Enabled " .. targetFile.Path.Value .. " in package ", targetPackage.name) + --print(targetFile.ContentPackage.Name) + + return true +end + +function EnableTextFiles(files, language) + if not language then language = ClientLanguage end + for file in files do + file = StripModDir(file) + file = string.gsub(file, "%%Language%%", language) + if not EnableTextFile(file) then + return false + end + end + return true +end + +function DisableTextPackage(workshopId, language) + local targetPackage + local languageTrimmed = string.sub(language, 2) .. ".xml" + for package in ContentPackageManager.EnabledPackages.All do + if tostring(package.UgcId) == workshopId then + targetPackage = package + break + end + end + + if targetPackage == nil then + print("Could not find package to disable with workshop id ", workshopId) + return + end + + for file in targetPackage.Files do + if LuaUserData.IsTargetType(file, "Barotrauma.TextFile") and string.endsWith(file.Path.Value, languageTrimmed) then + file.UnloadFile() + --print("Disabled " .. file.Path.Value .. " in package ", workshopId) + break + end + end +end + +function ClientHasSupportedLanguage(supportedlanguages) + local value = false + for language in supportedlanguages do + if language == ClientLanguage then + value = true + break + end + end + return value +end + +function IsModEnabled(workshopId) + local value = false + if workshopId == nil or workshopId == "" then + return false + end + for package in ContentPackageManager.EnabledPackages.All do + if tostring(package.UgcId) == workshopId then + value = true + break + end + end + return value +end + +function IsFirstHigherPriority(a, b) + if a.loadpriority > b.loadpriority then + return true + else + return false + end +end + +function GetPackageByName(name) + for package in ContentPackageManager.EnabledPackages.All do + if package.Name == name then + return package + end + end + + return nil +end + +function GetPackageById(id) + for package in ContentPackageManager.EnabledPackages.All do + if tostring(package.UgcId) == id then + return package + end + end +end + +function LoadPatches() + table.sort(modconfig, IsFirstHigherPriority) + + for _, patch in pairs(modconfig) do + local files = {} + local modname = "" + + if patch.IgnoreTargetModState or IsModEnabled(patch.workshopId) then + for language in patch.supportedlanguages do + DisableTextPackage(patch.workshopId, language) + modname = GetPackageById(patch.workshopId).name + + if not EnableTextFiles(patch.files, language) then + print("Errors enabling NTID files") + end + end + end + end +end + +function StripModDir(filepath) + local div = string.find(filepath, "%%[/\\]" ) + if div == nil then + filepath = filepath + else + --moddir = string.sub(filepath, 1, div) + filepath = string.sub(filepath, div+2) + end + return filepath +end + +function UnloadPatches() + for file in FileList do + --print("Unloading ", file.Path.Value) + file.UnloadFile() + end + FileList = {} +end + +function ReloadModsLocalization() + for package in ContentPackageManager.EnabledPackages.All do + for _, patch in pairs(modconfig) do + if tostring(package.UgcId) == patch.workshopId then + for file in package.Files do + if LuaUserData.IsTargetType(file, "Barotrauma.TextFile") then + file.LoadFile() + --print("Reenabled " .. file.Path.Value .. " in package ", workshopId) + end + end + break + end + end + end +end + + +function AppendIdcard(instance, spawnPoint, character) + if spawnPoint ~= nil and spawnPoint.IdCardDesc ~= nil then + if string.find(spawnPoint.IdCardDesc, "%S") then + obj = instance.item + obj.Description = obj.Description .. " " .. idcardsuffixes[ClientLanguage] + end + end +end + + +function UpdateIdCards() + -- retuns empty string if unsupported localization + local idcard_suffix = idcardsuffixes[ClientLanguage] + if idcard_suffix == nil or idcard_suffix == "" then + return + end + + -- characterInfos = Game.GameSession.CrewManager.characterInfos + + -- for info in characterInfos do + -- print(info.Name) + -- end + + -- mainSubSpawnPoints = WayPoint.SelectCrewSpawnPoints(characterInfos, Submarine.MainSub) + + for item in Item.ItemList do + if item.Prefab.Identifier.Value == "idcard" then + OriginalDescription = TextManager.Get("EntityDescription." .. item.Prefab.Identifier.Value) + if item.Description ~= OriginalDescription then + item.Description = tostring(item.Description) .. " " .. idcard_suffix + end + end + end +end + + +function CleanUpIdCards() + local description + for item in Item.ItemList do + if item.Prefab.Identifier.Value == "idcard" then + OriginalDescription = TextManager.Get("EntityDescription." .. item.Prefab.Identifier.Value) + if item.Description ~= OriginalDescription then + description = tostring(item.Description) + for suffix in idcardsuffixes do + description = string.gsub(description, " " .. suffix, "") + end + item.Description = description + end + end + end + +end + +function LanguageChanged() + ClientLanguage = tostring(GameSettings.currentConfig.Language) + if ClientLanguage ~= prev_language then + prev_language = ClientLanguage + return true + end + return false +end + +function ReloadNTID() + if pkg == nil then + print("Package not found.") + return + end + + UnloadPatches() + + ClientLanguage = tostring(GameSettings.currentConfig.Language) + modconfig = {} + modconfig = dofile(NTID.Path .. "/Lua/modconfig.lua") + LoadPatches() + CleanUpIdCards() + UpdateIdCards() +end + +function ReloadIdCards() + CleanUpIdCards() + UpdateIdCards() +end + + +Hook.Add("stop", "NTIDCleanUp", function () + UnloadPatches() + ReloadModsLocalization() +end) + + +Hook.Patch("Barotrauma.GameSettings", "SaveCurrentConfig", function(instance, ptable) + if LanguageChanged() then + ReloadIdCards() + end +end, Hook.HookMethodType.After) + + +Hook.Patch("Barotrauma.Items.Components.IdCard", "Initialize", function(instance, ptable) + AppendIdcard(instance, ptable["spawnPoint"], ptable["character"]) +end, Hook.HookMethodType.After) + +-- Hook.Patch("Barotrauma.Items.Components.IdCard", "OnItemLoaded", function(instance, ptable) +-- print("id card testing 2") +-- AppendIdcard(instance) +-- end, Hook.HookMethodType.After) + + + + +Game.AddCommand("reloadNTID", "Reloads NT Informative Descriptions.", function() + ReloadNTID() + print("NTID reloaded.") +end, GetValidArguments) + + + +LoadPatches() +CleanUpIdCards() +UpdateIdCards() +--ContentPackageManager.ReloadContentPackage(pkg) diff --git a/NT Informative Descriptions/Lua/modconfig.lua b/NT Informative Descriptions/Lua/modconfig.lua new file mode 100644 index 0000000..87b481f --- /dev/null +++ b/NT Informative Descriptions/Lua/modconfig.lua @@ -0,0 +1,86 @@ +-- Config to enable language files based on enabled mods. + +local config = { + { + --Neurotrauma guns fork + supportedlanguages = {"English","Simplified Chinese","Russian"}, -- which languages patch supports for this specific mod {"English","German","Russian"} etc + IgnoreTargetModState = false, -- doesnt check for target mod being enabled. Still respects supported languages. + workshopId = "3190189044", -- id of the mod being patched and which language files we disable, "" means nothing gets disabled + loadpriority = 0, -- patches with higher priotiry would override ones with lower when enabled. works similiar to game modlist + files = { -- path to language files we want to use instead of originals, %Language% is automatically replaced with client language + "%ModDir%/Localization/%Language%/Items.xml", -- if files is empty (files = {}) then it would just disable mod language files + "%ModDir%/Localization/%Language%/Afflictions.xml" + } + }, + + { + -- Curly's Surgery Plus (not yet ready) + supportedlanguages = {"English","Simplified Chinese","Russian"}, + IgnoreTargetModState = false, + workshopId = "", + loadpriority = 1, + files = { + --"%ModDir%/Localization/%Language%/SurgeryPlus.xml" + } + }, + + { + -- Cybernetics + supportedlanguages = {"English","Russian"}, + IgnoreTargetModState = false, + workshopId = "2788543375", + loadpriority = 0, + files = {"%ModDir%/Localization/%Language%/Cybernetics.xml"} + }, + + { + -- Cybernetics Improved + supportedlanguages = {"English"}, + IgnoreTargetModState = false, + workshopId = "2963474291", + loadpriority = 0, + files = {"%ModDir%/Localization/%Language%/Cybernetics.xml"} + }, + + { + -- Cybernetics Enhanced + supportedlanguages = {"English","Russian"}, + IgnoreTargetModState = false, + workshopId = "3324062208", + loadpriority = 0, + files = {"%ModDir%/Localization/%Language%/Cybernetics.xml"} + }, + + { + --Neurotrauma experimental dev version + supportedlanguages = {"English","Simplified Chinese","Russian"}, + IgnoreTargetModState = false, + workshopId = "3439141713", + loadpriority = 0, + files = { + "%ModDir%/Localization/%Language%/Items.xml", + "%ModDir%/Localization/%Language%/Afflictions.xml" + } + }, + + { + -- Immersive Repairs NT Cybernetics + supportedlanguages = {"English"}, + IgnoreTargetModState = false, + workshopId = "3153498101", + loadpriority = 0, + files = {"%ModDir%/Localization/%Language%/ImmersiveRepairs.xml"} + } + -- Example blank, you dont need to add localization for this + -- { + -- supportedlanguages = {"English"}, + -- IgnoreTargetModState = false, + -- workshopId = "", -- if empty doesnt announce patch being enabled or check for other mods + -- loadpriority = 1, -- patches with same priority would load in random order + -- files = { + -- "%ModDir%/Localization/%Language%/dummy.xml" + -- } + -- } +} + +return config diff --git a/NT Informative Descriptions/dummy.xml b/NT Informative Descriptions/dummy.xml new file mode 100644 index 0000000..d1e4d8a --- /dev/null +++ b/NT Informative Descriptions/dummy.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/NT Informative Descriptions/filelist.xml b/NT Informative Descriptions/filelist.xml new file mode 100644 index 0000000..752c62a --- /dev/null +++ b/NT Informative Descriptions/filelist.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/NetworkTweaks/Lua/Autorun/networktweaks.lua b/NetworkTweaks/Lua/Autorun/networktweaks.lua new file mode 100644 index 0000000..8e26321 --- /dev/null +++ b/NetworkTweaks/Lua/Autorun/networktweaks.lua @@ -0,0 +1,17 @@ +if CLIENT then return end + +NetConfig.MaxHealthUpdateInterval = 0 +NetConfig.LowPrioCharacterPositionUpdateInterval = 0 +NetConfig.MaxEventPacketsPerUpdate = 8 +NetConfig.RoundStartSyncDuration = 60 +NetConfig.EventRemovalTime = 20 +NetConfig.OldReceivedEventKickTime = 30 +NetConfig.OldEventKickTime = 50 +NetConfig.SparseHullUpdateInterval = 0.5 +NetConfig.HullUpdateInterval = 0.1 + +LuaUserData.MakePropertyAccessible(Descriptors["Barotrauma.Networking.ServerSettings"], "MinimumMidRoundSyncTimeout") + +if Game.ServerSettings and Game.ServerSettings.MinimumMidRoundSyncTimeout == 10 then + Game.ServerSettings.MinimumMidRoundSyncTimeout = 100 +end \ No newline at end of file diff --git a/NetworkTweaks/filelist.xml b/NetworkTweaks/filelist.xml new file mode 100644 index 0000000..d36d3cf --- /dev/null +++ b/NetworkTweaks/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanProneCrouch.xml b/Neurotrauma/Characters/Human/Animations/HumanProneCrouch.xml new file mode 100644 index 0000000..f4bef36 --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanProneCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanProneRunProperBowthWays.xml b/Neurotrauma/Characters/Human/Animations/HumanProneRunProperBowthWays.xml new file mode 100644 index 0000000..4a8b086 --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanProneRunProperBowthWays.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanProneSwimFast.xml b/Neurotrauma/Characters/Human/Animations/HumanProneSwimFast.xml new file mode 100644 index 0000000..0362f2e --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanProneSwimFast.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanProneSwimSlow.xml b/Neurotrauma/Characters/Human/Animations/HumanProneSwimSlow.xml new file mode 100644 index 0000000..5278ec9 --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanProneSwimSlow.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanProneWalkProperBowthWays.xml b/Neurotrauma/Characters/Human/Animations/HumanProneWalkProperBowthWays.xml new file mode 100644 index 0000000..4d9aeee --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanProneWalkProperBowthWays.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanWheelchairCrouch.xml b/Neurotrauma/Characters/Human/Animations/HumanWheelchairCrouch.xml new file mode 100644 index 0000000..3accc1b --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanWheelchairCrouch.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanWheelchairRun.xml b/Neurotrauma/Characters/Human/Animations/HumanWheelchairRun.xml new file mode 100644 index 0000000..0ab1c6c --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanWheelchairRun.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Animations/HumanWheelchairWalk.xml b/Neurotrauma/Characters/Human/Animations/HumanWheelchairWalk.xml new file mode 100644 index 0000000..121ec27 --- /dev/null +++ b/Neurotrauma/Characters/Human/Animations/HumanWheelchairWalk.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Human.xml b/Neurotrauma/Characters/Human/Human.xml new file mode 100644 index 0000000..d5f5d96 --- /dev/null +++ b/Neurotrauma/Characters/Human/Human.xml @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Characters/Human/Ragdolls/HumanDefaultRagdoll.xml b/Neurotrauma/Characters/Human/Ragdolls/HumanDefaultRagdoll.xml new file mode 100644 index 0000000..c5d5be3 --- /dev/null +++ b/Neurotrauma/Characters/Human/Ragdolls/HumanDefaultRagdoll.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Credits.txt b/Neurotrauma/Credits.txt new file mode 100644 index 0000000..337ae13 --- /dev/null +++ b/Neurotrauma/Credits.txt @@ -0,0 +1,18 @@ + +Evil Factory - Lua help +Ydrec - Code contributions +Nebual - Code contributions +_[|M|]_ - Bag overlays +peelz - Bloodpack conversion code +Vetinarix - Propofol maintenance +themanyfaceddemon - meta data for barotrauma mod loader +Viktor Livingshield - Russian localization +Brian Damage - Russian localization +Kaofan - Polish localization +Krzeszny - Polish localization +rermi - French localization +JellyQoo - Korean localization +MEI - Portuguese localization +Oskar - Spanish localization +mefy - Turkish localization +profole - German localization diff --git a/Neurotrauma/Images/AfflictionIcons.png b/Neurotrauma/Images/AfflictionIcons.png new file mode 100644 index 0000000..b1aa273 --- /dev/null +++ b/Neurotrauma/Images/AfflictionIcons.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79ccad3a22051325f429aa4e6cf8a88ae69fdb5092913fd08add1dbd181aabbb +size 305841 diff --git a/Neurotrauma/Images/AfflictionIcons2.png b/Neurotrauma/Images/AfflictionIcons2.png new file mode 100644 index 0000000..cd9c938 --- /dev/null +++ b/Neurotrauma/Images/AfflictionIcons2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbd6b4af723ee421b926a5eae00d2ea395559ec1fabb0df6b7b684c84dd21f00 +size 182062 diff --git a/Neurotrauma/Images/BloodPacksAtlas.png b/Neurotrauma/Images/BloodPacksAtlas.png new file mode 100644 index 0000000..b023f4c --- /dev/null +++ b/Neurotrauma/Images/BloodPacksAtlas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9690ca654424ba2e266086591eadb88d13bf284cd4a3443040077e9c1500b28e +size 57169 diff --git a/Neurotrauma/Images/Human/Human_female.png b/Neurotrauma/Images/Human/Human_female.png new file mode 100644 index 0000000..cd6b5b1 --- /dev/null +++ b/Neurotrauma/Images/Human/Human_female.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79f2adc6782379a647a9e1380041ef4301773ae0a993aaadcec5fc25adbffc06 +size 157358 diff --git a/Neurotrauma/Images/Human/Human_female_mask.png b/Neurotrauma/Images/Human/Human_female_mask.png new file mode 100644 index 0000000..a553bc1 --- /dev/null +++ b/Neurotrauma/Images/Human/Human_female_mask.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bf1dc6f1e52c42ad03e62723b901bcea56eaa9f994e7b2c5ebe8f2fab6abec3 +size 39917 diff --git a/Neurotrauma/Images/Human/Human_male.png b/Neurotrauma/Images/Human/Human_male.png new file mode 100644 index 0000000..35a5453 --- /dev/null +++ b/Neurotrauma/Images/Human/Human_male.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99dfc88f52a3f24a2876de8a137b0c8960c11c0b24602879e4f21064b415d5c6 +size 161001 diff --git a/Neurotrauma/Images/Human/Human_male_mask.png b/Neurotrauma/Images/Human/Human_male_mask.png new file mode 100644 index 0000000..6e08fba --- /dev/null +++ b/Neurotrauma/Images/Human/Human_male_mask.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:514a7ebc577efab4c6b36ee149cd12a3e1f1dd5337ca12353bbaf30b2a28de84 +size 42892 diff --git a/Neurotrauma/Images/InGameItemIconAtlas.png b/Neurotrauma/Images/InGameItemIconAtlas.png new file mode 100644 index 0000000..3ff6b79 --- /dev/null +++ b/Neurotrauma/Images/InGameItemIconAtlas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41f2398c23058e2599f88372cb7345432591f193ac2ff3c7af1038fe6249b988 +size 552239 diff --git a/Neurotrauma/Images/InventoryItemIconAtlas.png b/Neurotrauma/Images/InventoryItemIconAtlas.png new file mode 100644 index 0000000..df5ab1d --- /dev/null +++ b/Neurotrauma/Images/InventoryItemIconAtlas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc40e185c6b41ca9d96c2fdc9a9712966a33d0e6f225f38bd3dfafa17222c0b6 +size 154385 diff --git a/Neurotrauma/Images/Lights/scanner_Light.png b/Neurotrauma/Images/Lights/scanner_Light.png new file mode 100644 index 0000000..8e13d2a --- /dev/null +++ b/Neurotrauma/Images/Lights/scanner_Light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:447132b1288e30c0663e9d20baa6e49819aae7be69f0199ac1797a6b28075870 +size 7783 diff --git a/Neurotrauma/Images/Suits/BodyBagOverlay.png b/Neurotrauma/Images/Suits/BodyBagOverlay.png new file mode 100644 index 0000000..9c02ede --- /dev/null +++ b/Neurotrauma/Images/Suits/BodyBagOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8271065e7fe748a2f15d4d3c60d380eb198698418d1082262f317c32ae319e68 +size 354338 diff --git a/Neurotrauma/Images/Suits/StasisBagOverlay.png b/Neurotrauma/Images/Suits/StasisBagOverlay.png new file mode 100644 index 0000000..8a2ddf4 --- /dev/null +++ b/Neurotrauma/Images/Suits/StasisBagOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43fdc7d38401374d72e6e8adefcb45d5239f01e06e314b075b594cb3b14c9190 +size 429380 diff --git a/Neurotrauma/Images/Suits/bag.png b/Neurotrauma/Images/Suits/bag.png new file mode 100644 index 0000000..5cf1dcd --- /dev/null +++ b/Neurotrauma/Images/Suits/bag.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37c45d3b14d54411994d69d4f869bbc3d7f3043a95490069ae7e1e0a27811620 +size 7255 diff --git a/Neurotrauma/Images/Suits/baghelmets.png b/Neurotrauma/Images/Suits/baghelmets.png new file mode 100644 index 0000000..bc69c18 --- /dev/null +++ b/Neurotrauma/Images/Suits/baghelmets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae875cc073b37c6554a02c0dcc9e4039d65d5c6b15bc07f67000b6fa1ac1685 +size 11939 diff --git a/Neurotrauma/Images/Suits/blackbag.png b/Neurotrauma/Images/Suits/blackbag.png new file mode 100644 index 0000000..4f1de03 --- /dev/null +++ b/Neurotrauma/Images/Suits/blackbag.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:942cac6040a1efa20716c0cc9afc906af9b6a3911175a8b48e52497d8691dffa +size 3852 diff --git a/Neurotrauma/Images/Suits/bodybag.png b/Neurotrauma/Images/Suits/bodybag.png new file mode 100644 index 0000000..9b6c950 --- /dev/null +++ b/Neurotrauma/Images/Suits/bodybag.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ce28e44a4139852d37b8a55f3944048bfe21d67f292b2a2b42147860c8e571e +size 64039 diff --git a/Neurotrauma/Images/Suits/bodybaghelmets.png b/Neurotrauma/Images/Suits/bodybaghelmets.png new file mode 100644 index 0000000..8d3f4ca --- /dev/null +++ b/Neurotrauma/Images/Suits/bodybaghelmets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f2261cb364f1719d3b53e937e7232a05a081ce3eff0de67f1a365942e4fbbc9 +size 8072 diff --git a/Neurotrauma/Images/Suits/emergencysuit.png b/Neurotrauma/Images/Suits/emergencysuit.png new file mode 100644 index 0000000..7deea9e --- /dev/null +++ b/Neurotrauma/Images/Suits/emergencysuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1a5f278ed7b1559f7ef2d2657135eb8ed15ea2490a0176ab7db08b0d2ae5a60 +size 90029 diff --git a/Neurotrauma/Images/Suits/emergencysuithelmets.png b/Neurotrauma/Images/Suits/emergencysuithelmets.png new file mode 100644 index 0000000..a097de4 --- /dev/null +++ b/Neurotrauma/Images/Suits/emergencysuithelmets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:644e2cc0596db99474e7fac14e61dc1bf77c581044a1673ea3934f140f01e8dc +size 19035 diff --git a/Neurotrauma/Images/Suits/redsuit.png b/Neurotrauma/Images/Suits/redsuit.png new file mode 100644 index 0000000..86a7789 --- /dev/null +++ b/Neurotrauma/Images/Suits/redsuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f6e8b7125589d78e91cc37f97f41f9e3c025994f10abb27d44af7b70a4e9a35 +size 9620 diff --git a/Neurotrauma/Images/Suits/stasisbag.png b/Neurotrauma/Images/Suits/stasisbag.png new file mode 100644 index 0000000..c9ae6c4 --- /dev/null +++ b/Neurotrauma/Images/Suits/stasisbag.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d47381437c4a99657c5034baa93cf713b4cab411e4da351b7c47a2972d2a015d +size 113292 diff --git a/Neurotrauma/Images/UI/MedUIAtlas.png b/Neurotrauma/Images/UI/MedUIAtlas.png new file mode 100644 index 0000000..c3a54c9 --- /dev/null +++ b/Neurotrauma/Images/UI/MedUIAtlas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc40c3f0abeff8f11da517b92723ed4abb3bdb9e804760fc56b32fe38d30538c +size 173877 diff --git a/Neurotrauma/Images/limbs.png b/Neurotrauma/Images/limbs.png new file mode 100644 index 0000000..20f2730 --- /dev/null +++ b/Neurotrauma/Images/limbs.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec8177cfbf82cde185e8376140bee0fd348c34df5e63a127b7a24498625a725d +size 13335 diff --git a/Neurotrauma/Localization/English/English.xml b/Neurotrauma/Localization/English/English.xml new file mode 100644 index 0000000..d9622e5 --- /dev/null +++ b/Neurotrauma/Localization/English/English.xml @@ -0,0 +1,524 @@ + + + + + Manual defibrillator + A medical device delivering an electric shock to the heart to stabilize cardiac arythmias. Requires extensive medical training. Use on a patient with cardiac arrest. + Automated external defibrillator + A medical device delivering an electric shock to the heart to stabilize cardiac arythmias. Requires little to no medical training. Use on a patient with cardiac arrest. + Ambu bag + A bag valve mask (BVM), is a hand-held device commonly used to provide positive pressure ventilation to patients who are not breathing or not breathing adequately. + AutoPulse + An automated, portable, battery-powered cardiopulmonary resuscitation device. + Hematology analyzer + Blood analyzer. Fully automated. Can print bloodtypes on blank donor cards. + Blank donor card + Empty donor card. Used by the hematology analyzer. + Trauma shears + A tool used to remove bandages and casts. + Wheelchair + Makes you depend on your arms instead of your legs for movement. + Blue Shark + + Health scanner + Used to diagnose underlying causes of symptoms. + + Equipping this will cause you to go unconscious. Are you sure? + + + Scalpel + A tool used to make incisions during surgery. + Hemostat + A tool used to clamp blood vessels during surgery. + Skin retractors + A tool used to retract skin during surgery. + Tweezers + A small tool that allows the removal of bullets as well as damaged and necrotic tissue. + Surgical saw + A tool used to saw through bones. + Suture + Biodegradeable sutures for stitching up wounds and surgical incisions alike. + Surgical drill + A tool used to drill bones. + Osteosynthesis implants + Titanium implants used in an osteosynthetic surgery to repair fractures. + Spinal cord implants + Titanium implants used to heal paralysis caused by neck fractures. + Surgery table + A surgery table which has basic artificial ventilation built in. + Organ procurement scalpel: Liver + A specialized scalpel for the removal of livers. + Organ procurement scalpel: Kidneys + A specialized scalpel for the removal of kidneys. + Organ procurement scalpel: Lungs + A specialized scalpel for the removal of the lungs. + Organ procurement scalpel: Heart + A specialized scalpel for the removal of the heart. + Organ procurement scalpel: Brain + A specialized scalpel for the removal of the brain. + Multipurpose scalpel + Novelty scalpel. Disabled and needs activation. In the practitioner’s hands, a button pad can be utilised to activate the scalpel and switch between between operations: making incisions, extracting organs, removing bandages, or doing malpractice. + Mode active: Surgery incision + Mode active: Extract kidneys + Mode active: Extract liver + Mode active: Extract lungs + Mode active: Extract heart + Mode active: Extract brain + Mode active: Remove bandages and casts / malpractice + Mode active: Adaptive organ extraction. Use on head for brain, left arm for kidneys, torso for liver, right arm for heart, left leg for lungs. + Incision + Kidneys + Liver + Lungs + Heart + Brain + Bandages, casts, malpractice + Adaptive organ extraction + + Mannitol + A type of sugar alcohol. It is used to aid recovery from neurotrauma. May cause organ damage. + Streptokinase + A thrombolytic enzyme that breaks down blood clots. It is used to cure heart attacks. Decreases blood clotting. + Azathioprine + An immunosuppressive agent for the prevention of organ rejection. + Thiamine + Otherwise known as vitamin B1, these pills will aid in organ healing. + Sodium nitroprusside + A medication used to lower blood pressure. + Antibiotic ointment + A highly antiseptic gel that promotes the recovery from burns as well as from minor infections. + Endovascular balloon + A balloon inserted into major arteries following their rupture. It will cut off bloodflow, but it will stop the bleeding. + Medical stent + A plastic tube inserted into the aorta after an endovascular ballon following aortic rupture. + Tourniquet + A device that applies pressure to a limb and thus reduces bloodflow. It is usually used in case of major bleeders on extremities. Shouldn't be used on the head. + Drainage + Drains air from the pleural cavity during corrective surgery for pneumothorax. + Needle + A needle with a decompression valve to make the air or liquid drain out of the pleural cavity or pericardium + Ringer's solution + A solution of several salts dissolved in water for the purpose of treating low blood pressure or fluid loss. Isotonic to blood. + Antiseptic + Can be used to treat infected wounds using an antiseptic spray. + Antiseptic spray + Used to apply antiseptic to infected wounds. + Propofol + A short-acting medication that results in a decreased level of consciousness and a lack of memory for events. Its uses include the starting and maintenance of general anesthesia. + Gypsum + A fine mineral powder that is used to encase fractures in extremeties in a cast. Apply a bandage first. + Gel ice pack + A reusable cooling pack filled with organic gel that never expires. Loses its effectiveness without refrigeration. + + + + Empty Blood Pack + An empty blood pack for the drawing of blood. + Blood Pack O+ + Administerable to: O+, A+, B+, AB+ + Blood Pack O- + A blood pack that can be used on any patient. + Blood Pack A+ + Administerable to: A+, AB+ + Blood Pack B+ + Administerable to: B+, AB+ + Blood Pack AB+ + Administerable to: AB+ + Blood Pack A- + Administerable to: A-, A+, AB-, AB+ + Blood Pack B- + Administerable to: B-, B+, AB-, AB+ + Blood Pack AB- + Administerable to: AB-, AB+ + + Blood Pack O- + A blood pack that can be used on any patient. + + Donor card O- + Can take blood from: O- +Can give blood to: all of them + Donor card O+ + Can take blood from: O-, O+ +Can give blood to: O+, A+, B+, AB+ + Donor card A- + Can take blood from: O-, A- +Can give blood to: A-, A+, AB-, AB+ + Donor card A+ + Can take blood from: O-, O+, A-, A+ +Can give blood to: A+, AB+ + Donor card B- + Can take blood from: O-, B- +Can give blood to: B-, B+, AB-, AB+ + Donor card B+ + Can take blood from: O-, O+, B-, B+ +Can give blood to: B+, AB+ + Donor card AB- + Can take blood from: O-, A-, B-, AB- +Can give blood to: AB-, AB+ + Donor card AB+ + Can take blood from: all of them +Can give blood to: AB+ + + Medical container + Can store medicine and medical instruments + Surgery toolbox + Can store many small items that are used during surgery + Refrigerated crate + A place to store your precious transplant-ready organs + Medical starter crate + A crate that contains all the essentials, conveniently packaged into a single crafting recipe + Refrigerated container + A place to store your precious transplant-ready organs + Body bag + Lets you drag people faster. + Stasis bag + Stops most biological processes from taking place. + + + Right arm + A severed right arm. Can be surgically reattached. + Left arm + A severed left arm. Can be surgically reattached. + Right leg + A severed right leg. Can be surgically reattached. + Left leg + A severed left leg. Can be surgically reattached. + Right arm bionic prosthesis + A bionic right arm. Can be used to treat amputation. + Left arm bionic prosthesis + A bionic left arm. Can be used to treat amputation. + Right leg bionic prosthesis + A bionic right leg. Can be used to treat amputation. + Left leg bionic prosthesis + A bionic left leg. Can be used to treat amputation. + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Brain transplant + Non-working right hand + Non-working left hand + + + + + + + + Increased heartrate + The heart is beating in an alarmingly rapid fashion. + Irregular heartbeat + The heart is beating in a fluttery, quivering fashion. + Cardiac arrest + No pulse. + Heart attack + + Heart damage + + Heart failure + + Heart removed + The heart has been surgically removed. + + Neurotrauma + + Death by neurotrauma + You have died of neurotrauma. + Stroke + + Seizure + + Coma + + Brain removed + The brain has been surgically removed. + Traumatic shock + You shouldn't be getting dug into like this! This is very wrong! + + Blood pressure + + Hypoxemia + + + Respiratory arrest + The patient is not breathing. + Hyperventilation + The patient is breathing at an alarmingly rapid rate. + Hypoventilation + The patient is breathing at an alarmingly slow rate. + Shortness of breath + The patients breathing is labored and shallow. + Alkalosis + + Acidosis + + Radiation induced lung injury + + Pneumothorax + + Lung damage + + Lung failure + + Lungs removed + The lungs have been surgically removed. + + Kidney damage + + Kidney failure + + Kidneys removed + The kidneys have been surgically removed. + + Bone damage + + Bone death + + Stimulated bone growth + Bone regrowth has been stimulated. To cure bone death, this affliction needs to be on every bodypart. + + Liver damage + + Liver failure + + Liver removed + The liver has been surgically removed. + + Surgery incision + An incision has been made by a scalpel. + Clamped bleeding + Surgical bleeders have been staunched. + Clamped arteries + Bleeding from artery has been stopped, but blood flow to the extremity is severely reduced. + Ballooned aorta + The aorta has stopped bleeding, but bloodflow to your extremities and organs is gone. + Splint + Fracture has been splinted. + Bandaged + Protects from infection, stabilizes dislocations. Movement is slightly slowed. + Dirty bandage + Used to protect from infections, but now it does the opposite. + Plaster cast + Heals and protects from fractures. Movement is slowed. Remove using trauma shears. + Ointment + A layer of antibiotic gel protects and cleans the wound from any germs. + Needle + Normalizes the pressure in the pleural cavity + Chilled + Heals bruises. Movement is slowed. + + Fractured right humerus + Your right arm is broken. + Fractured left humerus + Your left arm is broken. + Fractured right femur + Your right leg is broken. + Fractured left femur + Your left leg is broken. + Fractured ribs + One or more of your ribs are broken. + Fractured skull + Your skull is broken. + Fractured neck + Your neck is broken. + Traumatic amputation + Most of the tissue of the right arm was torn off. + Traumatic amputation + Most of the tissue of the left arm was torn off. + Traumatic amputation + Most of the tissue of the right leg was torn off. + Traumatic amputation + Most of the tissue of the left leg was torn off. + Traumatic amputation + Most of the tissue of the head was torn off. + Amputation + The right arm was surgically amputated. + Amputation + The left arm was surgically amputated. + Amputation + The right leg was surgically amputated. + Amputation + The left leg was surgically amputated. + Amputation + The head was surgically amputated. + Spinal cord injury + The patient is paralyzed and does not feel the body. + Died of paralysis + You have died of paralysis. + Dislocation + The joint isn't supposed to bend this way... + Dislocation + The joint isn't supposed to bend this way... + Dislocation + The joint isn't supposed to bend this way... + Dislocation + The joint isn't supposed to bend this way... + Femoral artery bleeding + An artery has been damaged and is causing severe bloodloss. + Femoral artery bleeding + An artery has been damaged and is causing severe bloodloss. + Brachial artery bleeding + An artery has been damaged and is causing severe bloodloss. + Brachial artery bleeding + An artery has been damaged and is causing severe bloodloss. + Aortic rupture + Carotid artery bleeding + An artery has been damaged and is causing severe bloodloss. + Stitched wound + Wounds have been sutured shut. + Immunity + + Infected wound + + Sepsis + + Necrosis + + Died from a necrotic wound. + You have died from necrosis. + Gangrene + The extremity has shrunk and turned black. + Adrenaline + + Anti-clot + + Thiamine + + Blood pressure reducers + + Saline + + Ringer's solution + + Mannitol + + Antibiotics + + Immunosuppressants + + Hemotransfusion shock + + Foreign body + + Cardiac tamponade + + Internal bleeding + + + Cough + The patient is coughing periodically. + Pale skin + The patients skin is pale. + Lightheadedness + The patient is expressing lightheadedness. + Blurred vision + The patient is expressing blurred vision. + Confusion + The patient seems disoriented and confused. + Headache + The patient is expressing a headache. + Leg swelling + The patients legs are swollen. + Weakness + The patient is expressing weakness in the extremities. + Wheezing + The patients breathing is producing a high-pitched noise. + Vomiting + The patient is vomiting periodically. + Vomiting blood + The patient is vomiting blood periodically. + Fever + The patients body temperature is elevated. + Abdominal discomfort + The patient is expressing abdominal discomfort. + Bloating + The patients abdomen is bloated. + Jaundice + The patients skin has turned a sickly shade of yellow. + Sweating + The patient is sweating excessively. + Palpitations + The patient is expressing palpitations. + Unconsciousness + The patient is unconscious. + Inflammation + The area is red, swollen and warm. + Spasm + The patient can't control the erratic behaviour of the limb. + Craving + The patient is happy enough... so long as they get what they need. + On fire! + The patient is burning alive! Grab an extinguisher! + Chest pain + The patient is expressing sharp, piercing pain in their chest. + Abdominal pain + The patient is expressing persistent pain in their abdomen. + Intense pain + The patient is expressing intense pain in the affected area. + Nausea + The skin is clammy and the patient is nauseous. + Lualess + Lua isn't running. That means neurotrauma and any other mods that use it won't work. Please read the workshop pages of mods you plan to use. + Mod conflict + There is a mod conflict. A different mod is overriding some of the same items Neurotrauma does. Some things may not function correctly. Please adjust your load order. + Analgesia + Insensitivity to pain. + Anesthesia + The patient has drug-induced amnesia and sedation. + First-degree burn + The area is red and painful to the touch. + Second-degree burn + There are very painful blisters littering the affected area. + Third-degree burn + The patient doesn't feel pain in the now leathery, stiff area. + + Surgery incision + The patient has been cut open. + Clamped bleeding + Bleeding caused by the incision has been stopped. + Retracted skin + The skin is being held open by a set of retractors. + Drilled bones + The bones have been prepared for orthopedic procedures. + Stitched incision + An incision has been closed via sutures. + Bones Sawed + The bone has been severed. + + Alive + Conscious + Patient_name + Vitality + Heartrate + Breathingrate + Bloodpressure + Bloodoxygen + Neurotrauma + Organdamage + In_surgery + Cause_of_death + Blood_pH + + Surgical + \ No newline at end of file diff --git a/Neurotrauma/Localization/French/French.xml b/Neurotrauma/Localization/French/French.xml new file mode 100644 index 0000000..82f59f4 --- /dev/null +++ b/Neurotrauma/Localization/French/French.xml @@ -0,0 +1,520 @@ + + + + + Défibrillateur manuel + Un appareil médical pouvant délivrer un choc électrique au cœur afin de stabiliser les arythmies cardiaques. Nécessite une formation médicale avancée. À utiliser sur un patient en arrêt cardiaque. + Défibrillateur automatisé + Un appareil médical pouvant délivrer un choc électrique au cœur afin de stabiliser les arythmies cardiaques. Nécessite très peu voire aucune formation médicale. À utiliser sur un patient en arrêt cardiaque. + Insufflateur manuel + Un insufflateur manuel (BAVU) est un appareil portatif couramment utilisé pour suppléer à la respiration de patients en arrêt respiratoire ou ne respirant pas correctement. + AutoPulse + Un appareil portable, alimenté par piles et automatique de réanimation cardiorespiratoire. + Analyseur d'hématologie + Analyseur de sang. Entièrement automatisé. Peut imprimer les groupes sanguins sur des cartes vierges. + Carte vierge de donneur + Carte vide immaculée. Utilisée par l'analyseur d'hématologie. + Ciseaux de secours + Un outil utilisé pour retirer les bandages et les plâtres. + Fauteuil roulant + Vous fait dépendre de vos bras au lieu de vos jambes pour vous déplacer. + Requin bleu + + Scanneur de santé + Utilisé pour identifier les causes sous-jacentes de symptômes. + + Équiper cela vous fera perdre connaissance. En êtes-vous sûr(e)? + + Scalpel + Un outil utilisé pour faire des incisions lors d'une chirurgie. + Pince hémostatique + Un outil utilisé pour clamper les vaisseaux sanguins lors d'une chirurgie. + Écarteur chirurgical + Un outil utilisé pour rétracter la peau lors d'une chirurgie. + Pincette chirurgicale + Un petit outil permettant de retirer les balles ainsi que les tissus endommagés et nécrosés. + Scie chirurgicale + Un outil utilisé pour scier à travers les os. + Suture + Sutures biodégradables pour recoudre les plaies et les incisions. + Perceuse chirurgicale + Un outil utilisé pour percer les os. + Implants d'ostéosynthèse + Des implants en titane utilisés dans une chirurgie ostéosynthétique pour réparer des fractures. + Implants de moelle épinière + Des implants en titane utilisés pour soigner la paralysie causée par des fractures du cou. + Table d'opération + Une table d'opération dotée d'une ventilation artificielle intégrée. + Scalpel de prélèvement d'organe: Foie + Un scalpel spécialisé pour la récupération de foies. + Scalpel de prélèvement d'organe: Reins + Un scalpel spécialisé pour la récupération de reins. + Scalpel de prélèvement d'organe: Poumons + Un scalpel spécialisé pour la récupération de poumons. + Scalpel de prélèvement d'organe: Cœur + Un scalpel spécialisé pour la récupération de cœurs. + Scalpel de prélèvement d'organe: Cerveau + Un scalpel spécialisé pour la récupération du cerveau. + + + Mannitol + Un type d'alcool de sucre. Aide à la guérison après un neurotraumatisme. Peut causer des dommages aux organes. + Streptokinase + Un agent thrombolytique qui décompose les caillots sanguins. Il est utilisé pour soigner les crises cardiaques. Aggrave la coagulation. + Azathioprine + Un agent immunosuppresseur évitant le rejet d'organe. + Thiamine + Autrement connue sous le nom de vitamine B1, ces pilules aideront à la guérison des organes. + Pommade antibiotique + Un gel hautement antiseptique qui favorise la guérison des brûlures ainsi que des infections mineures. + Ballon endovasculaire + Un ballon inséré dans les artères suite à leur rupture. Il coupera la circulation sanguine mais arrêtera les saignements. + Stent médical + Un tube en plastique inséré dans l'aorte après gonflement d'un ballon endovasculaire monté sur un cathéter, suite à une rupture aortique. + Garrot + Un dispositif appliquant une pression sur un membre (bras ou jambes), réduisant ainsi le flux sanguin. Il est généralement utilisé en cas de saignements importants. Ne doit pas être utilisé sur la tête. + Drain + Draine l'air de la cavité pleurale lors d'une chirurgie de pneumothorax. + Aiguille + Une aiguille avec une valve intégrée, permettant de faire échapper de l'air ou des liquides de la cavité thoracique. + Liquide Ringer + Une solution de plusieurs sels dissous dans de l'eau, utilisée dans le traitement de l'hypotension artérielle ou de la perte de liquide. Isotonique au sang. + Antiseptique + + Spray antiseptique + + Propofol + Un médicament de courte durée entraînant une diminution du niveau de conscience et un manque de mémoire. Il permet de conserver et/ou de commencer une anesthésie générale. + Gypse + Une fine poudre minérale utilisée pour recouvrir les fractures, dans un plâtre. Un bandage doit être d'abord appliqué. + + + + + Poche de sang vide + Une poche de sang vide pour le prélèvement de sang. + Poche de sang O+ + Peut être donné à: O+, A+, B+, AB+ + Poche de sang O- + Une poche de sang qui peut être utilisée sur n'importe quel patient. + Poche de sang A+ + Peut être donné à: A+, AB+ + Poche de sang B+ + Peut être donné à: B+, AB+ + Poche de sang AB+ + Peut être donné à: AB+ + Poche de sang A- + Peut être donné à: A-, A+, AB-, AB+ + Poche de sang B- + Peut être donné à: B-, B+, AB-, AB+ + Poche de sang AB- + Peut être donné à: AB-, AB+ + + Poche de sang O- + Une poche de sang qui peut être utilisée sur n'importe quel patient. + + Carte de donneur O- + Peut recevoir du sang de: O- +Peut donner du sang à: tous + Carte de donneur O+ + Peut recevoir du sang de: O-, O+ +Peut donner du sang à: O+, A+, B+, AB+ + Carte de donneur A- + Peut recevoir du sang de: O-, A- +Peut donner du sang à: A-, A+, AB-, AB+ + Carte de donneur A+ + Peut recevoir du sang de: O-, O+, A-, A+ +Peut donner du sang à: A+, AB+ + Carte de donneur B- + Peut recevoir du sang de: O-, B- +Peut donner du sang à: B-, B+, AB-, AB+ + Carte de donneur B+ + Peut recevoir du sang de: O-, O+, B-, B+ +Peut donner du sang à: B+, AB+ + Carte de donneur AB- + Peut recevoir du sang de: O-, A-, B-, AB- +Peut donner du sang à: AB-, AB+ + Carte de donneur AB+ + Peut recevoir du sang de: tous +Peut donner du sang à: AB+ + + Conteneur médical + Peut stocker des médicaments et des instruments médicaux. + Boîte à outils chirurgicaux + Peut stocker de nombreux petits objets utilisés lors d'une chirurgie. + Caisse réfrigérée + Une caisse pour entreposer vos précieux organes prêts à être greffés. + Conteneur réfrigéré + Un conteneur pour entreposer vos précieux organes prêts à être greffés. + Sac mortuaire + Permet de traîner les corps plus rapidement. + Sac stasique + Permet de stopper momentanément tout processus et phénomènes biologiques. + + Bras droit + Un bras droit sectionné. Peut être chirurgicalement rattaché. + Bras gauche + Un bras gauche sectionné. Peut être chirurgicalement rattaché. + Jambe droite + Une jambe droite sectionnée. Peut être chirurgicalement rattachée. + Jambe gauche + Une jambe gauche sectionnée. Peut être chirurgicalement rattachée. + Prothèse bionique pour bras droit + Un bras droit bionique. Peut être utilisé pour remplacer une amputation. + Prothèse bionique pour bras gauche + Un bras gauche bionique. Peut être utilisé pour remplacer une amputation. + Prothèse bionique pour jambe droite + Une jambe droite bionique. Peut être utilisé pour remplacer une amputation. + Prothèse bionique pour jambe gauche + Une jambe gauche bionique. Peut être utilisé pour remplacer une amputation. + Greffe de foie + Greffe de foie + Greffe de foie + Greffe de foie + Greffe de foie + Greffe de foie + Greffe de poumon + Greffe de poumon + Greffe de poumon + Greffe de poumon + Greffe de poumon + Greffe de poumon + Greffe de rein + Greffe de rein + Greffe de rein + Greffe de rein + Greffe de rein + Greffe de rein + Greffe de cœur + Greffe de cœur + Greffe de cœur + Greffe de cœur + Greffe de cœur + Greffe de cœur + Greffe de cerveau + Main droite non-fonctionnelle + Main gauche non-fonctionnelle + + + + + + + + Rythme cardiaque élevé + Le cœur bat à une vitesse alarmante. + Battements irréguliers + Le cœur bat de manière tremblotante. + Arrêt cardiaque + Pas de pouls. + Crise cardiaque + + Lésions cardiaques + + Insuffisance cardiaque + + Coeur retiré + Le cœur a été chirurgicalement retiré. + + Neurotraumatisme + + Mort par neurotraumatisme + Vous êtes mort(e) d'un neurotraumatisme. + Accident vasculaire cérébral + + Crise d'épilepsie + + Coma + + Cerveau retiré + Le cerveau a été chirurgicalement retiré. + + Pression artérielle + + Hypoxémie + + + Arrêt respiratoire + Le patient ne respire plus. + Hyperventilation + Le patient respire à un rythme élevé alarmant. + Hypoventilation + Le patient respire à un rythme faible alarmant. + Essoufflements + La respiration du patient est laborieuse et peu profonde. + Alcalose + + Acidose + + Lésions pulmonaires par radiation + + Pneumothorax + + Lésions pulmonaires + + Insuffisance pulmonaire + + Poumons retirés + Les poumons ont été chirurgicalement retirés. + + Lésions aux reins + + Insuffisance rénale + + Reins retirés + Les reins ont été chirurgicalement retirés. + + Lésions osseuses + + Nécrose osseuse + + Croissance osseuse stimulée + Repousse osseuse stimulée. Pour guérir de la nécrose osseuse, cette repousse doit être appliquée à toutes les parties du corps. + + Lésions au foie + + Insuffisance hépatique + + Foie retiré + Le foie a été chirurgicalement retiré. + + Incision + La zone a été fendue en deux avec un scalpel. + Saignement clampé + Les saignements ont été stoppés. + Artère clampé + Le saignement de l'artère a été arrêté, mais le flux sanguin est sévèrement réduit. + Aorte ballonnée + L'aorte a cessé de saigner, mais le flux sanguin vers les extrémités et les organes a disparu. + Attelle + La fracture a été attellé. + Bandage + Protège des infections, stabilise les dislocations. Mouvements légèrement ralentis. + Bandage sale + Utilisé pour protéger des infections, sauf qu'il fait désormais le contraire. Doit être renouvelé. + Plâtre + Guérit et protège des fractures. Mouvements ralentis. Peut être retiré à l'aide de ciseaux de secours. + Pommade + Une couche de gel antibiotique protège et nettoie la plaie de tout germe. + Aiguille + Normalise la pression dans la cavité pleurale. + + + Humérus droit fracturé + Votre bras droit est cassé. + Humérus gauche fracturé + Votre bras gauche est cassé. + Fémur droit fracturé + Votre jambe droite est cassée. + Fémur gauche fracturé + Votre jambe gauche est cassée. + Côtes fracturées + Une ou plusieurs de vos côtes sont cassées. + Crâne fracturé + Votre crâne est cassé. + Cou fracturé + Votre cou est cassé. + Amputation traumatique + La plupart des tissus du bras droit ont été arrachés. + Amputation traumatique + La plupart des tissus du bras gauche ont été arrachés. + Amputation traumatique + La plupart des tissus de la jambe droite ont été arrachés. + Amputation traumatique + La plupart des tissus de la jambe gauche ont été arrachés. + Amputation traumatique + La plupart des tissus de la tête ont été arrachés. + Amputation + Le bras droit a été chirurgicalement amputé. + Amputation + Le bras gauche a été chirurgicalement amputé. + Amputation + La jambe droite a été chirurgicalement amputée. + Amputation + La jambe gauche a été chirurgicalement amputée. + Amputation + La tête a été chirurgicalement amputée. + Lésion de la moelle épinière + Le patient est paralysé et ne sent plus son corps. + Mort de paralysie + Vous êtes mort(e) de paralysie. + Dislocation + L'articulation n'est pas censée se plier de cette façon... + Dislocation + L'articulation n'est pas censée se plier de cette façon... + Dislocation + L'articulation n'est pas censée se plier de cette façon... + Dislocation + L'articulation n'est pas censée se plier de cette façon... + Saignement de l'artère fémorale + Une artère a été endommagée et provoque une perte de sang importante. + Saignement de l'artère fémorale + Une artère a été endommagée et provoque une perte de sang importante. + Saignement de l'artère brachiale + Une artère a été endommagée et provoque une perte de sang importante. + Saignement de l'artère brachiale + Une artère a été endommagée et provoque une perte de sang importante. + Rupture aortique + Saignement de l'artère carotide + Une artère a été endommagée et provoque une perte de sang importante. + Plaie recousue + Les plaies ont été suturées. + Immunité + + Plaie infectée + + Sepsis + + Nécrose + + Mort d'une blessure nécrosée. + Vous êtes mort(e) de nécrose. + Gangrène + L'extrémité a rétréci et est devenue noire. + Adrénaline + + Anti-caillot + + Thiamine + + Solution saline + + Liquide Ringer + + Mannitol + + Antibiotiques + + Immunosuppresseurs + + Choc hémorragique + + Corps étranger + + Tamponnade cardiaque + + Hémorragie interne + + + Toux + Le patient tousse périodiquement. + Peau pâle + La peau du patient est pâle. + Étourdissement + Le patient est étourdi. + Vision floue + Le patient voit de manière floue. + Confusion + Le patient semble désorienté et confus. + Migraine + Le patient semble avoir un mal de crâne. + Jambes gonflées + Les jambes du patient sont enflées. + Faiblesse + Le patient révèle une faiblesse dans ses extrémités. + Respiration difficile + La respiration du patient produit un bruit aigu. + Vomissement + Le patient vomit périodiquement. + Vomissement de sang + Le patient vomit du sang périodiquement. + Fièvre + La température corporelle du patient est élevée. + Inconfort abdominal + Le patient exprime une certaine douleur abdominale. + Ballonnement + L'abdomen du patient est gonflé. + Jaunisse + La peau du patient a pris une teinte jaune maladive. + Transpiration + Le patient transpire énormément. + Palpitations cardiaques + Le patient ressent des palpitations intenses. + Perte de connaissance + Le patient est inconscient. + Inflammation + La zone est rouge, enflée et chaude. + Spasme + Le patient ne peut plus contrôler le comportement erratique de ses bras et jambes. + Carence + Le patient semble assez heureux... tant qu'il obtient ce dont il a besoin. + En feu! + Le patient est en train de brûler vif ! Allez prendre un extincteur ! + Douleur thoracique + Le patient ressent une douleur aiguë et perçante dans sa poitrine. + Douleur abdominale + Le patient ressent une douleur persistante dans son abdomen. + Douleur intense + Le patient ressent une douleur intense et éprouvante dans la zone touchée. + Nausées + Le patient se sent mal, a des vertiges et sa peau semble moite. + Sans Lua + Le Lua n'est pas activé. Cela signifie que Neurotrauma et tous les autres mods qui l'utilisent ne fonctionnent pas. Merci de lire les pages workshop des mods que vous voulez utiliser. + Choc traumatique + Le patient ressent une douleur émotionnelle pétrifiante et des vertiges, ainsi qu'un stress intense et étouffant. + Analgésie + Insensibilité à la douleur. + Anesthésie + Le patient est dans un état d'amnésie et de sédation. + Brûlure au premier degré + La zone brûlée est rouge et douloureuse au toucher. + Brûlure au deuxième degré + Des cloques très douloureuses jonchent la zone touchée. + Brûlure au troisième degré + Le patient ne ressent pas de douleur dans la zone touchée, devenue raide et sèche. + + Incision + La zone a été fendue en deux avec un scalpel. + Saignement clampé + Le saignement causé par l'incision a été stoppé. + Peau rétractée + La peau est maintenue ouverte par un écarteur. + Os percés + Les os ont été préparés pour une procédure orthopédique. + Incision recousue + L'incision a été recousue avec des sutures. + Os sciés + L'os a été sectionné. + + Vivant + Conscient + Nom_du_patient + Vitalité + Rythme_cardiaque + Fréquence_respiratoire + Pression_artérielle + Oxygène_sanguin + Neurotraumatisme + Lésions_aux_organes + En_chirurgie + Cause_de_décès + Blood_pH + + Chirurgie + + réducteur de pression sanguine + Nitroprussiate de sodium + Médicament vasodilateur utilisé pour diminuer la tension artérielle. + Coffret de débutant en médecine + Un coffret contenant tous les essentiels, pragmatiquement emballés dans une seule recette. + \ No newline at end of file diff --git a/Neurotrauma/Localization/German/German.xml b/Neurotrauma/Localization/German/German.xml new file mode 100644 index 0000000..d0fc0ce --- /dev/null +++ b/Neurotrauma/Localization/German/German.xml @@ -0,0 +1,462 @@ + + + + + + + Automatischer externer Defibrillator + Ein medizinisches Gerät für die Stabilisierung von Arhytmien. Benutze auf Patienten mit Herzstillstand. + Beatmungsbeutel + Eine Vorrichtung für Atmungsunterstüzung bei Patienten, welche nicht ausreichend atmen. + AutoPuls + Eine automatisierte, batteriebetriebene Herz-lungen-wiederbelebungsvorrichtung. + Hematologischer Analysator + Blutgruppenscanner. Vollautomatisch. Benötigt Blutsammelpatronen. + Blutsammelpatrone + Leere Blutsammelpatrone. Vom hematologischen Analysator verwendet. + + Vitalitätsscanner + Verwendet um die Ursachen von Symptomen zu erkennen. + + Wenn du das ausrüstest wirst du bewusstlos. Bist du sicher? + + Skalpel + Ein Werkzeug um Einschnitte während Operationen zu platzieren. + Arterienklemme + Ein Werkzeug um blutende Arterien aufgrund von Operationen abzuklemmen. + Hautretraktoren + Ein Werkzeug um Haut während einer Operation festzuhalten. + Pinzette + Ein kleines Wekzeug um Fremdkörper während Operation zu entfernen + Chirurgische Säge + Eine Säge um Knochen an- oder durchzusägen + Nadel und Faden + Biodegradierbarer Faden für die Behandlung von offenen Wunden und chirurgischen Einschnitten. + Chirurgischer Bohrer + Ein Werkzeg um Knochen anzubohren. + Osteosynthetische Implantate + Implantate aus Titanium, welche während osteosynthetischer Chirurgie verwendet werden, um gebrochene Knochen zu reparieren. + Wirbelsäulenimplantate + Implantate aus Titanium, welche verwendet werden, um von Nackenbrüchen verursachte Paralyse zu heilen. + Chirurgischer Tisch + Ein Tisch mit eingebauter künstlicher Beatmung. + Organbeschaffungsskalpel: Leber + Ein spezialisiertes Skalpel für die Entfernung der Leber. + Organbeschaffungsskalpel: Nieren + Ein spezialisiertes Skalpel für die Entfernung der Nieren. + Organbeschaffungsskalpel: Lunge + Ein spezialisiertes Skalpel für die Entfernung der Lunge. + Organbeschaffungsskalpel: Herz + Ein spezialisiertes Skalpel für die Entfernung des Herzes. + + + Mannitol + Eine Art Zuckeralkohol. Wird verwendet um bei der Heilung von Neurotrauma zu helfen. Verursacht möglicherweise Organschäden. + Desinfizierendes Gel + Ein stark antibiotisches Gel welches bei der Genesung von Verbrennungen und infizierten Wunden hilft. + Endovaskulärer Balloon + Ein Balloon der nach einer Ruptur in die Hauptaterien eingeführt wird. Es wird den Blutfluss stoppen, jedoch somit auch die Blutung. + Stent + Eine Plastikröhre die nach einem endovaskulären Ballon in die Aorta eingeführt wird. + Tourniquet + Übt Drück auf eine Gliedmaße aus und verringert den Blutfluss. Es wird bei Gliedmaßen mit zum Beispiel einem Arterienriss oder Gliedmaßenverlust verwendet. Sollte nicht auf dem Kopf benutzt werde. + Drainage + Lässt Luft aus dem Brustkorb entweichen. Wird für eine Pneumothoraxoperation verwendet. + Nadel + Eine Nadel mit einem Ventil um Luft oder Flüssigkeit aus dem Brustkorb zu entfernen. + Ringerlösung + Eine Lösung aus mehreren in Wasser gelösten Salzen um niedrigen Blutdruck und Blutverlust zu heilen. Isotonisch zu Blut. + Desinfektionsmittel + Kann mit einem Desinfektionsmittelspritzer auf infizierte Wunden aufgetragen werden um sie zu reinigen. + Desinfektionsmittelspritzer + Wird benutzt um Desinfektionsmittel auf Wunden aufzutragen. + Propofol + Ein schnell wirkendes Medikament, welches zu einem verminderten Bewusstseinszustand und Gedächtnisverlust führt. Es wird für den Start und die Instandhaltung einer Vollnarkose genutzt. + + + + + Leerer Blutbeutel + Ein leerer Beutel für die Entnahme von Blut. + Blutbeutel O+ + Kompatibel mit: O+, A+, B+, AB+ + Blutbeutel O- + Ein Blutbeutel von einem Universalspender. Kompatibel mit allen Blutgruppen. + Blutbeutel A+ + Kompatibel mit: A+, AB+ + Blutbeutel B+ + Kompatibel mit: B+, AB+ + Blutbeutel AB+ + Kompatibel mit: AB+ + Blutbeutel A- + Kompatibel mit: A-, A+, AB-, AB+ + Blutbeutel B- + Kompatibel mit: B-, B+, AB-, AB+ + Blutbeutel AB- + Kompatibel mit: AB-, AB+ + + Blutbeutel O- + Ein Blutbeutel von einem Universalspender. Kompatibel mit allen Blutgruppen. + + Spenderkarte O- + Kann erhalten von: O- +Kann spenden an: Universalspender + Spenderkarte O+ + Kann erhalten von: O-, O+ +Kann spenden an: O+, A+, B+, AB+ + Spenderkarte A- + Kann erhalten von: O-, A- +Kann spenden an: A-, A+, AB-, AB+ + Spenderkarte A+ + Kann erhalten von: O-, O+, A-, A+ +Kann spenden an: A+, AB+ + Spenderkarte B- + Kann erhalten von: O-, B- +Kann spenden an: B-, B+, AB-, AB+ + Spenderkarte B+ + Kann erhalten von: O-, O+, B-, B+ +Kann spenden an: B+, AB+ + Spenderkarte AB- + Kann erhalten von: O-, A-, B-, AB- +Kann spenden an: AB-, AB+ + Spenderkarte AB+ + Kann erhalten von: Jeder +Kann spenden an: AB+ + + Medizinkoffer + Kann Medikamente und medizinische Geräte lagern. + Tiefkühlkoffer + Wird genutzt um Organe zu lagern und am Leben zu halten. + Tiefkühlkiste + Wird genutzt um Organge zu lagern und am Leben zu halten. + Leichensack + Lässt dich "Leute" schneller transportieren. Luft nicht inklusive. + Stasebeutel + Hält die meisten biolgischen Prozesse an. + + Rechter Arm + Ein abgetrennter, rechter Arm. Kann operativ wieder angenäht werden. + Linker Arm + Ein abgetrennter, linker Arm. Kann operativ wieder angenäht werden. + Rechtes Bein + Ein abgetrenntes, rechtes Bein. Kann operativ wieder angenäht werden. + Linkes Bein + Ein abgetrenntes, linkes Bein. Kann operativ wieder angenäht werden. + Bionische Prothese (rechter Arm) + Ein bionischer, rechter Arm. Kann operativ angenäht werden. + Bionische Prothese (linker Arm) + Ein bionischer, linker Arm. Kann operativ angenäht werden. + Bionische Prothese (rechtes Bein) + Ein bionisches, rechtes Bein. Kann operativ angenäht werden. + Bionische Prothese (linkes Bein) + Ein bionisches, linkes Bein. Can Kann operativ angenäht werden. + Entnommene Leber + Entnommene Leber + Entnommene Leber + Entnommene Leber + Entnommene Leber + Entnommene Leber + Entnommene Lunge + Entnommene Lunge + Entnommene Lunge + Entnommene Lunge + Entnommene Lunge + Entnommene Lunge + Entnommene Niere + Entnommene Niere + Entnommene Niere + Entnommene Niere + Entnommene Niere + Entnommene Niere + Entnommenes Herz + Entnommenes Herz + Entnommenes Herz + Entnommenes Herz + Entnommenes Herz + Entnommenes Herz + Funktionsunfähige rechte Hand + Funktionsunfähige linke Hand + + + + + + + + Erhöhte Herzfrequenz + Das Herz schlägt alamierend schnell. + Herzstillstand + Kein Puls. + Herzinfarkt + + Herzschaden + + Herzversagen + + Herz entfernt + Das Herz wurde operative entnommen. + + Neurotrauma + + Tod durch Neurotrauma + Du bist an Neurotrauma verstorben. + Schlaganfall + + Krampfanfall + + Koma + + + Blutdruck + + Hypoxie + + + Atemstillstand + Der Patient atmet nicht. + Hyperventilation + Der Patient atmet alarmierend schnell. + Hypoventilation + Der Patient atmet alarmierend langsam. + Kurzatmigkeit + Dem Patienten fällt das Atmen schwer. + Alkalose + + Azidose + + Strahlungsbedingte Lungenverletzung + + Pneumothorax + + Lungenschaden + + Lungenversagen + + Lungen entfernt + Die Lungen wurden operativ entnommen. + + Nierenschaden + + Nierenversagen + + Nieren entfernt + Die Nieren wurden operative entfernt. + + Knochenschaden + + Knochentod + + Stimuliertes Knochenwachstum + Das Knochenwachstum wurde stimuliert. Um Knochentod zu heilen, muss diese affliction auf jedem Körperteil präsent sein. + + Leberschaden + + Leberversagen + + Liver removed + Die Leber wurde operative entfernt. + + Operative Inzision + Ein Skalpelschnitt. + Abgeklemmte Blutungen + Blutungen die durch den Eingriff entstanden sind wurden gehemmt. + Abgeklemmte Arterien + Die Arterienblutung hat aufgehört, aber der Blutfluss in die Gliedmaße ist stark vermindert. + Stabilisierte Aorta + Die Aorta blutet nicht mehr, jedoch fließt auch kein Blut mehr in die Gliedmaßen und Orange. + Schiene + Die gebrochene Stelle wurde mit einer Schiene versehen. + Bandagiert + Schützt for Infektionen und, stabilisiert Dislokationen und Brüche. + Salbe + Eine Schicht von antibiotischem Gel schützt und reinigt die Wunde. + Nadel + Normalisiert den Druck im Brustkorb. + + + Gebrochener, rechter Humerus + Der rechte Arm ist gebrochen. + Gebrochener, linker Humerus + Der linke Arm ist gebrochen. + Gebrochener, rechter Oberschenkelknochen + Das rechte Bein ist gebrochen. + Gebrochener, linker Oberschenkelknochen + Das linke Bein ist gebrochen. + Gebrochene Rippen + Eine oder mehrere Ripppen sind gebrochen. + Schädelbruch + Der Schädel ist gebrochen. + Genickbruch + Das Genick ist gebrochen. + Traumatische Amputation + Ein großer Teil des rechten Armes fehlt. + Traumatische Amputation + Ein großer Teil des linken Armes fehlt. + Traumatische Amputation + Ein großer Teil des rechten Beines fehlt. + Traumatische Amputation + Ein großer Teil des linken Beines fehlt. + Traumatische Amputation + Ein großer Teil des Kopfes fehlt. + Amputation + Der rechte Arm wurde operative amputiert. + Amputation + Der linke Arm wurde operative amputiert. + Amputation + Das rechte Bein wurde operative amputiert. + Amputation + Das linke Bein wurde operative amputiert. + Amputation + Der Kopf wurde operative amputiert. + Rückenmarkverletzung + Der Patient ist paralysiert und fühlt seinen Körper nicht. + Tod durch Paralyse + Du bist an einer Paralyse gestorben. + Dislokation + Das Gelenk sollte sicht nicht in diese Richtung biegen... + Dislokation + Das Gelenk sollte sicht nicht in diese Richtung biegen... + Dislokation + Das Gelenk sollte sicht nicht in diese Richtung biegen... + Dislokation + Das Gelenk sollte sicht nicht in diese Richtung biegen... + Oberschenkelarterienblutung + Eine Arterie wurde beschädigt und blutet extrem stark. + Oberschenkelarterienblutung + Eine Arterie wurde beschädigt und blutet extrem stark. + Brachiale Arterienblutung + Eine Arterie wurde beschädigt und blutet extrem stark. + Brachiale Arterienblutung + Eine Arterie wurde beschädigt und blutet extrem stark. + Aortaruptur + Halsschlagarderblutung + Eine Arterie wurde beschädigt und blutet extrem stark. + Genähte Wunde + Die Wunde wurde zugenäht. + Immunität + + Infizierte Wunde + + Blutvergiftung + + Nekrose + + Tod durch eine nekrotische Wunde + Du bist an einer Nekrose gestorben. + Gangrän + Die Gliedmaße ist geschrumpft und schwarz. + Adrenalin + + Kochsalzlösung + + Ringerlösung + + Mannitol + + Antibiotika + + Blutransfusionsschock + + Fremder Körper + + Herztamponade + + Interne Blutung + + + Husten + Der Patient hustet periodisch. + Blasse Haut + Die Haut des Patienten ist blass. + Benommenheit + Der Patient wirkt benommen. + Verschwommene Sicht + Der Patient gibt an, er sehe verschwommen. + Verwirrung + Der Patient wirk desorientiert und verwirrt. + Kopfschmerzen + Der Patient gibt an, Kopfschmerzen zu haben. + Geschwollenes Bein + Die Beine des Patienten sind geschwollen. + Schwäche + Der Patient gibt an, er fühle sich schwach. + Keuchen + Beim atmen kommt ein hohes Geräusch aus dem Patienten. + Erbrechen + Der Patient muss sich periodisch übergeben. + Bluterbrechen + Der Patient erbricht periodisch Blut. + Fieber + Die Körpertemperatur des Patienten ist erhöht. + Magenverstimmungen + Der Patient gibt an, sein Bauch fühle sich komisch an. + Aufgebläht + Der Bauch des Patienten ist aufgebläht. + Gelbsucht + Die Haut des Patienten sieht krankhaft gelb aus. + Schwitzen + Der Patienten ist stark am schwitzen. + Herzklopfen + Der Patient gibt an, er nehme seinen eigenen Herzschlag als sehr heftig wahr. + Bewusslosigkeit + Der Patient ist bewusstlos. + Entzündung + Der Bereich ist rot, geschwollen und warm. + Zuckung + Der Patient kann die Bewegungen der Gliedmaße nicht kontrollieren. + Verlangen + Der Patient ist glücklich... so lange sie bekommen was sie brauchen. + In Flammen! + Der Patient verbrennt an lebendigem Leib! Holt einen Feuerlöscher! + Brustschmerzen + Der Patient gibt an, er habe starke, stechende Schmerzen im Brutstbereich. + Mauchschmerzen + Der Patient gibt an, er habe Schmerzen im Bauchbereich. + Starke Schmerzen + Der Patient gibt an, er habe starke schmerzen im betroffenen Bereich. + Übelkeit + Der Patient gibt an, er fühle sich schlecht und als ob er sich gleich übergeben müsste. + Traumatischer Schock + Der Patient ist wach! Er erfährt extreme Angst, intensive Stress und befindet sich in einem Schockzustand. Beende die Operation, sofort! + Analgesie + Der Patient ist schmerzunempfindlich. + Vollnarkose + Der Patient befindet sich in einer medikamentösen Narkose. + + Operative Inzision + Ein Skalpelschnitt. + Abgeklemmte Blutungen + Blutungen die durch den Eingriff entstanden sind wurden gehemmt. + Zurückgezogene Haut + Die Haut wurde durch Hautretraktoren zurückgezogen. + Aufgebohrte Knochen + Die Knochen wurden für eine orthopädische Prozedur vorbereitet. + Genähte Inzision + Die Inzision wurde zugenäht. + Gesägte Knochen + Der Knochen wurde durchgesägt. + \ No newline at end of file diff --git a/Neurotrauma/Localization/Korean/Korean.xml b/Neurotrauma/Localization/Korean/Korean.xml new file mode 100644 index 0000000..880e9ad --- /dev/null +++ b/Neurotrauma/Localization/Korean/Korean.xml @@ -0,0 +1,521 @@ + + + + + 수동 제세동기 + 심장에 전기충격을 가하여 부정맥을 안정화시키는 의료기기. 광범위한 의료 훈련이 필요합니다. 심정지 환자에게 사용하십시오. + 자동 제세동기 + 심장에 전기충격을 가하여 부정맥을 안정화시키는 의료기기. 의료 교육이 거의 또는 전혀 필요하지 않습니다. 심정지 환자에게 사용하십시오. + 앰부 백 + 백 밸브 마스크는 호흡을 하지 않거나 적절하게 호흡하지 않는 환자에게 양압 환기를 제공하기 위해 일반적으로 사용되는 휴대용 장치입니다. + 오토펄스 + 배터리로 구동되는 자동화된 휴대용 심폐 소생 장치. + 혈액학 분석기 + 혈액 분석기. 완전 자동화. 빈 기증자 카드에 혈액형을 인쇄할 수 있습니다. + 빈 기증자 카드 + 빈 기증자 카드입니다. 혈액학 분석기에서 사용합니다. + 외상 가위 + 붕대와 깁스를 제거하는 데 사용되는 도구입니다. + 휠체어 + 움직임을 위해 다리 대신 팔에 의존하게 만듭니다. + 청상어 + + 건강 진단기 + 증상의 근본 원인을 진단하는 데 사용됩니다. + + 이것을 장착하면 의식을 잃게 됩니다. 확실합니까? + + 메스 + 수술을 시작하기 위해 환부를 절개할 때 사용하는 도구입니다. + 지혈겸자 + 수술 중 혈관을 조일 때 사용하는 도구입니다. + 스킨 리트렉터 + 수술 중 피부를 절개 된 상태로 고정시키는 데 사용되는 도구입니다. + 집게 + 총알 또는 손상되고 괴사된 조직을 제거할 수 있는 작은 도구입니다. + 외과용 톱 + 뼈를 절단하는 데 사용하는 도구. + 봉합용 실 + 상처와 수술 절개 부위를 봉합하기 위한 생분해성 봉합용 실. + 수술용 드릴 + 뼈를 뚫는 데 사용하는 도구입니다. + 골접합 임플란트 + 골절을 치료하기 위해 골접합 수술에 사용되는 티타늄 임플란트. + 척추 임플란트 + 목 골절로 인한 마비를 치료하는 데 사용되는 티타늄 임플란트. + 수술대 + 기본적인 인공호흡기가 내장된 수술대입니다. + 장기 적출용 메스: 간 + 간 적출을 위한 특수 메스. + 장기 적출용 메스: 신장 + 신장 적출용 특수 메스. + 장기 적출용 메스: 폐 + 폐를 적출하기 위한 특수 메스. + 장기 적출용 메스: 심장 + 심장 적출을 위한 특수 메스. + 장기 적출용 메스: 뇌 + 뇌를 적출하기 위한 특수 메스. + + + 만니톨 + 당 환원 알코올의 일종. 신경 외상으로부터 회복을 돕기 위해 사용됩니다. 장기 손상을 일으킬 수 있습니다. + 스트렙토키나제 + 혈전을 분해하는 혈전 용해 효소. 심장 마비를 치료하는 데 사용됩니다. 혈액 응고를 감소시킵니다. + 아자티오프린 + 장기 거부반응 예방용 면역억제제. + 티아민 + 비타민 B1으로 알려진 이 알약은 장기 치유에 도움이 됩니다. + 나이트로프루사이드 나트륨 + 혈압을 낮추는 데 사용되는 약물. + 항생제 연고 + 화상 및 경미한 감염으로부터 회복을 촉진하는 살균력이 뛰어난 젤. + 혈관 내 풍선 + 파열된 주요 동맥에 풍선을 삽입합니다. 그것은 혈류를 차단하지만 출혈을 멈추는 효과가 있습니다. + 의료용 스텐트 + 파열된 대동맥에 혈관 내 풍선을 삽입한 이후 삽입하는 플라스틱 튜브. + 지혈대 + 사지에 압력을 가하여 혈류를 감소시키는 장치. 일반적으로 사지에 큰 출혈이 있는 경우에 사용됩니다. 머리에 사용하면 안됩니다. + 배액관 + 기흉 교정 수술 시 흉강에서 공기를 빼냅니다. + 바늘 + 흉막강이나 심낭에서 공기나 액체를 밖으로 배출시키는 감압 밸브가 있는 바늘 + 링거 액 + 저혈압이나 체액 손실을 치료하기 위해 물에 녹인 여러 염류 용액. 혈액과 삼투압이 같습니다. + 소독제 + + 소독제 스프레이 + + 프로포폴 + 의식 수준을 감소시키고 사건에 대한 기억력 부족을 초래하는 속효성 약물입니다. 그 용도에는 전신 마취의 시작과 유지가 포함됩니다. + 석고 + 사지의 골절을 깁스로 둘러싸는 데 사용되는 미세한 미네랄 분말입니다. 붕대를 먼저 감아야 합니다. + + + + + 빈 혈액 팩 + 채혈을 위한 빈 혈액 팩. + O+ 혈액 팩 + 수혈 가능한 환자의 혈액형: O+, A+, B+, AB+ + O- 혈액 팩 + 모든 환자에게 사용할 수 있는 혈액 팩. + A+ 혈액 팩 + 수혈 가능한 환자의 혈액형: A+, AB+ + B+ 혈액 팩 + 수혈 가능한 환자의 혈액형: B+, AB+ + AB+ 혈액 팩 + 수혈 가능한 환자의 혈액형: AB+ + A- 혈액 팩 + 수혈 가능한 환자의 혈액형: A-, A+, AB-, AB+ + B- 혈액 팩 + 수혈 가능한 환자의 혈액형: B-, B+, AB-, AB+ + AB- 혈액 팩 + 수혈 가능한 환자의 혈액형: AB-, AB+ + + O- 혈액 팩 + 모든 환자에게 사용할 수 있는 혈액 팩. + + O- 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O- +이 혈액형에게 공혈할 수 있음: 모든 혈액형 + O+ 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, O+ +이 혈액형에게 공혈할 수 있음: O+, A+, B+, AB+ + A- 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, A- +이 혈액형에게 공혈할 수 있음: A-, A+, AB-, AB+ + A+ 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, O+, A-, A+ +이 혈액형에게 공혈할 수 있음: A+, AB+ + B- 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, B- +이 혈액형에게 공혈할 수 있음: B-, B+, AB-, AB+ + B+ 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, O+, B-, B+ +이 혈액형에게 공혈할 수 있음: B+, AB+ + AB- 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: O-, A-, B-, AB- +이 혈액형에게 공혈할 수 있음: AB-, AB+ + AB+ 혈액 기증자 카드 + 이 혈액형으로부터 수혈받을 수 있음: all of them +이 혈액형에게 공혈할 수 있음: AB+ + + 의료품 보관함 + 약 및 의료기구를 보관할 수 있습니다. + 수술도구 보관함 + 수술 중 사용하는 많은 작은 물건을 보관할 수 있습니다. + 저온 상자 + 소중한 이식용 장기를 보관하는 곳 + 의료용 스타터 상자 + 모든 필수품을 담은 상자로, 하나의 제작 레시피로 편리하게 포장되어 있습니다. + 저온 보관함 + 소중한 이식용 장기를 보관하는 곳 + 바디 백 + 사람을 더 빨리 옮길 수 있습니다. + 스테이시스 백 + 대부분의 생물학적 과정이 일어나는 것을 막습니다. + + 오른쪽 팔 + 잘린 오른팔. 외과적으로 다시 부착할 수 있습니다. + 왼쪽 팔 + 잘린 왼팔. 외과적으로 다시 부착할 수 있습니다. + 오른쪽 다리 + 잘린 오른쪽 다리. 외과적으로 다시 부착할 수 있습니다. + 왼쪽 다리 + 잘린 왼쪽 다리. 외과적으로 다시 부착할 수 있습니다. + 오른팔 바이오닉 의수 + 바이오닉 오른팔. 절단 치료에 사용할 수 있습니다. + 왼팔 바이오닉 의수 + 바이오닉 왼팔. 절단 치료에 사용할 수 있습니다. + 오른쪽 다리 바이오닉 의족 + 바이오닉 오른쪽 다리. 절단 치료에 사용할 수 있습니다. + 왼쪽 다리 바이오닉 의족 + 바이오닉 왼쪽 다리. 절단 치료에 사용할 수 있습니다. + 이식용 간 + 이식용 간 + 이식용 간 + 이식용 간 + 이식용 간 + 이식용 간 + 이식용 폐 + 이식용 폐 + 이식용 폐 + 이식용 폐 + 이식용 폐 + 이식용 폐 + 이식용 신장 + 이식용 신장 + 이식용 신장 + 이식용 신장 + 이식용 신장 + 이식용 신장 + 이식용 심장 + 이식용 심장 + 이식용 심장 + 이식용 심장 + 이식용 심장 + 이식용 심장 + 이식용 뇌 + 작동하지 않는 오른손 + 작동하지 않는 왼손 + + + + + + + + 심박수 증가 + 심장이 놀라울 정도로 빠르게 뛰고 있습니다. + 불규칙한 심장박동 + 심장이 펄럭이며 떨리는 방식으로 뛰고 있습니다. + 심정지 + 박동이 없습니다. + 심장 마비 + + 심장 손상 + + 심부전 + + 심장이 제거됨 + 심장은 수술로 제거되었습니다. + + 신경 외상 + + 신경 외상으로 인한 사망 + 당신은 신경 외상으로 사망했습니다. + 뇌졸중 + + 발작 + + 코마 + + 뇌가 제거됨 + 뇌는 수술로 제거되었습니다. + 외상성 쇼크 + 이렇게 파고들면 안 돼! 이건 아주 잘못된 거야! + + 혈압 + + 저산소혈증 + + + 호흡 정지 + 환자가 숨을 쉬지 않습니다. + 과호흡 + 환자는 놀라울 정도로 빠른 속도로 호흡하고 있습니다. + 저호흡 + 환자는 놀라울 정도로 느린 속도로 호흡하고 있습니다. + 호흡 곤란 + 환자의 호흡은 힘들고 얕습니다. + 알칼리증 + + 산증 + + 방사선으로 인한 폐 손상 + + 기흉 + + 폐 손상 + + 폐부전 + + 폐가 제거됨 + 폐는 외과적으로 제거되었습니다. + + 신장 손상 + + 신부전 + + 신장이 제거됨 + 신장은 수술로 제거되었습니다. + + 뼈 손상 + + 뼈 괴사 + + 뼈 재생 촉진 + 뼈 재생이 촉진되었습니다. 괴사된 뼈가 치유되기 위해서는 모든 팔과 다리에 이 증상이 나타나도록 해야 합니다. + + 간 손상 + + 간부전 + + 간이 제거됨 + 간은 수술로 제거되었습니다. + + 수술 절개 + 메스로 절개가 이루어졌습니다. + 혈관 조임 + 절개로 유발된 출혈이 멈췄습니다. + 동맥 조임 + 동맥으로부터의 출혈은 멈췄지만 사지로 가는 혈류가 심각하게 감소합니다. + 풍선이 삽입된 대동맥 + 대동맥은 출혈을 멈췄지만 사지와 장기로 가는 혈류가 사라졌습니다. + 뼈 클램프 + 골절부위가 뼈 클램프로 고정되었습니다. + 붕대 + 감염으로부터 보호하고 탈구된 뼈를 안정화시킵니다. 움직임이 약간 느려집니다. + 더러운 붕대 + 감염으로부터 보호하는 데 사용되었지만 지금은 그 반대입니다. + 깁스로 고정됨 + 골절을 치료하고 보호합니다. 움직임이 느려집니다. 외상 가위를 사용하여 제거하십시오. + 연고 + 항생제 젤 층은 모든 세균으로부터 상처를 보호하고 청소합니다. + 바늘 + 흉막강의 압력을 정상화합니다. + + + 오른쪽 상완골 골절 + 오른팔이 부러졌습니다. + 왼쪽 상완골 골절 + 왼쪽 팔이 부러졌습니다. + 오른쪽 대퇴골 골절 + 오른쪽 다리가 부러졌습니다. + 왼쪽 대퇴골 골절 + 왼쪽 다리가 부러졌습니다. + 갈비뼈 골절 + 하나 이상의 갈비뼈가 부러졌습니다. + 두개골 골절 + 두개골이 부러졌습니다. + 목 골절 + 목이 부러졌습니다. + 외상성 절단 + 오른팔의 대부분의 조직이 찢어졌습니다. + 외상성 절단 + 왼팔의 대부분의 조직이 찢어졌습니다. + 외상성 절단 + 오른쪽 다리의 조직이 대부분 찢어졌습니다. + 외상성 절단 + 왼쪽 다리 조직의 대부분이 찢어졌습니다. + 외상성 절단 + 머리 조직의 대부분이 찢어졌습니다. + 절단 + 오른쪽 팔은 수술로 절단되었습니다. + 절단 + 왼쪽 팔은 수술로 절단되었습니다. + 절단 + 오른쪽 다리는 수술로 절단되었습니다. + 절단 + 왼쪽 다리는 수술로 절단되었습니다. + 절단 + 머리는 수술로 절단되었습니다. + 척수 손상 + 환자는 마비되어 몸을 느끼지 못합니다. + 마비로 사망 + 당신은 마비로 사망했습니다. + 탈구 + 관절이 이렇게 휘어지면 안되는데... + 탈구 + 관절이 이렇게 휘어지면 안되는데... + 탈구 + 관절이 이렇게 휘어지면 안되는데... + 탈구 + 관절이 이렇게 휘어지면 안되는데... + 대퇴동맥 출혈 + 동맥이 손상되어 심각한 출혈을 유발합니다. + 대퇴동맥 출혈 + 동맥이 손상되어 심각한 출혈을 유발합니다. + 상완 동맥 출혈 + 동맥이 손상되어 심각한 출혈을 유발합니다. + 상완 동맥 출혈 + 동맥이 손상되어 심각한 출혈을 유발합니다. + 대동맥 파열 + 경동맥 출혈 + 동맥이 손상되어 심각한 출혈을 유발합니다. + 꿰매어진 상처 + 상처를 봉합했습니다. + 면역 + + 감염된 상처 + + 패혈 + + 괴사 + + 괴사된 상처로 인해 사망했습니다. + 당신은 괴사된 상처로 인해 사망했습니다. + 괴저 + 부위가 쪼그라들어 검게 변했습니다. + 아드레날린 + + 응고 방지 + + 티아민 + + 혈압 강하제 + + 식염수 + + 링거액 + + 만니톨 + + 항생제 + + 면역억제제 + + 수혈 쇼크 + + 이물질 + + 심장눌림증 + + 내부 출혈 + + + 기침 + 환자는 주기적으로 기침을 합니다. + 창백한 피부 + 환자의 피부는 창백합니다. + 현기증 + 환자는 현기증을 겪고 있습니다. + 흐린 시야 + 환자는 시야가 흐려졌다고 호소하고 있습니다. + 착란 + 환자는 방향 감각을 잃고 혼란스러워 보입니다. + 두통 + 환자는 두통을 호소하고 있습니다. + 다리 붓기 + 환자의 다리가 부어 있습니다. + 힘이 없음 + 환자의 해당 부위에 힘이 없습니다. + 쌕쌕거림 + 환자의 호흡에서 높은 음의 소음이 발생합니다. + 구토 + 환자는 주기적으로 구토를 합니다. + 피를 토함 + 환자는 주기적으로 피를 토합니다. + 고열 + 환자의 체온이 상승합니다. + 복부 불편 + 환자는 복부가 불편하다고 호소하고 있습니다. + 팽만감 + 환자의 복부가 부풀어 올랐습니다. + 황달 + 환자의 피부는 병약한 노란색으로 변했습니다. + 땀흘림 + 환자가 과도하게 땀을 흘리고 있습니다. + 심장이 두근거림 + 환자는 심장이 두근거림을 호소하고 있습니다. + 무의식 + 환자는 의식이 없습니다. + 염증 + 부위가 붉게 부어 오르며 따뜻합니다. + 경련 + 환자는 해당 부위의 불규칙한 움직임을 제어할 수 없습니다. + 갈망 + 환자는 충분히 행복합니다... 필요한 것을 얻는 한. + 불이야! + 환자가 산 채로 불타고 있습니다! 소화기를 잡아라! + 가슴 통증 + 환자는 가슴에 날카롭고 찌르는 듯한 통증을 호소하고 있습니다. + 복통 + 환자는 복부에 지속적인 통증을 호소하고 있습니다. + 심한 통증 + 환자는 환부에 심한 통증을 호소하고 있습니다. + 메스꺼움 + 환자는 메스꺼움을 느끼며 피부가 축축합니다. + Lua 없음 + Lua가 실행되지 않습니다. 즉, Neurotrauma 및 이를 사용하는 다른 모드가 작동하지 않습니다. 사용하려는 모드의 워크샵 페이지를 읽으십시오. + 무통 + 통증을 느끼지 않습니다. + 마취 + 환자는 약물로 인한 진정효과를 보이고 있습니다. + 1도 화상 + 부위가 붉고 만지면 통증이 있습니다. + 2도 화상 + 감염된 부위에 매우 고통스러운 물집이 흩어져 있습니다. + 3도 화상 + 환자는 이제 가죽 같은 딱딱한 부위에서 통증을 느끼지 않습니다. + + 수술 절개 + 부위가 절개되었습니다. + 혈관 조임 + 절개로 인한 출혈이 멈췄습니다. + 피부 견인 + 절개된 피부는 스킨 리트렉터로 고정되어 있습니다. + 뚫린 뼈 + 뼈는 정형 외과 절차를 위해 준비되었습니다. + 봉합된 절개 + 봉합용 실을 사용하여 절개되었던 부위를 봉합했습니다. + 톱질된 뼈 + 뼈가 절단되었습니다. + + 살아있음_여부 + 의식있음_여부 + 환자이름 + 활력 + 심박수 + 호흡율 + 혈압 + 혈중산소농도 + 신경외상 + 장기손상 + 수술중_여부 + 사망원인 + 혈액pH + + Surgical + + \ No newline at end of file diff --git a/Neurotrauma/Localization/Polish/Polish.xml b/Neurotrauma/Localization/Polish/Polish.xml new file mode 100644 index 0000000..9279c00 --- /dev/null +++ b/Neurotrauma/Localization/Polish/Polish.xml @@ -0,0 +1,520 @@ + + + + + Defibrylator ręczny + Urządzenie medyczne dostarczające wstrząs elektryczny do serca w celu stabilizacji arytmii serca. Wymaga intensywnego przeszkolenia medycznego. Stosować u pacjenta z zatrzymaniem akcji serca. + Automatyczny defibrylator zewnętrzny + Urządzenie medyczne dostarczające wstrząs elektryczny do serca w celu stabilizacji arytmii serca. Nie wymaga szkolenia medycznego. Stosować u pacjenta z zatrzymaniem akcji serca. + Resuscytator + Ten worek samorozprężalny (BVM) jest ręcznym urządzeniem powszechnie używanym do zapewniania wentylacji dodatnim ciśnieniem pacjentom, którzy nie oddychają lub oddychają niewystarczająco. + Auto-puls + Zautomatyzowane, przenośne, zasilane bateryjnie urządzenie do resuscytacji krążeniowo-oddechowej, zakładane jak kamizelka. + Analizator hematologiczny + Automatyczny analizator krwi. Może drukować grupy krwi na czystych kartach dawców lub analizować ciśnienie i skład krwi. + Pusta karta dawcy + Używana przez analizator hematologiczny. + Nożyczki ratownicze + Narzędzie do usuwania opatrunków i gipsów. + Wózek inwalidzki + Sprawia, że ruch jest zależny od ramion, a nie nóg. + Żarłacz błękitny + + Skaner zdrowia + Podobnie jak analizator krwi, służy do diagnozowania przyczyn objawów. UWAGA: promieniowanie rentgenowskie. + + Założenie spowoduje utratę przytomności. Czy na pewno chcesz to założyć? + + Skalpel + Narzędzie służące do wykonywania nacięć podczas operacji. + Kleszcze hemostatyczne + Narzędzie służące do zaciskania naczyń krwionośnych podczas operacji. + Retraktor + Narzędzie służące do otwierania nacięć podczas operacji. + Pęseta + Narzędzie, które umożliwia usuwanie odłamków oraz martwych tkanek. + Piła chirurgiczna + Narzędzie używane do przecinania kości. + Szew + Biodegradowalne szwy do zszywania ran i nacięć chirurgicznych. + Wiertarka chirurgiczna + Narzędzie do wiercenia kości. + Implanty osteosyntetyczne + Implanty tytanowe stosowane w chirurgii osteosyntezy do naprawy złamań. + Implanty rdzenia kręgowego + Implanty tytanowe stosowane do leczenia paraliżu spowodowanego złamaniami szyi. + Stół chirurgiczny + Stół operacyjny z wbudowaną podstawową sztuczną wentylacją. + Skalpel do pobierania narządów: Wątroba + Specjalistyczny skalpel do usuwania wątroby. + Skalpel do pobierania narządów: Nerki + Specjalistyczny skalpel do usuwania nerek. + Skalpel do pobierania narządów: Płuca + Specjalistyczny skalpel do usuwania płuc. + Skalpel do pobierania narządów: Serce + Specjalistyczny skalpel do usuwania serca. + Skalpel do pobierania narządów: Mózgu + Specjalistyczny skalpel do usuwania mózgu. + + + Mannitol + Rodzaj alkoholu cukrowego. Służy do wspomagania powrotu do zdrowia po neurotraumie. Może powodować uszkodzenie narządów. + Streptokinaza + Enzym trombolityczny, który rozkłada skrzepy krwi i zmniejsza jej krzepliwość. Służy do leczenia zawałów serca. + Azatiopryna + Środek immunosupresyjny do zapobiegania odrzuceniu narządu. + Tiamina + Znane również jako witamina B1, tabletki te pomogą w gojeniu się narządów. + Maść antybiotykowa + Silnie antyseptyczny żel, który wspomaga regenerację po oparzeniach, a także po drobnych infekcjach. + Balon wewnątrznaczyniowy + Balon stosowany w wypadku pęknięcia głównej tęntnicy. Odcina przepływ krwi, ale zatrzymuje krwawienie. + Stent medyczny + Plastikowa rurka wprowadzona do aorty po balonie wewnątrznaczyniowym, w wypadku pęknięciu aorty. + Opaska uciskowa + Wywiera nacisk na kończynę, a tym samym zmniejsza przepływ krwi. Zwykle stosuje się go w przypadku dużych krwawień na kończynach. Nie należy stosować na głowę. + Drenaż + Odprowadza powietrze z jamy opłucnej podczas operacji korekcyjnej odmy opłucnowej. + Igła + Igła z zaworem dekompresyjnym umożliwiająca odpływ powietrza lub płynu z jamy opłucnej lub osierdzia. + Roztwór Ringera + Roztwór kilku soli rozpuszczonych w wodzie w celu leczenia niskiego ciśnienia krwi lub utraty płynów. Izotoniczny do krwi. + Atomizator antyseptyczny + Urządzenie służące do rozpylania płynu antyseptycznego. + Spray antyseptyczny + Spray do atomizatora, rozpylany na rany w celu odkażenia. + Propofol + Środek znieczulenia ogólnego (narkozy) o krótkim działaniu. Powoduje obniżony poziom świadomości i brak pamięci zdarzeń. + Gips + Drobny proszek mineralny stosowany do zamykania złamań kończyn w opatrunku gipsowym. Najpierw nałóż bandaż. + + + + + Pusty worek na krew + Służy do upustu i transfuzji krwi. + Worek krwi O+ + Biorcy: O+, A+, B+, AB+ + Worek krwi O- + Biorcy: wszyscy. + Worek krwi A+ + Biorcy: A+, AB+ + Worek krwi B+ + Biorcy: B+, AB+ + Worek Krwi AB+ + Biorcy: AB+ + Worek krwi A- + Biorcy: A-, A+, AB-, AB+ + Worek krwi B- + Biorcy: B-, B+, AB-, AB+ + Worek krwi AB- + Biorcy: AB-, AB+ + + Worek krwi O- + Biorcy: wszyscy. + + Karta dawcy O- + Może pobrać krew od: O- +Biorcy: wszyscy. + Karta dawcy O+ + Może pobrać krew od: O-, O+ +Biorcy: O+, A+, B+, AB+ + Karta dawcy A- + Może pobrać krew od: O-, A- +Biorcy: A-, A+, AB-, AB+ + Karta dawcy A+ + Może pobrać krew od: O-, O+, A-, A+ +Biorcy: A+, AB+ + Karta dawcy B- + Może pobrać krew od: O-, B- +Biorcy: B-, B+, AB-, AB+ + Karta dawcy B+ + Może pobrać krew od: O-, O+, B-, B+ +Biorcy: B+, AB+ + Karta dawcy AB- + Może pobrać krew od: O-, A-, B-, AB- +Biorcy: AB-, AB+ + Karta dawcy AB+ + Może pobrać krew od: wszyscy. +Biorcy: AB+ + + Pojemnik medyczny + Może przechowywać lekarstwa i instrumenty medyczne + Przybornik chirurgiczny + Pomieści wiele małych narzędzi chirurgicznych. + Skrzynia chłodnicza + Miejsce do przechowywania cennych narządów gotowych do przeszczepu. + Pojemnik chłodniczy + Miejsce do przechowywania cennych narządów gotowych do przeszczepu. + Worek na ciało + Pozwala szybciej przeciągać ludzi. + Worek stazy medycznej + Zatrzymuje większość procesów biologicznych. + + Prawe ramię + Może być ponownie przymocowane chirurgicznie. + Lewe ramię + Może być ponownie przymocowane chirurgicznie. + Prawa noga + Może być ponownie przymocowana chirurgicznie. + Lewa noga + Może być ponownie przymocowana chirurgicznie. + Proteza bioniczna prawego ramienia + Bioniczne prawe ramię. Może być stosowana w leczeniu amputacji chirurgicznej. + Proteza bioniczna lewego ramienia + Bioniczne lewe ramię. Może być stosowana w leczeniu amputacji chirurgicznej. + Proteza bioniczna prawej nogi + Bioniczna prawa noga. Może być stosowana w leczeniu amputacji chirurgicznej. + Proteza bioniczna lewej nogi + Bioniczna lewa noga. Może być stosowana w leczeniu amputacji chirurgicznej. + Przeszczep wątroby + Przeszczep wątroby + Przeszczep wątroby + Przeszczep wątroby + Przeszczep wątroby + Przeszczep wątroby + Przeszczep płuc + Przeszczep płuc + Przeszczep płuc + Przeszczep płuc + Przeszczep płuc + Przeszczep płuc + Przeszczep nerki + Przeszczep nerki + Przeszczep nerki + Przeszczep nerki + Przeszczep nerki + Przeszczep nerki + Transplantacja serca + Transplantacja serca + Transplantacja serca + Transplantacja serca + Transplantacja serca + Transplantacja serca + Przeszczep mózgu + Niesprawna prawa ręka + Niesprawna lewa ręka + + + + + + + + Zwiększone tętno + Serce bije w niepokojąco szybkim tempie. + Arytmia + Skurcze mięśnia sercowego są nieregularne, występuje odczucie trzepotania. + Zatrzymanie akcji serca + Brak pulsu. + Zawał mięśnia sercowego + Atak serca. + Uszkodzenie serca + + Niewydolność serca + + Usunięte serce + Serce zostało usunięte chirurgicznie. + + Niedotlenienie mózgu + Poważny uraz mózgu (Neurotrauma) + Śmierć przez niedotlenienie mózgu. + Umarłeś z powodu niedotlenienia mózgu. + Udar mózgu + + Drgawki + + Śpiączka + + Usunięty mózg + Mózg został usunięty chirurgicznie. + + Ciśnienie krwi + + Niedotlenienie + + + Zarzymanie oddechu + Pacjent nie oddycha. + Hiperwentylacja + Pacjent oddycha w niepokojąco szybkim tempie. + Hipowentylacja + Pacjent oddycha w niepokojąco wolnym tempie. + Duszność + Oddech pacjenta jest ciężki i płytki. + Alkaloza + + Kwasica + + Uraz płuc wywołany promieniowaniem + + Odma płucna + + Uszkodzenie płuc + + Niewydolność płuc + + Usunięte płuca + Płuca zostały usunięte chirurgicznie. + + Uszkodzenie nerek + + Niewydolność nerek + + Usunięte nerki + Nerki zostały usunięte chirurgicznie. + + Uszkodzenie kości + + Martwica kości + + Stymulowany odrost kości + Stymulowano naprawę kości tej części ciała. Aby wyleczyć martwicę, należy stymulować każdą część ciała jednocześnie. + + Uszkodzenie wątroby + + Niewydolność wątroby + + Usunięta wątroba + Wątroba została usunięta chirurgicznie. + + Nacięcie chirurgiczne + Nacięcie zostało wykonane skalpelem. + Zaciśnięte krwawienie + Krwawienia operacyjne zostały zatamowane. + Zaciśnięte tętnice + Krwawienie z tętnicy zostało zatrzymane, ale dopływ krwi do kończyny jest znacznie zmniejszony. + Balonikowanie aorty + Krwawienie aorty zostało zatamowane, ale ustał dopływ krwi do kończyn i narządów. + Szyna + Złamanie zostało zabezpieczone szynami. + Bandaż + Chroni przed infekcją, stabilizuje zwichnięcia. Ruch jest nieco spowolniony. + Brudny bandaż + Używany do ochrony przed infekcjami, ale teraz działa odwrotnie. Usuń za pomocą nożyc ratowniczych. + Kończyna w gipsie + Leczy i chroni przed złamaniami. Ruch jest spowolniony. Usuń za pomocą nożyc ratowniczych. + Maść + Warstwa żelu antybiotykowego chroni i oczyszcza ranę z wszelkich zarazków. + Igła + Normalizuje ciśnienie w jamie opłucnej. + + + Złamanie prawej kości ramiennej + Twoja prawa ręka jest złamana. + Złamanie lewej kości ramiennej + Twoja lewa ręka jest złamana. + Złamanie prawej kości udowej + Twoja prawa noga jest złamana. + Złamanie lewej kości udowej + Twoja lewa noga jest złamana. + Złamane żebra + Jedno lub więcej twoich żeber jest złamane. + Pęknięta czaszka + Twoja czaszka jest pęknięta. + Złamana szyja + Twoja szyja jest złamana. + Amputacja urazowa + Większość tkanki prawej ręki została oderwana. + Amputacja urazowa + Większość tkanki lewej ręki została oderwana. + Amputacja urazowa + Większość tkanki prawej nogi została oderwana. + Amputacja urazowa + Większość tkanki lewej nogi została oderwana. + Amputacja urazowa + Większość tkanki głowy została oderwana. + Amputacja + Amputowano chirurgicznie prawą rękę. + Amputacja + Amputowano chirurgicznie lewą rękę. + Amputacja + Amputowano chirurgicznie prawą nogę. + Amputacja + Amputowano chirurgicznie lewą nogę. + Amputacja + Amputowano chirurgicznie głowę. + Uraz rdzenia kręgowego + Pacjent jest sparaliżowany i nie czuje ciała. + Zmarł z powodu paraliżu + Umarłeś z powodu paraliżu. + Zwichnięcie + Wymaga nastawienia. + Zwichnięcie + Wymaga nastawienia. + Zwichnięcie + Wymaga nastawienia. + Zwichnięcie + Wymaga nastawienia. + Krwawienie z tętnicy udowej + Tętnica została uszkodzona i powoduje poważną utratę krwi. + Krwawienie z tętnicy udowej + Tętnica została uszkodzona i powoduje poważną utratę krwi. + Krwawienie z tętnicy ramiennej + Tętnica została uszkodzona i powoduje poważną utratę krwi. + Krwawienie z tętnicy ramiennej + Tętnica została uszkodzona i powoduje poważną utratę krwi. + Pęknięcie aorty + Krwawienie z tętnicy szyjnej + Tętnica została uszkodzona i powoduje poważną utratę krwi. + Zszywana rana + Rana została zszyta. + Odporność + + Zainfekowana rana + + Posocznica (Sepsa) + + Martwica + + Zmarł z rany martwiczej. + Umarłeś na martwicę. + Zgorzel (Gangrena) + Kończyna skurczyła się i zrobiła się czarna. + Adrenalina + + Lek przeciwzakrzepowy + + Tiamina + + Sól fizjologiczna + + Roztwór Ringera + + Mannitol + + Antybiotyki + + Leki immunosupresyjne + + Wstrząs hemotransfuzyjny + + Ciało obce + + Tamponada serca + + Krwotok wewnętrzny + + + Kaszel + Pacjent okresowo kaszle. + Blada skóra + Skóra pacjenta jest blada. + Zawroty + Pacjent odczuwa zawroty głowy. + Rozmazany obraz + Pacjent odczuwa niewyraźne widzenie. + Dezorientacja + Pacjent wydaje się zagubiony. + Bół głowy + Pacjent odczuwa ból głowy. + Obrzęk nóg + Nogi pacjenta są spuchnięte. + Osłabienie + Pacjent odczuwa słabość kończyn. + Świszczący oddech + Podczas oddychania pacjenta słychać wysoki dźwięk. + Wymioty + Pacjent okresowo wymiotuje. + Wymioty krwi + Pacjent okresowo wymiotuje krwią. + Gorączka + Temperatura ciała pacjenta jest podwyższona. + Dyskomfort w jamie brzusznej + Pacjent odczuwa dyskomfort w jamie brzusznej. + Nabrzęknięcie + Brzuch pacjenta jest wzdęty. + Żółtaczka + Skóra pacjenta przybrała chorowity odcień żółtego. + Potliwość + Pacjent nadmiernie się poci. + Kołatanie serca + Pacjent odczuwa kołatanie serca. + Nieprzytomność + Pacjent jest nieprzytomny. + Zapalenie + Okolica jest czerwona, spuchnięta i ciepła. + Skurcz + Pacjent nie jest w stanie kontrolować nieregularnego zachowania kończyny. + Głód narkotykowy + Pacjent jest wystarczająco szczęśliwy... dopóki dostaje to, czego potrzebuje. + W ogniu! + Pacjent płonie żywcem! Chwyć gaśnicę! + Ból w klatce piersiowej + Pacjent odczuwa ostry, przeszywający ból w klatce piersiowej. + Ból brzucha + Pacjent odczuwa uporczywy ból brzucha. + Intensywny ból + Pacjent odczuwa silny ból w dotkniętym obszarze. + Mdłości + Skóra jest wilgotna, a pacjent ma mdłości. + Lualess + Lua nie działa. Oznacza to, że Neurotrauma i inne mody, które jej używają, nie będą działać. Prosimy o zapoznanie się ze stronami warsztatów modów, których planujecie użyć. + Szok traumatyczny + Pacjent odczuwa silny ból i stres. + Znieczulenie + Niewrażliwość na ból. + Znieczulenie + U pacjenta występuje amnezja i uspokojenie wywołane lekami. + Oparzenie pierwszego stopnia + Miejsce oparzenia jest czerwone i bolesne w dotyku. + Oparzenie drugiego stopnia + W miejscu oparzenia znajdują się bardzo bolesne pęcherze. + Oparzenie trzeciego stopnia + Miejsce oparzenia jest ciemnobrunatne i pozbawione pęcherzy, a pacjent prawie nie czuje bólu. + + Nacięcie chirurgiczne + Pacjent został rozcięty. + Zaciśnięte krwawienie + Krwawienie spowodowane nacięciem zostało zatrzymane. + Otwarta skóra + Skóra jest utrzymywana przez retraktor. + Przewiercona kość + Kości zostały przygotowane do zabiegów ortopedycznych. + Szyte nacięcie + Nacięcie zostało zamknięte za pomocą szwów. + Przepiłowanie kości + Kość została odcięta. + + Żywy + Przytomny + Imię_pacjenta + Witalność + Tętno + Częstość_oddechów + Ciśnienie_krwi + Tlen_we_krwi + Neurotrauma + Uszkodzenie_narządów + Podczas_operacji + Przyczyna_śmierci + pH_krwi + + Chirurgiczny + + Obniżacze ciśnienia krwi + Nitroprusydek sodu + Lek stosowany w doraźnym obniżaniu ciśnienia tętniczego. + Medyczna skrzynia startowa + Skrzynia, która zawiera wszystkie niezbędne rzeczy, wygodnie zamknięte w jednym przepisie craftingowym. + \ No newline at end of file diff --git a/Neurotrauma/Localization/Portuguese/Portuguese.xml b/Neurotrauma/Localization/Portuguese/Portuguese.xml new file mode 100644 index 0000000..fd14031 --- /dev/null +++ b/Neurotrauma/Localization/Portuguese/Portuguese.xml @@ -0,0 +1,514 @@ + + + + + Desfibrilador Manual + Um dispositivo médico que aplica um choque elétrico ao coração para estabilizar as arritmias cardíacas. Requer treinamento médico extensivo. Use em um paciente com parada cardíaca. + Desfibrilador Externo Automático + Um dispositivo médico que aplica um choque elétrico ao coração para estabilizar as arritmias cardíacas. Requer pouco treinamento médico. Use em um paciente com parada cardíaca. + Ressuscitador AMBU + Uma bolsa-válvula-máscara, é um disputivo portátil comumente usado para fornecer ventilação para pacientes que não estão respirando ou não estão respirando adequadamente. + AutoPulse + Um dispositivo de ressuscitação cardiopulmonar automatizado, portátil e alimentado por bateria. + Analisador Hematológico + Analisador de sangue totalmente automatizado. Pode imprimir tipos sanguíneos em cartões de doador em branco. + Cartão de Doador em Branco + Cartão de doador em branco. Usado pelo analisador hematológico. + Tesouras Médicas + Uma ferramenta usada para remover bandagens e gessos. + Cadeira de Rodas + Faz você depender de seus braços ao invés de suas pernas para a movimentação. + Tubarão Azul + + Visor de Saúde + Usado para diagnosticar as causas subjacentes dos sintomas. + + Equipar isso vai te deixar inconsciente. Você tem certeza? + + Bisturi + Uma ferramenta usada para fazer incisões durante a cirurgia. + Hemostato + Uma ferramenta usada para estancar os vasos sanguíneos durante a cirurgia. + Afastador de Pele + Uma ferramenta usada para afastar a pele na cirurgia. + Pinça + Uma pequena ferramenta que permite a remoção de balas, assim como tecido danificado e infectado. + Serra Cirúrgica + Uma ferramenta usada para serrar ossos. + Sutura + Suturas biodegradáveis ​​para costurar feridas e incisões cirúrgicas. + Furadeira Cirúrgica + Uma ferramenta usada para perfurar ossos. + Implantes de Osteossíntese + Implantes de titânio usados ​​em uma cirurgia osteossintética para reparar fraturas. + Implantes de Medula Espinal + Implantes de titânio usados ​​para curar paralisia causada por fraturas do pescoço. + Mesa de Cirurgia + Uma mesa de cirurgia que possui ventilação artificial básica embutida. + Bisturi para Aquisição de Órgãos: Fígado + Um bisturi especializado para a remoção do fígado. + Bisturi para Aquisição de Órgãos: Rins + Um bisturi especializado para a remoção de rins. + Bisturi para Aquisição de Órgãos: Pulmões + Um bisturi especializado para a remoção de pulmões. + Bisturi para Aquisição de Órgãos: Coração + Um bisturi especializado para a remoção do coração. + Bisturi para Aquisição de Órgãos: Cérebro + Um bisturi especializado para a remoção do cérebro. + + + Manitol + Um tipo de álcool de açúcar. É usado para ajudar na recuperação de neurotrauma. Pode causar danos aos órgãos. + Estreptoquinase + Uma enzima trombolítica que quebra os coágulos sanguíneos. É usado para curar ataques cardíacos. Diminui a coagulação do sangue. + Azatioprina + Um agente imunossupressor para a prevenção da rejeição de órgãos. + Tiamina + Também conhecido como vitamina B1, essas pílulas ajudarão na cicatrização de órgãos. + Pomada Antibiótica + Um gel altamente antisséptico que promove a recuperação de queimaduras, bem como de pequenas infecções. + Balão Endovascular + Um balão inserido nas principais artérias após sua ruptura. Vai cortar o fluxo sanguíneo, mas vai parar o sangramento. + Stent Médico + Um tubo de plástico inserido na aorta depois do balão endovascular após uma ruptura da aorta. + Torniquete + Um dispositivo que aplica pressão a um membro e, assim, reduz o fluxo sanguíneo. Geralmente é usado em caso de grandes sangramentos nas extremidades. Não deve ser usado na cabeça. + Drenaguem Torácica + Drena o ar da cavidade pleural durante a cirurgia corretiva de pneumotórax. + Agulha + Uma agulha com uma válvula de descompressão para drenar o ar ou o líquido da cavidade pleural ou do pericárdio. + Soluto de Ringer + Uma solução de vários sais dissolvidos em água com a finalidade de tratar a pressão arterial baixa ou a perda de líquidos. Isotônico ao sangue. + Antisséptico + + Spray Antisséptico + + Propofol + Um medicamento de ação curta que resulta na diminuição do nível de consciência e falta de memória dos eventos. Seus usos incluem o início e a manutenção da anestesia geral. + Gesso + Um pó mineral fino que é usado para encapsular fraturas em extremidades com um molde. Aplique uma bandagem primeiro. + + + + + Bolsa de Sangue Vazia + Um pacote de sangue vazio para a doação de sangue. + Bolsa de Sangue O+ + Administrado para: O+, A+, B+, AB+ + Bolsa de Sangue O- + Um pacote de sangue que pode ser usado em qualquer paciente. + Bolsa de Sanguek A+ + Administrado para: A+, AB+ + Bolsa de Sangue B+ + Administrado para: B+, AB+ + Bolsa de Sangue AB+ + Administrado para: AB+ + Bolsa de Sangue A- + Administrado para: A-, A+, AB-, AB+ + Bolsa de Sangue B- + Administrado para: B-, B+, AB-, AB+ + Bolsa de Sangue AB- + Administrado para: AB-, AB+ + + Bolsa de Sangue O- + Um pacote de sangue que pode ser usado em qualquer paciente. + + Cartão de Doador de Sangue O- + Pode receber sangue de: O- +Pode dar sangue para: Todos tipos + Cartão de Doador de Sangue O+ + Pode receber sangue de: O-, O+ +Pode dar sangue para: O+, A+, B+, AB+ + Cartão de Doador de Sangue A- + Pode receber sangue de: O-, A- +Pode dar sangue para: A-, A+, AB-, AB+ + Cartão de Doador de Sangue A+ + Pode receber sangue de: O-, O+, A-, A+ +Pode dar sangue para: A+, AB+ + Cartão de Doador de Sangue B- + Pode receber sangue de: O-, B- +Pode dar sangue para: B-, B+, AB-, AB+ + Cartão de Doador de Sangue B+ + Pode receber sangue de: O-, O+, B-, B+ +Pode dar sangue para: B+, AB+ + Cartão de Doador de Sangue AB- + Pode receber sangue de: O-, A-, B-, AB- +Pode dar sangue para: AB-, AB+ + Cartão de Doador de Sangue AB+ + Pode receber sangue de: Todos tipos +Pode dar sangue para: AB+ + + Contêiner Médico + Pode armazenar medicamentos e instrumentos médicos. + Caixa de Equipamento Cirúrgico + Pode armazenar muitos itens pequenos que são usados ​​durante uma cirurgia. + Caixa Refrigerada + Um lugar para armazenar seus preciosos órgãos, prontos para transplante... né? + Contêiner Refrigerado + Um lugar para armazenar seus preciosos órgãos recém-tirados. + Saco para Cadáver + Permite arrastar pessoas mais rapidamente. + Bolsa de Estase + Impede que a maioria dos processos biológicos ocorra. + + Braço Direito + Um braço direito decepado. Pode ser reconectado cirurgicamente. + Braço Esquerdo + Um braço esquerdo decepado. Pode ser reconectado cirurgicamente. + Perna Direita + Uma perna direita decepada. Pode ser reconectada cirurgicamente. + Perna Esquerda + Uma perna esquerda decepada. Pode ser reconectada cirurgicamente. + Prótese Biônica do Braço Direito + Um braço direito biônico. Pode ser usado para tratar amputação. + Prótese Biônica do Braço Esquerdo + Um braço direito biônico. Pode ser usado para tratar amputação. + Prótese Biônica da Perna Direita + Uma perna direita biônica. Pode ser usado para tratar amputação. + Prótese Biônica da Perna Esquerda + Uma perna esquerda biônica. Pode ser usado para tratar amputação. + Transplante de Fígado + Transplante de Fígado + Transplante de Fígado + Transplante de Fígado + Transplante de Fígado + Transplante de Fígado + Transplante de Pulmão + Transplante de Pulmão + Transplante de Pulmão + Transplante de Pulmão + Transplante de Pulmão + Transplante de Pulmão + Transplante de Rim + Transplante de Rim + Transplante de Rim + Transplante de Rim + Transplante de Rim + Transplante de Rim + Transplante de Coração + Transplante de Coração + Transplante de Coração + Transplante de Coração + Transplante de Coração + Transplante de Coração + Transplante de Cérebro + Mão Direita Não Funcional + Mão Esquerda Não Funcional + + + + + + + + Frequência Cardíaca Elevada + O coração está batendo de forma alarmantemente rápida. + Arritmia Cardíaca + O coração está batendo de forma irregular. + Parada Cardíaca + Sem pulso. + Ataque Cardíaco + + Dano no Coração + + Insuficiência Cardíaca + + Coração Removido + O coração foi removido cirurgicamente. + + Neurotrauma + + Morte por neurotrauma. + Você morreu de neurotrauma. + Derrame + + Convulsão + + Coma + + Cérebro Removido + O cérebro foi removido cirurgicamente. + + Pressão Sanguínea + + Hipoxemia + + + Parada Respiratória + O paciente não está respirando. + Hiperventilação + O paciente está respirando a uma taxa alarmantemente rápida. + Hipoventilação + O paciente está respirando a uma taxa alarmantemente lenta. + Falta de Ar + A respiração do paciente é difícil e fraca. + Alcalose + + Acidose + + Lesão Pulmonar induzida por Radiação + + Pneumotórax + + Dano nos Pulmões + + Insuficiência Pulmonar + + Pulmões Removidos + Os pulmões foram removidos cirurgicamente. + + Dano nos Rins + + Falência Renal + + Rins Removidos + Os rins foram removidos cirurgicamente. + + Dano Ósseo + + Morte Óssea + + Crescimento Ósseo Estimulado + O crescimento ósseo foi estimulado. Para curar a morte óssea, essa aflição precisa estar em todas as partes do corpo. + + Dano no Fígado + + Insuficiência Hepática + + Fígado Removido + O fígado foi removido cirurgicamente. + + Incisão Cirúrgica + Uma incisão foi feita por um bisturi. + Sangamentro Estancado + Sangramentos cirúrgicos foram estancados. + Artéria Bloqueada por Balão + O sangramento da artéria foi interrompido, mas o fluxo sanguíneo para a extremidade está severamente reduzido. + Aorta Bloqueada por Balão + A aorta parou de sangrar, mas o fluxo sanguíneo para suas extremidades e órgãos desapareceu. + Tala + A fratura foi imobilizada. + Enfaixado + Protege da infecção, estabiliza as dislocações. O movimento é ligeiramente reduzido. + Bandagem Suja + Usado para proteger de infecções, mas agora faz o oposto. + Gesso + Cura e protege de fraturas. O movimento é reduzido. Remova usando tesouras médicas. + Pomada + Uma camada de gel antibiótico protege e limpa a ferida de qualquer germe. + Agulha + Normaliza a pressão na cavidade pleural. + + + Úmero Direito Fraturado + Seu braço direito está quebrado. + Úmero Esquerdo Fraturado + Seu braço esquerdo está quebrado. + Fêmur Direito Fraturado + Sua perna direita está quebrada. + Fêmur Esquerdo Fraturado + Sua perna esquerda está quebrada. + Costelas Fraturadas + Uma ou mais costelas estão quebradas. + Crânio Fraturado + Seu crânio está quebrado. + Pescoço Fraturado + Seu pescoço está quebrado. + Amputação Traumática + Grande parte do tecido do braço direito foi arrancado. + Amputação Traumática + Grande parte do tecido do braço esquerdo foi arrancado. + Amputação Traumática + Grande parte do tecido da perna direita foi arrancado. + Amputação Traumática + Grande parte do tecido da perna esquerda foi arrancado. + Amputação Traumática + Grande parte do tecido da cabeça foi arrancado. + Amputação + O braço direito foi amputado cirurgicamente. + Amputação + O braço esquerdo foi amputado cirurgicamente. + Amputação + A perna direita foi amputada cirurgicamente. + Amputação + A perna esquerda foi amputada cirurgicamente. + Amputação + A cabeça foi amputada cirurgicamente. + Lesão na Medula Espinal + O paciente fica paralisado e não sente o corpo. + Morreu de Paralisia + Você morreu de paralisia. + Dislocação + A articulação não devia estar dessa forma... + Dislocação + A articulação não devia estar dessa forma... + Dislocação + A articulação não devia estar dessa forma... + Dislocação + A articulação não devia estar dessa forma... + Sangramento na Artéria Femoral + Uma artéria foi danificada e está causando perda de sangue grave. + Sangramento na Artéria Femoral + Uma artéria foi danificada e está causando perda de sangue grave. + Sangramento na Artéria Braquial + Uma artéria foi danificada e está causando perda de sangue grave. + Sangramento na Artéria Braquial + Uma artéria foi danificada e está causando perda de sangue grave. + Ruptura da Aorta + Sangramento da Artéria Carótida + Uma artéria foi danificada e está causando perda de sangue grave. + Ferida Suturada + As feridas foram suturadas. + Imunidade + + Ferida Infectada + + Infeção Sanguínea + + Necrose + + Morreu de uma ferida necrótica. + Você morreu de necrose. + Gangrena + A extremidade encolheu e se tornou preta. + Adrenalina + + Anti-Coágulo + + Tiamina + + Soro Fisiológico + + Solução de Ringer + + Manitol + + Antibióticos + + Imunossupressores + + Choque de Hemotransfusão + + Corpo Estranho + + Tamponamento Cardíaco + + Sangramento Interno + + + Tosse + O paciente está tossindo periodicamente. + Palidez + A pele do paciente está pálida. + Tontura + O paciente está expressando tontura. + Visão Embaçada + O paciente está expressando visão turva. + Confusão + O paciente parece desorientado e confuso. + Dor de Cabeça + O paciente está expressando uma dor de cabeça. + Inchaço nas Pernas + As pernas do paciente estão inchadas. + Fraqueza + O paciente está expressando fraqueza nas extremidades. + Sibilo + A respiração do paciente está produzindo um assobio agudo. + Vômito + O paciente está vomitando periodicamente. + Vomitando Sangue + O paciente está vomitando sangue periodicamente. + Febre + A temperatura corporal do paciente está elevada. + Desconforto Abdominal + O paciente está expressando desconforto abdominal. + Inchaço + O abdômen do paciente está inchado. + Icterícia + A pele do paciente ficou com um tom de amarelo. + Suando + O paciente está suando excessivamente. + Palpitações + O paciente está expressando palpitações. + Inconsciência + O paciente está inconsciente. + Inflamação + A área está vermelha, inchada e quente. + Espasmo + O paciente não consegue controlar o comportamento do membro. + Dependência + O paciente está feliz o suficiente... desde que consiga o que quer. + Em chamas! + O paciente está queimando vivo! Pegue um extintor! + Dor no Peito + O paciente está expressando uma dor aguda e penetrante no peito. + Dor Abdominal + O paciente está expressando dor persistente em seu abdômen. + Dor Intensa + O paciente está expressando dor intensa na área afetada. + Náusea + A pele está úmida e o paciente está enjoado. + Falta de Lua + Lua não está rodando. Isso significa que neurotrauma e quaisquer outros mods que o usem não funcionarão. Por favor, leia as páginas da oficina de mods que você planeja usar. + Choque Traumático + O paciente sente dor intensa e estresse. + Analgesia + Insensibilidade à dor. + Anestesia + O paciente tem amnésia e sedação induzidas por drogas. + Queimadura de Primeiro Grau + A área é vermelha e causa dor ao toque. + Queimadura de Segundo Grau + Há bolhas muito dolorosas espalhadas pela área afetada. + Queimadura de Terceiro Grau + O paciente não sente dor na área, agora dura e sem pele. + + Incisão Cirúrgica + O paciente foi aberto. + Sangramento Estancado + Sangramento causado pela incisão foi parado. + Pele Retraída + A pele está sendo mantida aberta por um conjunto de afastadores. + Ossos Furados + Os ossos foram preparados para procedimentos ortopédicos. + Incisão Suturada + A incisão foi fechada através de suturas. + Ossos Serrados + O osso foi cortado. + + Vivo + Consciente + Nome_do_paciente + Vitalidade + Frequência_cardíaca + Taxa_de_respiração + Pressão_sanguínea + Oxigênação_no_Sangue + Neurotrauma + Danos_aos_Órgãos + Em_cirurgia + Causa_da_morte + Blood_pH + + Sala de Cirurgia + + \ No newline at end of file diff --git a/Neurotrauma/Localization/Russian/Russian.xml b/Neurotrauma/Localization/Russian/Russian.xml new file mode 100644 index 0000000..04d3d82 --- /dev/null +++ b/Neurotrauma/Localization/Russian/Russian.xml @@ -0,0 +1,162 @@ + + + + + Ручной дефибриллятор + Медицинское устройство, доставляющее к сердцу электрический разряд для стабилизации сердечной аритмии. Для использования необходима серьёзная медицинская подготовка. Используйте на пациентах с остановкой сердца + Автоматизированый внешний дефибрилятор + Медицинское устройство, автоматически доставляющее к сердцу электрический разряд для стабилизации сердечной аритмии. Не требует подготовки. Используйте на пациентах с остановкой сердца + Мешок амбу + Маска с мешковым клапаном, ручное устройство, обычно используемое для создания положительного лёгочного давления у пациентов, которые не дышат или дышат недостаточно. + АвтоПульс + Автоматизированный портативный питаемый от батарейки аппарат сердечно-легочной реанимации. + Гематологический анализатор + Анализатор крови. Полностью автоматический. Может использоваться для печати групп крови на пустых донорских картах + Пустая карта донора + Пустая карта донора. Используется гематологическим анализатором + Медицинские ножницы + Инструмент для снятия перевязок и гипса + Инвалидная коляска + Позволяет полагаться на свои руки, а не на ноги во время движения. + Синяя акула + + Сканер здоровья + Используется для выявления скрытых причин симптомов + + После надевания вы потеряете сознание. Вы уверены? + + + Скальпель + Операционный инструмент, используемый для создания надрезов. + Зажим + Операционный инструмент, используемый для зажатия кровотечения. + Расширитель + Операционный инструмент для оттягивания рассечённой кожи. + Полустерильный пинцет + Небольшой инструмент, позволяющий удалять как пули, так и затронутую некрозом ткань. + Хирургическая пила + Пила для распиливания костей. + Медицинские швы + Синтетические рассасывающиеся нити со встроенной иглой для зашивания как ран, так и хирургических надрезов. + Хирургическая дрель + Инструмент для просверливания кости. + Импланты для остеосинтеза + Титановые импланты для лечения переломов при остеосинтетических операциях. + Импланты позвоночного столба + Титановые импланты для лечения паралича, вызванного переломом шеи. + Операционный стол + Операционный стол со встроенным аппаратом искусственной вентиляции. + Скальпель для извлечения органов: Печень + Специализированный скальпель для удаления печени. + Скальпель для извлечения органов: Почки + Специализированный скальпель для удаления почек. + Скальпель для извлечения органов: Лёгкие + Специализированный скальпель для удаления лёгких. + Скальпель для извлечения органов: Сердце + Специализированный скальпель для удаления сердца. + Скальпель для извлечения: мозг + Специализированный скальпель для удаления мозга. + Универсальный скальпель + Передовой скальпель. Выключен и требует активации. В руках практикующего врача, кнопочная панель может использоваться для активации режимов и переключения между операциями: выполнением надрезов, извлечением органов, снятием повязок или совершением зловредной практики. + Активный режим: Хирургический надрез. + Активный режим: Извлечь почки + Активный режим: Извлечь печень + Активный режим: Извлечь легкие + Активный режим: Извлечь сердце + Активный режим: Извлечь мозг + Активный режим: Снять бинт, гипсовый слепок, небрежная практика. + Активный режим: Адаптивное извлечение органов. Применение на голове извлекает мозг, левая рука - почки, торс - печень, правая рука - сердце, левая нога - легкие. + Надрез + Почки + Печень + Легкие + Сердце + Мозг + Бинт, гипсовые слепки, небрежная практика + Адаптивное извлечение органов + + Маннитол + Тип сахарного спирта. Используется для облегчения восстановления от нейротравм. Может нанести урон органам. + Азатиоприн + Иммунодепрессант для профилактики отторжения органов. + Антибиотическая мазь + Гель с мощными антисептическими свойствами, помогает в восстановлении после ожогов так же хорошо, как и от инфицирования. + Эндоваскулярный баллон + Баллон, вставляемый в крупные артерии при их разрыве. Это остановит как кровоток, так и кровотечение. + Медицинский стент + Пластиковая трубка, вставляемая после эндоваскулярного баллона при разрыве аорты. + Жгут + Устройство, сдавливающее часть тела, ограничивая кровоток. Обычно используется при обильных кровотечениях из конечностей. Не рекомендуется применять к голове. + Дренаж + Удаляет воздух из плевральной полости во время корректирующей операции при пневмотораксе. + Игла + Игла с декомпрессионным клапаном для удаления жидкости или воздуха из плевральной полости или перикарда + Раствор Рингера + Водный раствор нескольких солей, предназначенный для лечения низкого кровяного давления или потери жидкости. Изотоничен крови. + Антисептик + Используется для лечения заражения ран, распыляя его при помощи антисептического спрея. + Антисептический спрей + Используется для нанесения антисептика на зараженные раны. + Пропофол + Препарат кратковременного действия, приводящий к депривации сознания и вызывающий потерю памяти о произошедших событиях. Использования включают в себя введение в общую анестезию и её поддержание. + Гипс + Мелкозернистый минеральный порошок, используемый для покрытия и фиксации переломов конечностей. Сначала наложите бинт. + Гелевый охладительный пакет + Многоразовый охлаждающий пакет с органическим гелем. Теряет эффективность охлаждающего действия вне холодильника. + + + + Пустой пакет для крови + Пустой пакет для забора крови. + Пакет с кровью O+ + Можно переливать: O+, A+, B+, AB+ + Пакет с кровью O- + Пакет с кровью, подходящей любому пациенту. + Пакет с кровью A+ + Можно переливать: A+, AB+ + Пакет с кровью B+ + Можно переливать: B+, AB+ + Пакет с кровью AB+ + Можно переливать: AB+ + Пакет с кровью A- + Можно переливать: A-, A+, AB-, AB+ + Пакет с кровью B- + Можно переливать: B-, B+, AB-, AB+ + Пакет с кровью AB- + Можно переливать: AB-, AB+ + + Пакет с кровью O- + Пакет с кровью, подходящей любому пациенту. + + Карточка донора O- + Может получать кровь типов: O- +Может быть донором для любого типа + Карточка донора O+ + Может получать кровь типов: O-, O+ +Может быть донором для: O+, A+, B+, AB+ + Карточка донора A- + Может получать кровь типов: O-, A- +Может быть донором для: A-, A+, AB-, AB+ + Карточка донора A+ + Может получать кровь типов: O-, O+, A-, A+ +Может быть донором для: A+, AB+ + Карточка донора B- + Может получать кровь типов: O-, B- +Может быть донором для: B-, B+, AB-, AB+ + Карточка донора B+ + Может получать кровь типов: O-, O+, B-, B+ +Может быть донором для: B+, AB+ + Карточка донора AB- + Может получать кровь типов: O-, A-, B-, AB- +Может быть донором для: AB-, AB+ + Карточка донора AB+ + Может получать кровь любого типа +Может быть донором для: AB+ + + Медицинский контейнер + Может хранить препараты и медицинские инструменты + Ящик для хирургических инструментов + Может вмещать в себя маленькие предметы для хирургии  + +Холодильный ящикМесто для хранения ваших драгоценных готовых к трансплантации органовХолодильный контейнерМесто для хранения ваших драгоценных готовых к трансплантации органовМешок для трупаПозволяет перемещать тела быстрее.Стазис-мешокПриостанавливает большинство биохимических процессов.Правая рукаОтсечённая правая рука. Может быть пришита обратно посредством операции.Левая рукаОтсечённая левая рука. Может быть пришита обратно посредством операции.Правая ногаОтсечённая правая нога. Может быть пришита обратно посредством операции.Левая ногаОтсечённая левая нога. Может быть пришита обратно посредством операции.Бионический протез правой рукиБионическая правая рука. Устанавливается взамен ампутированнойБионический протез левой рукиБионическая левая рука. Устанавливается взамен ампутированной.Бионический протез правой ногиБионическая правая нога. Устанавливается взамен ампутированной.Бионический протез левой ногиБионическая левая нога. Устанавливается взамен ампутированной.ПеченьПеченьПеченьПеченьПеченьПеченьЛёгкоеЛёгкоеЛёгкоеЛёгкоеЛёгкоеЛёгкоеПочкаПочкаПочкаПочкаПочкаПочкаСердцеСердцеСердцеСердцеСердцеСердцеМозгНерабочая правая рукаНерабочая левая рукаdУскоренное сердцебиениеСердце бьётся с тревожно высокой скоростью.ФибрилляцияСердце сокращается быстро, слабо и обрывисто.Остановка сердцаНет пульса.Сердечный приступПовреждение сердцаОтказ сердцаСердце удаленоСердце хирургически удалено.НейротравмaСмерть от нейротравмыВы умерли от нейротравмы.ИнсультПрипадокКомаМозг удалёнМозг хирургически удалёнТравматический шокОперации проводятся не так! Совсем не так!Кровяное давлениеГипоксемияОстановка дыханияПациент не дышит.ГипервентиляцияПациент дышит в тревожно быстром темпе.ГиповентиляцияПациент дышит в тревожно медленном темпе.Сбивчивое дыханиеДыхание пациента затруднено и поверхностноАлкалозАцидозРадиационное поражение легкихПневмотораксПовреждение лёгкихОтказ лёгкихУдалённые лёгкиеЛёгкие хирургически удалены.Повреждение почекОтказ почекУдалённые почкиПочки хирургически удалены.Повреждения костных тканейСмерть костных тканейСтимулированный рост костейПростимулированное отрастание костей. Для лечения умерших костей, этот эффект должен быть на каждой части тела.Повреждение печениОтказ печениПечень удаленаПечень хирургически удалена.Хирургический надрезСделанный скальпелем разрез.Прижатое кровотечениеХирургическое кровотечение сдержано.Сжатые артерииАртериальное кровотечение остановлено, приток крови к конечности значительно снизилсяЗакупореная баллоном аортаАортальное кровотечение остановлено, нет притока к конечностям и органам.ШинаНа перелом наложена шина.ПеревязкаЗащищает от инфицирования, стабилизирует вывихи и переломыГрязный бинтРанее защищавший от инфекций, теперь бинт может послужить их причинойГипсовый слепокЛечит и защищает от переломов. Замедляет движение. Удалять с помощью медицинских ножниц.МазьСлой антибиотической мази защищает от заражения и сохраняет рану стерильной.ИглаНормализует давление в плевральной полостиОхлажденоЛечит сильные ушибы. Замедляет движение.Перелом правой плечевой костиВаша правая рука сломана.Перелом левой плечевой костиВаша левая рука сломана.Перелом правой бедренной костиВаша правая нога сломана.Перелом левой бедренной костиВаша левая нога сломана.Сломанные рёбраОдно или более рёбер сломаны.Перелом черепаВаш череп сломан.Перелом шеиВаша шея сломана.Травматическая ампутацияБольшая часть тканей правой руки была оторванаТравматическая ампутацияБольшая часть тканей левой руки была оторванаТравматическая ампутацияБольшая часть тканей правой ноги была оторванаТравматическая ампутацияБольшая часть тканей левой ноги была оторванаТравматическая ампутацияБольшая часть тканей головы была оторванаАмпутацияПравая рука хирургически ампутирована.АмпутацияЛевая рука хирургически ампутирована.АмпутацияПравая нога хирургически ампутирована.АмпутацияЛевая нога хирургически ампутирована.АмпутацияГолова хирургически ампутирована.Травма позвоночного столбаПациент парализован и не чувствует своё тело.Умер от параличаВы умерли от паралича.ВывихСустав должен гнуться в другую сторону...ВывихСустав должен гнуться в другую сторону...ВывихСустав должен гнуться в другую сторону...ВывихСустав должен гнуться в другую сторону...Кровотечение из бедренной артерииАртерия повреждена и вызывает серьёзное кровотечение.Кровотечение из бедренной артерииАртерия повреждена и вызывает серьёзное кровотечение.Кровотечение из плечевой артерииАртерия повреждена и вызывает серьёзное кровотечение.Кровотечение из плечевой артерииАртерия повреждена и вызывает серьёзное кровотечение.Аортальное кровотечениеКровотечение из сонной артерииАртерия повреждена и вызывает серьёзное кровотечение.Зашитая ранаРана была зашита.ИммунитетЗаражённая ранаСепсисНекрозВы умерли от некроза раны.Вы умерли от некроза раны.ГангренаКонечность усохла и почернела.АдреналинФизрастворРаствор РингераМаннитолАнтибиотикиИммунодепрессантыИммунитет подавляется иммунодепресантамиГемотрансфузионный шокИнородное телоСердечная тампонадаВнутреннее кровотечениеКашельПациент периодически кашляет.Бледная кожаКожа пациента неестественно бледна.ГоловокружениеПациент испытывает головокружение.Размытое зрениеЗрение пациента размыто.Спутанность сознанияПациент дизориентирован, сознание спутанно.Головная больПациент испытывает головную боль.Отёк ногСлабостьПациент отмечает слабость в конечностях.Свистящие хрипыПациентом при дыхании издаётся громкий шумРвотаПациента периодически рвёт.Рвота с кровьюПациента периодически рвёт кровью.ЛихорадкаУ пациента высокая температура тела.Дискомфорт в животеПациент отмечает дискомфорт в животе.ВздутиеЖивот пациента вздут.ЖелтухаКожа пациента окрасилась в болезненно жёлтый цвет.ПотеетПациент усиленно потеет.ТреморПациент отмечает дрожь.Без сознанияПациент без сознания.ВоспалениеОбласть покрасневшая, тёплая и отёкшая.СпазмПациент не контроллирует поведение конечности.ЛомкаПациент вполне счастлив... пока получает то, что хочет.Горит!Пациент горит заживо! Тащите огнетушитель!Боль в грудиПациент испытывает острую, пронзительную боль в груди.Боль в животеПациент отмечает сохраняющуюся боль в животе.Сильная больПациент отмечает сильную боль в этой области.ТошнотаКожа липкая, пациента тошнит.Без LuaLua не работает. Это значит, что Нейротравма и прочие модификации, использующие Lua не будут функционировать. Для инструкции по установке прочитайте страницу в Мастерской для Lua for Barotrauma.АнальгезияНечувствительность к болиАнестезияУ пациента медикаментозная амнезия.Ожог первой степениОбласть покраснела и болит при нажатии.Ожог второй степениНа пораженном участке появляются очень болезненные волдыри.Ожог третьей степениКожа погрубела и потеряла чувствительностьХирургический надрезПациент вскрыт.Прижатое кровотечениеХирургическое кровотечение сдержано.РасширительКожа удерживается открытой при помощи расширителя.Просверленные костиКости подготовлены к ортопедическим операциям.Зашитый надрезНадрез закрыт швами.Кость распиленаКость отделена.ЖивВ сознанииИмя_пациентаЗдоровьеЧастота_сердцебиенияСкорость_дыханияКровяное_давлениеНасыщенность_крови_кислородомНейротравмаУрон_органамОперируетсяПричина_смертиpH_КровиОперационнаяСтрептокиназаТромболитический фермент, разжижающий сгустки крови. Применяется для лечения сердечных приступов. Ухудшает свёртываемость кровиТиаминТакже известный как витамин B1, этот препарат способствуют восстановлению органовРазжижение тромбовТиаминНитропруссид натрияПрепарат, применяющийся для снижения артериального давления.Стартовый медицинский наборЯщик, в котором есть всё необходимое, и легко собираемый единственным крафтом \ No newline at end of file diff --git a/Neurotrauma/Localization/Spanish/Spanish.xml b/Neurotrauma/Localization/Spanish/Spanish.xml new file mode 100644 index 0000000..dbe0809 --- /dev/null +++ b/Neurotrauma/Localization/Spanish/Spanish.xml @@ -0,0 +1,520 @@ + + + + + Disfibrilador Manual + Un dispositivo médico que administra una descarga eléctrica al corazón para estabilizar las arritmias cardíacas. Requiere una amplia formación médica. Usar en un paciente con paro cardíaco. + Desfibrilador externo automatico + Un dispositivo médico que administra una descarga eléctrica al corazón para estabilizar las arritmias cardíacas. Requiere poca o ninguna formación médica. Usar en un paciente con paro cardíaco. + Bolsa Ambú + Una máscara con válvula de bolsa (MVB) es un dispositivo portátil que se usa comúnmente para proporcionar ventilación con presión positiva a pacientes que no respiran o que no respiran adecuadamente. + Auto Pulso + Un dispositivo de reanimación cardiopulmonar automático, portátil y alimentado por batería. + Analizador hematológico + analizador de sangre Completamente automatizado. Puede imprimir tipos de sangre en tarjetas de donantes en blanco. + Tarjeta de donante en blanco + Tarjeta de donacion vacía. Usada en el Analizador hematológico. + Tijeras para traumatismos + Una herramienta utilizada para quitar vendajes y yesos.. + Silla de Ruedas + Te hace dependiente de tus brazos en vez de tus piernas para moverte. + Tiburón azul + + Escáner de Salud + Se utiliza para diagnosticar las causas subyacentes de los síntomas. + + Equipar esto hará que quedes inconsciente. ¿Está seguro? + + Bisturí + Herramienta que se usa para hacer incisiones durante una cirugía. + Hemostato + Herramienta que se utiliza para pinzar vasos sanguíneos durante una cirugía. + Retractores de piel + Herramienta utilizada para retraer la piel durante una cirugía. + Pinzas + Una pequeña herramienta que permite la extracción de balas, así como tejido dañado y necrótico. + sierra quirúrgica + Herramienta que se usa para cortar huesos. + Sutura + Suturas biodegradables para coser heridas e incisiones quirúrgicas por igual. + Taladro Quirúrgico + Herramienta utilizada para taladrar huesos. + Implantes de osteosíntesis + Implantes de titanio utilizados en una cirugía osteosintética para reparar fracturas. + Implantes de médula espinal + Implantes de titanio utilizados para curar la parálisis causada por fracturas de cuello. + Mesa de cirugía + Una mesa de cirugía que tiene ventilación artificial básica incorporada. + Bisturí de obtención de órganos: Hígado + Un bisturí especializado para la extracción de hígados.. + Bisturí de obtención de órganos: Riñones + Un bisturí especializado para la extracción de riñones.. + Bisturí de obtención de órganos: Pulmones + Un bisturí especializado para la extracción de los pulmones. + Bisturí de obtención de órganos: Corazón + Un bisturí especializado para la extracción del corazón. + Bisturí de obtención de órganos: Cerebro + Un bisturí especializado para la extracción del cerebro. + + + manitol + Un tipo de alcohol de azúcar. se utiliza para ayudar a la recuperación de un neurotrauma. Puede causar daño a los órganos. + Estreptoquinasa + Una enzima trombolítica que descompone los coágulos de sangre. Se utiliza para curar los ataques al corazón. Disminuye la coagulación de la sangre. + Azatioprina + Un agente inmunosupresor para la prevención del rechazo de órganos. + Tiamina + También conocidas como vitamina B1, estas píldoras ayudarán en la curación de órganos. + Ungüento antibiótico + Gel altamente antiséptico que favorece la recuperación tanto de quemaduras como de infecciones menores. + Balón endovascular + Un globo insertado en las arterias principales después de su ruptura. Cortará el flujo de sangre, pero detendrá el sangrado. + Stent médico + Un tubo de plástico insertado en la aorta después de un balón endovascular luego de una ruptura aórtica. + Torniquete + Un dispositivo que aplica presión a una extremidad y, por lo tanto, reduce el flujo sanguíneo. Suele utilizarse en caso de hemorragias importantes en las extremidades. No debe usarse en la cabeza. + Drenaje + Drena el aire de la cavidad pleural durante la cirugía correctiva del neumotórax. + Aguja + Una aguja con una válvula de descompresión para hacer que el aire o el líquido salgan de la cavidad pleural o del pericardio. + Solución de Ringer + Una solución de varias sales disueltas en agua con el fin de tratar la presión arterial baja o la pérdida de líquidos. Isotónico a la sangre. + Antiséptico + + Aerosol antiséptico + + Propofol + Un medicamento de acción corta que resulta en una disminución del nivel de conciencia y falta de memoria para los eventos. Sus usos incluyen el inicio y mantenimiento de la anestesia general. + Yeso + Polvo mineral fino que se utiliza para enyesar fracturas en las extremidades. Aplique un vendaje primero. + + + + + Paquete de sangre vacío + Un paquete de sangre vacío para la extracción de sangre. + Paquete de sangre O+ + Administrable a: O+, A+, B+, AB+ + Paquete de sangre O- + Una bolsa de sangre que se puede utilizar en cualquier paciente. + Paquete de sangre A+ + Administrable a: A+, AB+ + Paquete de sangre B+ + Administrable a: B+, AB+ + Paquete de sangre AB+ + Administrable a: AB+ + Paquete de sangre A- + Administrable a: A-, A+, AB-, AB+ + Paquete de sangre B- + Administrable a: B-, B+, AB-, AB+ + Paquete de sangre AB- + Administrable a: AB-, AB+ + + Paquete de sangre O- + Un paquete de sangre que se puede utilizar en cualquier paciente. + + Tarjeta de donante O- + Puede tomar sangre de: O- +Puede dar sangre a: todos. + Tarjeta de donante O+ + Puede tomar sangre de: O-, O+ +Puede dar sangre a: O+, A+, B+, AB+. + Tarjeta de donante A- + Puede tomar sangre de: O-, A- +Puede dar sangre a: A-, A+, AB-, AB+. + Tarjeta de donante A+ + Puede tomar sangre de: O-, O+, A-, A+ +Puede dar sangre a: A+, AB+. + Tarjeta de donante B- + Puede tomar sangre de: O-, B- +Puede dar sangre a: B-, B+, AB-, AB+. + Tarjeta de donante B+ + Puede tomar sangre de: O-, O+, B-, B+ +Puede dar sangre a: B+, AB+ + Tarjeta de donante AB- + Puede tomar sangre de: O-, A-, B-, AB- +Puede dar sangre a: AB-, AB+. + Tarjeta de donante AB+ + Puede tomar sangre de: todos +Puede dar sangre a: AB+ + + Contenedor medico + Puede almacenar medicamentos e instrumentos médicos. + Caja de herramientas de cirugía + Puede almacenar muchos artículos pequeños que se usan durante la cirugía. + Caja refrigerada + Un lugar para almacenar sus preciados órganos listos para trasplante. + Contenedor refrigerado + A place to store your precious transplant-ready organs. + Bolsa para cadáveres + Te permite arrastrar personas más rápido. + bolsa de estasis + Impide que se lleven a cabo la mayoría de los procesos biológicos. + + Brazo derecho + Un brazo derecho amputado. Se puede volver a colocar quirúrgicamente. + Brazo izquierdo + Un brazo izquierdo amputado. Se puede volver a colocar quirúrgicamente. + Pierna derecha + Una pierna derecha amputada. Se puede volver a colocar quirúrgicamente. + Pierna izquierda + Una pierna izquierda cercenada. Se puede volver a colocar quirúrgicamente. + Prótesis biónica del brazo derecho + Un brazo derecho biónico. Se puede utilizar para tratar la amputación. + Prótesis biónica del brazo izquierdo + Un brazo izquierdo biónico. Se puede utilizar para tratar la amputación. + Prótesis biónica de pierna derecha + Una pierna derecha biónica. Se puede utilizar para tratar la amputación. + Prótesis biónica de pierna izquierda + Una pierna izquierda biónica. Se puede utilizar para tratar la amputación. + Trasplante de hígado + Trasplante de hígado + Trasplante de hígado + Trasplante de hígado + Trasplante de hígado + Trasplante de hígado + Trasplante de pulmón + Trasplante de pulmón + Trasplante de pulmón + Trasplante de pulmón + Trasplante de pulmón + Trasplante de pulmón + Transplante de riñón + Transplante de riñón + Transplante de riñón + Transplante de riñón + Transplante de riñón + Transplante de riñón + Transplante de corazón + Transplante de corazón + Transplante de corazón + Transplante de corazón + Transplante de corazón + Transplante de corazón + Trasplante de cerebro + Mano derecha que no funciona + Mano izquierda que no funciona + + + + + + + + Aumento de la frecuencia cardíaca + El corazón late de una manera alarmantemente rápida. + Latido del corazón irregular + El corazón late de forma agitada y temblorosa. + Paro cardiaco + Sin pulso. + Ataque al corazón + + Daño al corazón + + Insuficiencia cardiaca + + Corazón extirpado + El corazón ha sido extirpado quirúrgicamente. + + Neurotrauma + + Muerte por neurotrauma + Has muerto de neurotrauma. + Derrame cerebral + + Convulsion + + Coma + + Cerebro removido + El cerebro ha sido extirpado quirúrgicamente. + + Presión arterial + + Hipoxemia + + + Paro respiratorio + El paciente no está respirando. + Hiperventilación + El paciente está respirando a un ritmo alarmantemente rápido. + Hipoventilación + El paciente está respirando a un ritmo alarmantemente lento. + Dificultad para respirar + La respiración del paciente es trabajosa y superficial. + Alcalosis + + Acidosis + + Lesión pulmonar inducida por radiación + + Neumotórax + + daño pulmonar + + insuficiencia pulmonar + + Pulmones extirpados + Los pulmones han sido extirpados quirúrgicamente. + + Daño en el riñón + + Insuficiencia renal + + Riñones extirpados + Los riñones han sido extirpados quirúrgicamente. + + Daño óseo + + Muerte ósea + + Crecimiento óseo estimulado + Se ha estimulado el crecimiento óseo. Para curar la muerte ósea, esta aflicción debe estar en todas las partes del cuerpo. + + Daño hepático + + Insuficiencia hepática + + Hígado extirpado + El hígado ha sido extirpado quirúrgicamente. + + Incisión de cirugía + Se ha hecho una incisión con un bisturí. + Sangrado pinzado + Los sangrados quirúrgicos han sido restañados. + Arterias pinzadas + Se ha detenido el sangrado de la arteria, pero el flujo de sangre a la extremidad se reduce severamente. + Aorta hinchada + La aorta ha dejado de sangrar, pero el flujo de sangre a sus extremidades y órganos se ha ido. + Entablillar + La fractura ha sido entablillada. + Vendado + Protege de infecciones, estabiliza dislocaciones. El movimiento se ralentiza ligeramente. + vendaje sucio + Solía proteger de infecciones, pero ahora hace lo contrario. + Escayola + Cura y protege de fracturas. El movimiento se ralentiza. Retire con tijeras para traumatismos. + Ungüento + Una capa de gel antibiótico protege y limpia la herida de cualquier germen. + Aguja + Normaliza la presión en la cavidad pleural + + + Húmero derecho fracturado + Tu brazo derecho está roto. + Húmero izquierdo fracturado + Tu brazo izquierdo está roto. + Fémur derecho fracturado + Tu pierna derecha está rota. + Fémur izquierdo fracturado + Tu pierna izquierda está rota. + Costillas fracturadas + Una o más de sus costillas están rotas. + Cráneo fracturado + Tu cráneo está roto. + Cuello fracturado + Tu cuello está roto. + amputación traumática + La mayor parte del tejido del brazo derecho fue arrancado. + amputación traumática + La mayor parte del tejido del brazo izquierdo fue arrancado. + amputación traumática + La mayor parte del tejido de la pierna derecha fue arrancado. + amputación traumática + La mayor parte del tejido de la pierna izquierda fue arrancado. + amputación traumática + La mayor parte del tejido de la cabeza fue arrancado. + Amputación + El brazo derecho fue amputado quirúrgicamente. + Amputación + El brazo izquierdo fue amputado quirúrgicamente. + Amputación + La pierna derecha fue amputada quirúrgicamente. + AAmputación + La pierna izquierda fue amputada quirúrgicamente. + Amputación + La cabeza fue amputada quirúrgicamente. + Lesión de la médula espinal + El paciente está paralizado y no siente el cuerpo. + Murió de parálisis + Has muerto de parálisis. + Dislocación + No se supone que la articulación se doble de esta manera... + Dislocación + No se supone que la articulación se doble de esta manera... + Dislocación + No se supone que la articulación se doble de esta manera... + Dislocación + No se supone que la articulación se doble de esta manera... + Sangrado de la arteria femoral + Una arteria ha sido dañada y está causando una pérdida de sangre severa. + Sangrado de la arteria femoral + Una arteria ha sido dañada y está causando una pérdida de sangre severa. + Sangrado de la arteria braquial + Una arteria ha sido dañada y está causando una pérdida de sangre severa. + Sangrado de la arteria braquial + Una arteria ha sido dañada y está causando una pérdida de sangre severa.. + Ruptura aórtica + Sangrado de la arteria carótida + Una arteria ha sido dañada y está causando una pérdida de sangre severa. + Herida cosida + Las heridas han sido suturadas. + Inmunidad + + Herida infectada + + Septicemia + + Necrosis + + Murió de una herida necrótica. + Has muerto de necrosis. + Gangrena + La extremidad se ha encogido y se ha vuelto negra. + Adrenalina + + Anticoagulante + + Tiamina + + Salina + + Solución de Ringer + + Manitol + + Antibióticos + + Inmunosupresores + + Choque de hemotransfusión + + Cuerpo extraño + + Taponamiento cardíaco + + Hemorragia interna + + + Tos + El paciente está tosiendo periódicamente. + Piel pálida + La piel del paciente es pálida. + Aturdimiento + El paciente está expresando aturdimiento. + Visión borrosa + El paciente está expresando visión borrosa. + Confusión + El paciente parece desorientado y confundido. + Dolor de cabeza + El paciente está expresando un dolor de cabeza. + Hinchazón de la pierna + Las piernas del paciente están hinchadas. + Debilidad + El paciente está expresando debilidad en las extremidades. + Sibilancias + La respiración del paciente produce un ruido agudo. + Vómitos + El paciente está vomitando periódicamente. + Vómitos de sangre + El paciente está vomitando sangre periódicamente. + Fiebre + La temperatura corporal del paciente está elevada. + Malestar abdominal + El paciente está expresando molestias abdominales. + hinchazón + El abdomen del paciente está hinchado. + Ictericia + La piel del paciente se ha vuelto de un enfermizo tono amarillo. + Transpiración + El paciente está sudando excesivamente. + palpitaciones + El paciente está expresando palpitaciones. + Inconsciencia + El paciente está inconsciente. + Inflamación + El área está roja, hinchada y caliente. + Espasmo + El paciente no puede controlar el comportamiento errático de la extremidad. + Mono + El paciente es lo suficientemente feliz... siempre y cuando obtenga lo que necesita. + ¡En llamas! + ¡El paciente se está quemando vivo! ¡Coge un extintor! + Dolor de pecho + El paciente expresa un dolor agudo y penetrante en el pecho. + Dolor abdominal + El paciente está expresando dolor persistente en su abdomen. + Dolor Intenso + El paciente expresa dolor intenso en la zona afectada. + Náuseas + La piel está húmeda y el paciente tiene náuseas. + Sin lua + Lua no está corriendo. Eso significa que neurotrauma y cualquier otra modificación que lo use no funcionará. Lea las páginas del taller de las modificaciones que planea usar. + Choque traumático + El paciente experimenta dolor intenso y estrés. + Analgesia + Insensibilidad al dolor. + Anestesia + El paciente tiene amnesia y sedación inducida por fármacos. + Quemadura de primer grado + El área está roja y dolorosa al tacto. + Quemadura de segundo grado + Hay ampollas muy dolorosas que ensucian el área afectada. + Quemadura de tercer grado + El paciente no siente dolor en el área ahora correosa y rígida. + + Incisión de cirugía + El paciente ha sido abierto. + Sangrado pinzado + Se ha detenido el sangrado causado por la incisión. + Piel retraída + La piel se mantiene abierta mediante un conjunto de retractores. + Huesos perforados + Los huesos han sido preparados para procedimientos ortopédicos. + Incisión cosida + Se ha cerrado una incisión con suturas. + Huesos aserrados + El hueso ha sido cortado. + + Vivo + Consciente + Nombre_del_paciente + Vitalidad + RitmoCardiaco + FrecuenciaRespiratoria + PresiónArterial + Oxígeno_en_sangre + Neurotrauma + Daño_de_órganos + En_cirugia + Causa_de_la_muerte + Sangre_pH + + Quirúrgico + + Reductores de presión sanguínea + Nitroprusiato de sodio + Medicamento que se usa para bajar la presión sanguínea + Caja de inicio médica + Una caja que contiene todos los elementos esenciales, convenientemente empaquetados en una sola receta de elaboración. + \ No newline at end of file diff --git a/Neurotrauma/Localization/Turkish/Turkish.xml b/Neurotrauma/Localization/Turkish/Turkish.xml new file mode 100644 index 0000000..eed5528 --- /dev/null +++ b/Neurotrauma/Localization/Turkish/Turkish.xml @@ -0,0 +1,520 @@ + + + + + Manuel Defibrilatör + Kardiyak aritmileri stabilize etmek için kalbe elektrik şoku veren tıbbi bir cihaz. Kapsamlı tıp eğitimi gerektirir. + Otomatik Harici Defibrilatör + Kardiyak aritmileri stabilize etmek için kalbe elektrik şoku veren tıbbi bir cihaz. Kullanımı için herhangi bir eğitime ihtiyaç yoktur. + Ambu Torbası + Balon Valf Maskesi (BVM), nefes almayan veya yeterince nefes almayan hastalara pozitif basınçlı ventilasyon sağlamak için yaygın olarak kullanılan bir cihazdır. + Otopulse + Otomatik, taşınabilir, pille çalışan bir kardiyopulmoner canlandırma cihazı. + Hematoloji Analizörü + Kan analizcisi. Tam otomatik. Boş bağış kartlarına kan gruplarını yazdırabilir. + Boş Bağış Kartı + Boş bağışçı kartı. Hematoloji analizörü tarafından kullanılır. + Travma Makası + Bandaj ve alçıları kesmek için kullanılan bir alet. + Tekerlekli Sandalye + Hareket için bacaklarınız yerine kollarınıza bağımlı olmanızı sağlar. + Mavi köpek balığı + + Sağlık Tarayıcısı + Semptomların altında yatan nedenleri teşhis etmek için kullanılır. + + Bunu kuşanmak bilincini kaybetmene neden olacak. Emin misin? + + Neşter + Ameliyat sırasında kesi yapmak için kullanılan bir alet. + Hemostat + Ameliyat sırasında kan damarlarını sıkıştırmak için kullanılan bir alet. + Deri retraktörü + Ameliyat sırasında deriyi açmak kullanılan bir alet. + Cımbız + Mermilerin yanı sıra hasarlı ve nekrotik dokuların çıkarılmasını sağlayan küçük bir alet. + Cerrahi testere + Kemikleri kesmek için kullanılan bir alet. + Sütür + Yaraları ve cerrahi insizyonları dikmek için biyolojik olarak parçalanabilen sütürler. + Cerrahi Matkap + Kemikleri delmeye yarayan alet. + Osteosentez implantları + Osteosentetik cerrahide kırıkları onarmak için kullanılan titanyum implantlar. + Omurilik implantları + Boyun kırıklarının neden olduğu felçleri iyileştirmek için kullanılan titanyum implantlar. + Ameliyat Masası + Yerleşik temel yapay havalandırmaya sahip bir ameliyat masası. + Organ tedarik neşteri: Karaciğer + Karaciğer dokusunu kesmek için özel üretilen neşter. + Organ tedarik neşteri:Böbrek + Böbrek dokusunu kesmek için özel üretilen neşter.. + Organ Tedarik Neşteri:Akciğer + Akciğer dokusunu kesmek için özel üretilen neşter. + Organ Tedarik Neşteri: Kalp + Kalp dokusunu kesmek için özel üretilen neşter. + Organ Tedarik Neşteri: Beyin + Beyin dokusunu kesmek için özel üretilen neşter. + + + Mannitol + Bir çeşit şeker alkolü. Nörotravmadan iyileşmeye yardımcı olmak için kullanılır. Organ hasarına neden olabilir. + Streptokinaz + Kan pıhtılarını parçalayan trombolitik bir enzim. Kalp krizlerini tedavi etmek için kullanılır. Kan pıhtılaşmasını azaltır. + Azatioprin + Organ reddinin önlenmesi için bir immünosupresif ajan. + Tiyamin + Aksi halde B1 vitamini olarak bilinen bu haplar organ iyileşmesine yardımcı olacaktır. + Antibiyotik Merhem + Yanıkların yanı sıra küçük enfeksiyonlardan iyileşmeyi destekleyen oldukça antiseptik bir jel. + Endovasküler + Yırtılmalarının ardından büyük arterlere yerleştirilen bir balon. Kan akışını kesecek, ancak kanamayı durduracaktır. + Medikal stent + Aort yırtılmasını takiben endovasküler balondan sonra aorta yerleştirilen plastik bir tüp. + Turnike + Bir uzva basınç uygulayan ve böylece kan akışını azaltan bir cihaz. Genellikle ekstremitelerde majör kanamalarda kullanılır. Baş bölgesinde kullanılmamalıdır. + Drainage + Pnömotoraks için düzeltici cerrahi sırasında plevral boşluktan havayı boşaltır. + Dekompresyon İğnesi + Plevral boşluktan veya perikarddan hava veya sıvının boşalmasını sağlamak için dekompresyon valfli bir iğne + Ringer Çözeltisi + Düşük kan basıncını veya sıvı kaybını tedavi etmek amacıyla suda çözülmüş birkaç tuzun bir çözeltisi. Kan için izotonik. + Antiseptik + + Antiseptik Sprey + + Propofol + Bilinç düzeyinde azalmaya ve olaylar için hafıza eksikliğine neden olan kısa etkili bir ilaç. Kullanımları genel anestezinin başlatılması ve sürdürülmesini içerir. + Alçıtaşı + Bir alçıda uç kısımlardaki kırıkları kapatmak için kullanılan ince bir mineral tozu. Önce bir bandaj uygulayın. + + + + + Empty Blood Pack + An empty blood pack for the drawing of blood. + Blood Pack O+ + Administerable to: O+, A+, B+, AB+ + Blood Pack O- + A blood pack that can be used on any patient. + Blood Pack A+ + Administerable to: A+, AB+ + Blood Pack B+ + Administerable to: B+, AB+ + Blood Pack AB+ + Administerable to: AB+ + Blood Pack A- + Administerable to: A-, A+, AB-, AB+ + Blood Pack B- + Administerable to: B-, B+, AB-, AB+ + Blood Pack AB- + Administerable to: AB-, AB+ + + Blood Pack O- + A blood pack that can be used on any patient. + + Donor card O- + Can take blood from: O- +Can give blood to: all of them + Donor card O+ + Can take blood from: O-, O+ +Can give blood to: O+, A+, B+, AB+ + Donor card A- + Can take blood from: O-, A- +Can give blood to: A-, A+, AB-, AB+ + Donor card A+ + Can take blood from: O-, O+, A-, A+ +Can give blood to: A+, AB+ + Donor card B- + Can take blood from: O-, B- +Can give blood to: B-, B+, AB-, AB+ + Donor card B+ + Can take blood from: O-, O+, B-, B+ +Can give blood to: B+, AB+ + Donor card AB- + Can take blood from: O-, A-, B-, AB- +Can give blood to: AB-, AB+ + Donor card AB+ + Can take blood from: all of them +Can give blood to: AB+ + + Medical Container + Can store medicine and medical instruments + Surgery Toolbox + Can store many small items that are used during surgery + Refrigerated Crate + A place to store your precious transplant-ready organs + Refrigerated container + A place to store your precious transplant-ready organs + Body bag + Lets you drag people faster. + Stasis Bag + Çoğu biyolojik sürecin gerçekleşmesini durdurur. + + Right arm + A severed right arm. Can be surgically reattached. + Left arm + A severed left arm. Can be surgically reattached. + Right leg + A severed right leg. Can be surgically reattached. + Left leg + A severed left leg. Can be surgically reattached. + Right arm bionic prosthesis + A bionic right arm. Can be used to treat amputation. + Left arm bionic prosthesis + A bionic left arm. Can be used to treat amputation. + Right leg bionic prosthesis + A bionic right leg. Can be used to treat amputation. + Left leg bionic prosthesis + A bionic left leg. Can be used to treat amputation. + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Liver transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Lung transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Kidney transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Heart transplant + Brain transplant + Non-working right hand + Non-working left hand + + + + + + + + Artan Kalp Atış Hızı + Kalp, ürkütücü bir hızla atıyor. + Düzensiz kalp atışı + Kalp çarpıntılı, titrek bir şekilde atıyor. + Kalp Durması + + Kalp Krizi + + Kalp Hasarı + + Kalp İflası + + Kalpsiz + Kalp cerrahi olarak çıkarıldı. + + Nörotravma + + Nörotravmadan öldü + Nörotravmadan öldün. + İnme + + Nöbet + + Koma + + Beyinsiz + Beyin cerrahi olarak çıkarıldı. + Travmatic şok + Ameliyat böyle yapılmamalı, Bir şeyler kesinlikle yanlış! + + Tansiyon + + hipoksemi + + + Solunum durması + Hasta nefes almıyor. + Hiperventilasyon + Hasta ürkütücü bir hızla nefes alıyor. + Hipoventilasyon + Hasta endişe verici derecede yavaş bir hızda nefes alıyor. + Nefes Darlığı + Hastanın nefes alması zor ve sığ. + Alkaloz + + Asidoz + + Radyasyona bağlı akciğer hasarı + + Pnömotoraks + + Akciğer Hasarı + + Akciğer İflası + + Akciğersiz + Akciğerler cerrahi olarak çıkarıldı. + + Böbrek Hasarı + + Böbrek İflası + + Böbreksiz + Böbrekler cerrahi olarak çıkarıldı. + + Kemik Hasarı + + Kemik Ölümü + + Uyarılmış kemik büyümesi + Kemik büyümesi uyarıldı. Kemik ölümünü iyileştirmek için bu rahatsızlığın her vücut parçasında olması gerekir. + + Karaciğer Hasarı + + Karaciğer İflası + + Karaciğersiz + Karaciğer cerrahi olarak çıkarıldı. + + Cerrahi insizyon + Bir neşter ile bir kesi yapıldı. + Klemplenmiş Kanama + Cerrahi kanamalar durduruldu. + Klemplenmiş Arter + Arter kanaması durduruldu, ancak ekstremiteye giden kan akışı ciddi şekilde azaldı. + Balonlu Aort + Aort kanamayı durdurdu, ancak ekstremitelerinize ve organlarınıza giden kan akışı kesildi. + Atel + Kırık atellendi. + Bandaj + Enfeksiyondan korur, çıkıkları stabilize eder. Hareket biraz yavaşlar. + Kirli Bandaj + Enfeksiyonlardan korumak için kullanılırken şimdi tam tersini yapıyor. + Alçı + Kırıkları iyileştirir ve korur. Hareket yavaşlar. Travma makası kullanarak çıkarın. + Merhem + Bir antibiyotik jel tabakası, yarayı herhangi bir mikroptan korur ve temizler. + İğne + Plevral boşluktaki basıncı normalleştirir + + + Kırık sağ humerus + Sağ kolun kırık. + Kırık sol humerus + Sol Kolun kırık. + Kırık sağ Uyluk + Sağ bacağın kırık. + Kırık sol Uyluk + Sol bacağın kırık. + Kırık Kaburga + Bir veya daha fazla kaburgan kırık. + Kırık Kafatası + Kafatasın kırık. + Kırık Boyun + Boynun kırık. + Travmatik Amputasyon + Most of the tissue of the right arm was torn off. + Travmatik Amputasyon + Most of the tissue of the left arm was torn off. + Travmatik Amputasyon + Most of the tissue of the right leg was torn off. + Travmatik Amputasyon + Most of the tissue of the left leg was torn off. + Travmatik Amputasyon + Most of the tissue of the head was torn off. + Amputasyon + The right arm was surgically amputated. + Amputasyon + The left arm was surgically amputated. + Amputasyon + The right leg was surgically amputated. + Amputasyon + The left leg was surgically amputated. + Amputasyon + The head was surgically amputated. + Omurilik Hasarı + Hasta felç ve vücudunu hissetmiyor. + Felçten Öldü + Felç sebebiyle öldün. + Çıkık + Eklemin bu şekilde bükülmemesi gerekiyor... + Çıkık + Eklemin bu şekilde bükülmemesi gerekiyor... + Çıkık + Eklemin bu şekilde bükülmemesi gerekiyor... + Çıkık + Eklemin bu şekilde bükülmemesi gerekiyor... + Femoral arter kanaması + Bir arter hasar görmüş ve ciddi kan kaybına neden oluyor. + Femoral arter kanaması + Bir arter hasar görmüş ve ciddi kan kaybına neden oluyor. + Brakiyal arter kanaması + Bir arter hasar görmüş ve ciddi kan kaybına neden oluyor. + Brakiyal arter kanaması + Bir arter hasar görmüş ve ciddi kan kaybına neden oluyor. + Aort Yırtılması + Karotis arter kanaması + Bir arter hasar görmüş ve ciddi kan kaybına neden oluyor. + Dikişli Yara + Yaralar dikilerek kapatıldı. + Bağışıklık + + Enfekte Yara + + Septisemi + + Necroz + + Nekrotik Yaradan öldü. + Nekrozdan öldün. + Gangren + Ekstremite küçüldü ve siyaha döndü. + Adrenalin + + Pıhtı Önleyici + + Tiyamin + + Salin + + Ringer Çözeltisi + + Mannitol + + Antibiyotik + + İmmünosupresanlar + + Hemotransfüzyon şoku + + Yabancı cisim + + kardiyak tamponad + + İç Kanama + + + Öksürük + The patient is coughing periodically. + Soluk Ten + The patients skin is pale. + Baş Dönmesi + The patient is expressing lightheadedness. + Bulanık Görme + The patient is expressing blurred vision. + Bilinç Bulanıklığı + The patient seems disoriented and confused. + Baş Ağrısı + The patient is expressing a headache. + Bacak Şişmesi + The patients legs are swollen. + Zayıflık + The patient is expressing weakness in the extremities. + Hırıltı + The patients breathing is producing a high-pitched noise. + Kusma + The patient is vomiting periodically. + Kan Kusma + The patient is vomiting blood periodically. + Yüksek Ateş + The patients body temperature is elevated. + Karın Rahatsızlığı + The patient is expressing abdominal discomfort. + Şişkinlik + The patients abdomen is bloated. + Sarılık + The patients skin has turned a sickly shade of yellow. + Terleme + The patient is sweating excessively. + Çarpıntı + The patient is expressing palpitations. + Bilinç Kaybı + The patient is unconscious. + İltihaplanma + The area is red, swollen and warm. + Spazm + The patient can't control the erratic behaviour of the limb. + Arzu + The patient is happy enough... so long as they get what they need. + Yanıyor! + The patient is burning alive! Grab an extinguisher! + Göğüs Ağrısı + The patient is expressing sharp, piercing pain in their chest. + Karın Ağrısı + The patient is expressing persistent pain in their abdomen. + Şiddetli Ağrı + The patient is expressing intense pain in the affected area. + Mide bulantısı + The skin is clammy and the patient is nauseous. + Lualess + Lua isn't running. That means neurotrauma and any other mods that use it won't work. Please read the workshop pages of mods you plan to use. + Analjezi + Insensitivity to pain. + Anestezi + The patient has drug-induced amnesia and sedation. + Birinci Derece Yanık + The area is red and painful to the touch. + İkinci Derece Yanık + There are very painful blisters littering the affected area. + Üçüncü Derece Yanık + The patient doesn't feel pain in the now leathery, stiff area. + + Cerrahi İnsizyon + Hastaya kesi yapıldı. + Klemplenmiş Kanama + İnsizyondan kaynaklanan kanama durduruldu. + Sıyrılmış Deri + Deri retraktörler tarafından sıyrıldı. + Delinmiş Kemik + Kemikler ortopedik işlemler için hazırlanmıştır. + Dikişlenmiş İnsizyon + Bir kesi dikişlerle kapatılmıştır. + Kemik Kesildi + Kemik testere yardımıyla kesildi. + + Alive + Conscious + Patient_name + Vitality + Heartrate + Breathingrate + Bloodpressure + Bloodoxygen + Neurotrauma + Organdamage + In_surgery + Cause_of_death + Kan_pH + + Cerrahi + + Tansiyon Düşürücü + Sodyum Nitroprussid + Tansiyonu düşürmek için kullanılan bir ilaç. + Tıbbi Başlangıç Sandığı + Tüm temel unsurları içeren, tek bir üretim tarifine uygun şekilde paketlenmiş bir sandık. + \ No newline at end of file diff --git a/Neurotrauma/Lua/Autorun/init.lua b/Neurotrauma/Lua/Autorun/init.lua new file mode 100644 index 0000000..60f049c --- /dev/null +++ b/Neurotrauma/Lua/Autorun/init.lua @@ -0,0 +1,100 @@ +--if Game.IsMultiplayer and CLIENT then return end + +NT = {} -- Neurotrauma +NT.Name = "Neurotrauma" +NT.Version = "A1.12.1" +NT.VersionNum = 01120100 +NT.Path = table.pack(...)[1] + +dofile(NT.Path .. "/Lua/Scripts/helperfunctions.lua") + +-- all things config +dofile(NT.Path .. "/Lua/Scripts/configdata.lua") + +-- server-side code (also run in singleplayer) +if (Game.IsMultiplayer and SERVER) or not Game.IsMultiplayer then + -- Version and expansion display + Timer.Wait(function() + Timer.Wait(function() + local runstring = "\n/// Running Neurotrauma V " .. NT.Version .. " ///\n" + + -- add dashes + local linelength = string.len(runstring) + 4 + local i = 0 + while i < linelength do + runstring = runstring .. "-" + i = i + 1 + end + local hasAddons = #NTC.RegisteredExpansions > 0 + + -- add expansions + for val in NTC.RegisteredExpansions do + runstring = runstring .. "\n+ " .. (val.Name or "Unnamed expansion") .. " V " .. (val.Version or "???") + if val.MinNTVersion ~= nil and NT.VersionNum < (val.MinNTVersionNum or 1) then + runstring = runstring + .. "\n-- WARNING! Neurotrauma version " + .. val.MinNTVersion + .. " or higher required!" + end + end + + -- No expansions + runstring = runstring .. "\n" + if not hasAddons then + runstring = runstring .. "- Not running any expansions\n" + end + + print(runstring) + end, 1) + end, 1) + + --dofile(NT.Path .. "/Lua/Scripts/Server/characterpatches.lua") + + dofile(NT.Path .. "/Lua/Scripts/Server/ntcompat.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/blood.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/humanupdate.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/ondamaged.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/items.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/onfire.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/cpr.lua") + --dofile(NT.Path.."/Lua/Scripts/Server/surgerytable.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/fuckbots.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/lootcrates.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/multiscalpel.lua") -- its important for this to run after items.lua + dofile(NT.Path .. "/Lua/Scripts/Server/falldamage.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/screams.lua") + dofile(NT.Path .. "/Lua/Scripts/Server/modconflict.lua") + + dofile(NT.Path .. "/Lua/Scripts/testing.lua") +end + +-- server-side code only +if SERVER then + Networking.Receive("NT.ConfigUpdate", function(msg, sender) + if not sender.HasPermission(ClientPermissions.ManageSettings) then + return + end + NTConfig.ReceiveConfig(msg) + NTConfig.SaveConfig() + end) + + Networking.Receive("NT.ConfigRequest", function(msg, sender) + if not sender then + return + end + NTConfig.SendConfig(sender) + end) +end + +-- client-side code +if CLIENT then + dofile(NT.Path .. "/Lua/Scripts/Client/configgui.lua") +end + +-- Shared and singleplayer code +dofile(NT.Path .. "/Lua/Scripts/Shared/surgerytable.lua") -- Heelge: fix for https://github.com/OlegBSTU/Neurotrauma/issues/15 +--dofile(NT.Path .. "/Lua/Scripts/Shared/pronecolliderfix.lua") -- Heelge: fix collider on prone (thx Lua man), but it has 2 ms perf drop so commented out + +-- Consent Required Extended with adjustments +-- mod page: https://steamcommunity.com/sharedfiles/filedetails/?id=2892602084 +dofile(NT.Path .. "/Lua/ConsentRequiredExtended/init.lua") diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Api.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Api.lua new file mode 100644 index 0000000..6025523 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Api.lua @@ -0,0 +1,146 @@ +-- Consent Required API +-- Any Lua script can access this API by adding this line: +-- local Api = require "com.github.cintique.ConsentRequired.Api" +local Environment = require("ConsentRequiredExtended.Util.Environment") +local Barotrauma = require("ConsentRequiredExtended.Util.Barotrauma") + +local _ENV = Environment.PrepareEnvironment(_ENV) + +-- Table of identifiers (strings) of items that when used +-- as a treatment on an NPC from a different team, +-- causes that NPC (and their allies) to become hostile +-- towards the player. +local affectedItems = {} + +---Adds an item (by identifier string) to `affectedItems`. +---@param identifier string +function AddAffectedItem(identifier) + table.insert(affectedItems, identifier) +end + +LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.AbandonedOutpostMission"], "requireRescue") + +-- Character type doesn't have tags we can assign a custom "rescuetarget" tag to +-- So instead we just hold characters which need rescue in a table and compare their entity IDs +-- This table is only resfreshed on roundstart +local rescuetargets = {} + +---Returns a boolean indicating whether a given item is affected or not. +---@param identifier string The identifier of the item that we are testing. +---@return boolean isAffected True if the item is affected, false otherwise. +function IsItemAffected(identifier) + for _, item in pairs(affectedItems) do + if item == identifier or HF.StartsWith(identifier, item) then + return true + end + end + return false +end + +local ADD_ATTACKER_DAMAGE = 130 -- Heelge: this used to max out negative rep gain, now only around 4 negative rep, any less negative rep is too forgiving. + +---@param aiChar Barotrauma_Character The AI character to be made hostile. +---@param instigator Barotrauma_Character The character to be the target of the AI's wrath. +function makeHostile(aiChar, instigator) + aiChar.AIController.OnAttacked(instigator, Barotrauma.AttackResult.NewAttackResultFromDamage(ADD_ATTACKER_DAMAGE)) + aiChar.AddAttacker(instigator, ADD_ATTACKER_DAMAGE) +end + +---@param char1 Barotrauma_Character Character one. +---@param char2 Barotrauma_Character Character two. +---@return boolean charactersAreOnSameTeam True if characters one & two are on the same team, false otherwise. +function isOnSameTeam(char1, char2) + local team1 = char1.TeamID + local team2 = char2.TeamID + return team1 == team2 +end + +---Updates current rescue targets list, separate so we dont cycle thru all missions every time we apply item to chacter. Use IsRescueTarget(target) after this. +function UpdateRescueTargets() + rescuetargets = {} + for mission in Game.GameSession.Missions do + if LuaUserData.IsTargetType(mission.Prefab.MissionClass, "Barotrauma.AbandonedOutpostMission") then + for character in mission.requireRescue do + rescuetargets[character.ID] = character + --table.insert(rescuetargets, character) + end + end + end + -- print('rescue targets =') + -- for char in rescuetargets do print(char.Name) end +end + +---@param target Barotrauma_Character The character we want to confirm as being rescued +---@return boolean consent True if target is rescue mission target, false otherwise +function IsRescueTarget(target) + -- for char in rescuetargets do + -- if target.ID == char.ID then return true end + -- end + if rescuetargets[target.ID] ~= nil then + return true + end + return false +end + +---@param user Barotrauma_Character The character who desires consent. +---@param target Barotrauma_Character The character who gives consent +---@return boolean consent True if consent is given, false otherwise. +function hasConsent(user, target) + return isOnSameTeam(user, target) or target.IsEscorted or IsRescueTarget(target) -- No longer needs to be shared. +end + +---@param aiChar Barotrauma_Character The (AI but not necessarily) character whose sight is being tested. +---@param target Barotrauma_Character The character to be seen. +---@return boolean aiCanSeeTarget True if the AI can see the target character. +function canAiSeeTarget(aiChar, target) + -- I'll just use what Barotrauma uses for witness line of sight + local aiVisibleHulls = aiChar.GetVisibleHulls() + local targetCurrentHull = target.CurrentHull + for _, visibleHull in pairs(aiVisibleHulls) do + if targetCurrentHull == visibleHull then + return true + end + end + return false +end + +---@param user Barotrauma_Character The character of the instigator being witnessed. +---@param victim Barotrauma_Character The character of the victim of the crime being witnessed. +---@return Barotrauma_Character[] Characters that have witnessed the crime. +function getWitnessesToCrime(user, victim) + local witnesses = {} + for _, char in pairs(Character.CharacterList) do + if + not char.Removed + and not char.IsUnconscious + and char.IsBot + and char.IsHuman + and isOnSameTeam(char, victim) + then + local isWitnessingUser = canAiSeeTarget(char, user) + if isWitnessingUser then + table.insert(witnesses, char) + end + end + end + return witnesses +end + +---@param user Barotrauma_Character The character that is applying the affected item. +---@param target Barotrauma_Character The character of the target of the affected item's application. +function onAffectedItemApplied(user, target) + if not hasConsent(user, target) and target.IsBot and target.IsHuman then + if not target.IsIncapacitated and target.Stun <= 10 then + makeHostile(target, user) + else + -- Vanilla Barotrauma Human AI doesn't care what you do to their unconscious teammates, even shooting them in the head + -- Let's fix that for this particular case of mistreatment + local witnesses = getWitnessesToCrime(user, target) + for _, witness in pairs(witnesses) do + makeHostile(witness, user) + end + end + end +end + +return Environment.Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Config.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Config.lua new file mode 100644 index 0000000..c000814 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Config.lua @@ -0,0 +1,64 @@ +-- User edited configuration file. +local Environment = require("ConsentRequiredExtended.Util.Environment") + +local _ENV = Environment.PrepareEnvironment(_ENV) + +--------- Start editing here --------- + +AffectedItems = { + -- Neurotrauma + -- "healthscanner", --健康扫描仪 -- whats a tiny bit of radiation damage between friends? + "bloodanalyzer", --血液分析仪 + "opium", --药用鸦片 + "antidama1", --吗啡 + "antidama2", --芬太尼 + "antibleeding3", --抗生素凝膠 + "propofol", -- 异丙酚 + "mannitol", -- 甘露醇 + "pressuremeds", -- 压力药物 + "multiscalpel", -- 多功能手术刀 + "advscalpel", -- 手术刀 + "advhemostat", -- 止血钳 + "advretractors", -- 皮肤牵引器 + "tweezers", -- 镊子 + "surgicaldrill", -- 骨钻 + "surgerysaw", -- 手术锯 + "organscalpel_liver", -- 器官切割刀:肝脏 + "organscalpel_lungs", -- 器官切割刀:肺 + "organscalpel_kidneys", -- 器官切割刀:肾脏 + "organscalpel_heart", -- 器官切割刀:心脏 + "organscalpel_brain", -- 器官切割刀:大脑 + "emptybloodpack", -- 空血袋 + "bloodpack", + "alienblood", -- 异星血浆 + "tourniquet", -- 止血带 + "defibrillator", -- 手动除颤器 + "aed", -- 智能除颤器 + "bvm", -- 人工呼吸器 + "antibiotics", -- 广谱抗生素 + "sulphuricacid", -- 硫酸 + "divingknife", -- 潜水刀 + "divingknifedementonite", -- 攝魂潛水刀 + "divingknifehardened", -- 硬化潛水刀 + "crowbar", -- 潜水刀 + "crowbardementonite", -- 攝魂撬棍 + "crowbarhardened", -- 硬化撬棍 + "stasisbag", -- 冷藏袋 + "autocpr", -- 全自动CPR + -- NeuroEyes + "organscalpel_eyes", -- 器官切割刀:眼睛 + -- blahaj 布罗艾鲨鱼 + -- "blahaj", -- 布罗艾鲨鱼 -- Blahaj never hurt anyone + -- "blahajplus", -- 大鲨鲨 + "blahajplusplus", -- 超大鲨鲨 + -- Pharmacy 制药大师 + "custompill", -- 自制药丸 + "custompill_horsepill", -- 大药丸 + "custompill_tablets", -- 药片 + -- vanilla 原版 + "toyhammer", -- 玩具锤子 +} + +--------- Stop editing here --------- + +return Environment.Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Main.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Main.lua new file mode 100644 index 0000000..edac0c0 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Main.lua @@ -0,0 +1,31 @@ +-- Do not take my blood or organs without my consent, thanks. +-- Causes AI to get angry at you if you use certain medical items on them. +-- These items are those related to organ and blood removal. +-- This mod is meant to be accompanied by Neurotrauma, and aims to +-- resolve the issue of being freely able to steal blood/organs from +-- neutral NPCs (e.g. outposts, VIPs) without them getting mad at you. +local Api = require("ConsentRequiredExtended.Api") +local OnItemApplied = require("ConsentRequiredExtended.OnItemApplied") +local onMeleeWeaponHandleImpact = require("ConsentRequiredExtended.onMeleeWeaponHandleImpact") +local Config = require("ConsentRequiredExtended.Config") + +local LUA_EVENT_ITEM_APPLYTREATMENT = "item.ApplyTreatment" +local HOOK_NAME_ITEM_APPLYTREATMENT = "ConsentRequiredExtended.onItemApplyTreatment" + +local LUA_EVENT_MELEEWEAPON_HANDLEIMPACT = "meleeWeapon.handleImpact" +local HOOK_NAME_MELEEWEAPON_HANDLEIMPACT = "ConsentRequiredExtended.onMeleeWeaponHandleImpact" + +local LUA_EVENT_ROUNDSTART = "roundStart" +local HOOK_NAME_UPDATE_RESCUETARGETS = "ConsentRequiredExtended.onUpdateRescueTargets" + +-- Set up affected items from config. +for _, affectedItem in pairs(Config.AffectedItems) do + Api.AddAffectedItem(affectedItem) +end + +Hook.Add(LUA_EVENT_ITEM_APPLYTREATMENT, HOOK_NAME_ITEM_APPLYTREATMENT, OnItemApplied) + +-- damn meleeWeapon +Hook.Add(LUA_EVENT_MELEEWEAPON_HANDLEIMPACT, HOOK_NAME_MELEEWEAPON_HANDLEIMPACT, onMeleeWeaponHandleImpact) + +Hook.Add(LUA_EVENT_ROUNDSTART, HOOK_NAME_UPDATE_RESCUETARGETS, Api.UpdateRescueTargets) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/OnItemApplied.lua b/Neurotrauma/Lua/ConsentRequiredExtended/OnItemApplied.lua new file mode 100644 index 0000000..31ce171 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/OnItemApplied.lua @@ -0,0 +1,20 @@ +local Api = require("ConsentRequiredExtended.Api") + +local function isItemAffected(identifier) + return Api.IsItemAffected(identifier) +end + +---@param item Barotrauma_Item Item being applied. +---@param user Barotrauma_Character The character that is applying the item. +---@param target Barotrauma_Character The character of the target of the item's application. +local function OnItemApplied(item, user, target) + if not NTConfig.Get("NTCRE_ConsentRequired", true) then + return + end + local itemIdentifier = item.Prefab.Identifier.Value + if isItemAffected(itemIdentifier) then + Api.onAffectedItemApplied(user, target) + end +end + +return OnItemApplied diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Util/Barotrauma.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Barotrauma.lua new file mode 100644 index 0000000..ea6edad --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Barotrauma.lua @@ -0,0 +1,90 @@ +-- Functions for interfacing with Barotrauma. + +local Environment = require 'ConsentRequiredExtended.Util.Environment' +local _ENV = Environment.PrepareEnvironment(_ENV) + +-- local Clr = require 'ConsentRequiredExtended.Util.Clr' +-- local UserData = require 'ConsentRequiredExtended.Util.UserData' + +---Functions related to working with Barotrauma.AttackResult. +AttackResult = {} + +---Initialise AttackResults. +-- local function Init_AttackResult() +-- -- Registrations. +-- UserData.RegisterStandardType("System.Reflection.FieldInfo") + +-- -- Construct a List generic type. +-- local afflictionsListClrType = Clr.CreateConstructedGenericType("System.Collections.Generic.List`1", "Barotrauma.Affliction") +-- local attackResultAfflictionsField = Clr.GetRawClrType("Barotrauma.AttackResult").GetField("Afflictions") + +-- ---Instantiates a new AttackResult with damage and empty afflictions. +-- ---@param damage number An amount of damage. +-- function AttackResult.NewAttackResultFromDamage(damage) +-- -- Instantiate a new AttackResult. +-- local attackResult = _G.AttackResult(damage, nil) + +-- -- Instantiate an empty List (this is to prevent NREs), +-- -- and set it to attackResult.Afflictions. This is a readonly field, +-- -- hence the use of reflection. +-- local afflictionsList = UserData.FromClrType({}, afflictionsListClrType) +-- attackResultAfflictionsField.SetValue(attackResult, afflictionsList) + +-- return attackResult +-- end +-- end + +---Initialise AttackResults without needing to register system.type and reflections +local function Init_AttackResult() + -- Registrations. + LuaUserData.MakePropertyAccessible(Descriptors['Barotrauma.AttackResult'], 'Damage') + + ---Instantiates a new AttackResult with damage and empty afflictions. + ---@param damage number An amount of damage. + function AttackResult.NewAttackResultFromDamage(damage) + -- I have not noticed any NREs from affliction list being null + -- but just in case here is version which intializes with empty list + -- Also uncomment MakePropertyAccessible Damage above + local attackResult = _G.AttackResult({}, nil, {}) + attackResult.Damage = damage + + --local attackResult = _G.AttackResult(damage) + + return attackResult + end +end + +---Runs at start-up, handles registrations, etc. +function Init() + Init_AttackResult() +end + +function Test() + local errors = {} + local function AssertEquals(testDescription, expected, got) + if expected ~= got then + local errorString = string.format( + "Test Error: %s\n\texpected = %s\n\tgot = %s", + testDescription, + tostring(expected), + tostring(got) + ) + table.insert(errors, errorString) + end + end + local atkRes = AttackResult.NewAttackResultFromDamage(10) + AssertEquals("atkRes.Damage", 10, atkRes.Damage) + AssertEquals("atkRes.Afflictions is null", true, atkRes.Afflictions ~= nil) + AssertEquals("#atkRes.Afflictions is non-zero", 0, #atkRes.Afflictions) + + if #errors == 0 then + print("Tests successful") + else + for _, err in pairs(errors) do + print(err) + end + end +end + +Init() +return Environment.Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Util/Clr.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Clr.lua new file mode 100644 index 0000000..98e60f1 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Clr.lua @@ -0,0 +1,74 @@ +-- Functions for working with CLR types. + +local Environment = require 'ConsentRequiredExtended.Util.Environment' +local _ENV = Environment.PrepareEnvironment(_ENV) + +local UserData = require 'ConsentRequiredExtended.Util.UserData' + +---Construct ClrType wrapper table for CLR types. +---@param underlyingType userdata The underlying type (CLR type: System.Type). +---@return ClrType Wrapper table for working with CLR types. +local function New(underlyingType) + ---@class ClrType + local clrType = {} + + ---Instantiate an object for the given CLR type. + ---@return any An instance of the CLR type. Actual Lua type depends on MoonSharp conversions. + function clrType:Instantiate() + -- TODO: Implement args. + return underlyingType.Assembly.CreateInstance(underlyingType.FullName) + end + + ---Get the underlying type as a raw CLR type object. + ---@return userdata The raw underlying type (CLR type: System.Type). + function clrType:GetUnderlyingType() + return underlyingType + end + + ---Get the full name of the CLR type. + ---@return string The full name of the type. + function clrType:GetFullName() + return underlyingType.FullName + end + + return clrType +end + +---Create a constructed generic type. +---@param genericTypeName string The name of the generic type to construct and register. +---@vararg string +---@return ClrType The constructed generic type. +function CreateConstructedGenericType(genericTypeName, ...) + local genericTypeArgumentsString = table.pack(...) + + local genericTypeArgumentsType = {} + for _, typeString in pairs(genericTypeArgumentsString) do + table.insert(genericTypeArgumentsType, GetRawClrType(typeString)) + end + + local genericTypeDefinition = GetRawClrType(genericTypeName) + local constructedGenericType = genericTypeDefinition.MakeGenericType(table.unpack(genericTypeArgumentsType)) + return New(constructedGenericType) +end + +---Get a System.Type object from a type name. +---@param typeName string Name of the type. +---@return userdata The type object (CLR type: System.Type). +function GetRawClrType(typeName) + return LuaUserData.GetType(typeName) +end + +---Get a ClrType instance wrapping a Type object that matches the type name. +---@param typeName string Name of the type. +---@return ClrType The CLR type. +function GetClrType(typeName) + return New(GetRawClrType(typeName)) +end + +local function Init() + UserData.RegisterStandardType("System.Type") + UserData.RegisterStandardType("System.Reflection.RuntimeAssembly") +end + +Init() +return Environment.Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Util/Environment.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Environment.lua new file mode 100644 index 0000000..5d15fd6 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Util/Environment.lua @@ -0,0 +1,32 @@ +-- Functions for managing the mod's environment. + +---Isolate a function or module's environment from Global. +---@param env table The _ENV table. +local function prepareEnvironment(env) + return setmetatable( + {}, + { + __index = _G, + } + ) +end + +local _ENV = prepareEnvironment(_ENV) + +PrepareEnvironment = prepareEnvironment + +---Create an empty table whose metatable indexes non-local variables declared within +---a function/module's environment, and is immutable to any changes. +---@param env table The _ENV table. +---@return table Empty table that interfaces with _ENV. +function Export(env) + return setmetatable( + {}, + { + __index = function(t, k) return env[k] end, + __newindex = function() error("Attempted to modify a protected table.") end + } + ) +end + +return Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/Util/UserData.lua b/Neurotrauma/Lua/ConsentRequiredExtended/Util/UserData.lua new file mode 100644 index 0000000..0204c14 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/Util/UserData.lua @@ -0,0 +1,35 @@ +-- Functions for creating userdata. + +local Environment = require 'ConsentRequiredExtended.Util.Environment' +local _ENV = Environment.PrepareEnvironment(_ENV) + +---Create a userdata that references the type in a static context. +---@param clrTypeName string The name of the type to point to. +---@return userdata A userdata that references the type in a static context. +function FromStringStatic(clrTypeName) + LuaUserData.CreateStatic(clrTypeName) +end + +---Create a userdata that references the type described by a ClrType in a static context. +---@param clrType ClrType ClrType that describes the type being referenced. +---@return userdata A userdata that references the type in a static context. +function FromClrTypeStatic(clrType) + return FromStringStatic(clrType:GetFullName()) +end + +---Create a userdata that references an instance of a CLR type with conversion. +---@param value any A Lua value to convert to a CLR object of the given type and wrap up in a userdata. +---@param clrType ClrType The CLR type to instantiate and wrap in the userdata. +---@return userdata A userdata that references the an instance of the CLR type. +function FromClrType(value, clrType) + return LuaUserData.CreateUserDataFromType(value, clrType:GetUnderlyingType()) +end + +---Register standard types with MoonSharp. For generics use RegisterClrType.ConstructedGenericType. +---@param typeName string Name of the type to register. +function RegisterStandardType(typeName) + local desc = LuaUserData.RegisterType(typeName) + _G.Descriptors[typeName] = desc +end + +return Environment.Export(_ENV) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/init.lua b/Neurotrauma/Lua/ConsentRequiredExtended/init.lua new file mode 100644 index 0000000..8ef6141 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/init.lua @@ -0,0 +1,16 @@ +local SRC_NAMESPACE = "ConsentRequiredExtended." +local MAIN = "Main" +local LUA_EVENT_LOADED = "loaded" +local HOOK_NAME_ON_LOADED = "ConsentRequiredExtended.onLoaded" + +local function onLoaded() + -- Only run client side if not multiplayer + ---@diagnostic disable-next-line: undefined-global + -- if Game.IsMultiplayer and CLIENT then return end + + local requireStr = SRC_NAMESPACE .. MAIN + + require(requireStr) +end + +Hook.Add(LUA_EVENT_LOADED, HOOK_NAME_ON_LOADED, onLoaded) diff --git a/Neurotrauma/Lua/ConsentRequiredExtended/onMeleeWeaponHandleImpact.lua b/Neurotrauma/Lua/ConsentRequiredExtended/onMeleeWeaponHandleImpact.lua new file mode 100644 index 0000000..622e9e7 --- /dev/null +++ b/Neurotrauma/Lua/ConsentRequiredExtended/onMeleeWeaponHandleImpact.lua @@ -0,0 +1,38 @@ +local Api = require("ConsentRequiredExtended.Api") + +local function isItemAffected(identifier) + return Api.IsItemAffected(identifier) +end + +---@param meleeweapon Weapon target +---@param target The target of the hit could be a limb or just a character. +local function onMeleeWeaponHandleImpact(meleeweapon, target) + if not NTConfig.Get("NTCRE_ConsentRequired", true) then + return + end + if meleeweapon == nil or target == nil then + return + end + local itemIdentifier = meleeweapon.item.Prefab.Identifier.Value + if isItemAffected(itemIdentifier) then + local user = meleeweapon.picker + if user == nil then + return + end + local targetUserData = target.UserData + if targetUserData == nil then + return + end + local targetUser = nil + if LuaUserData.IsTargetType(targetUserData, "Barotrauma.Limb") then + targetUser = targetUserData.character + elseif LuaUserData.IsTargetType(targetUserData, "Barotrauma.Character") then + targetUser = targetUserData + end + if targetUser ~= nil then + Api.onAffectedItemApplied(user, targetUser) + end + end +end + +return onMeleeWeaponHandleImpact diff --git a/Neurotrauma/Lua/Scripts/Client/MultiLineTextBox.lua b/Neurotrauma/Lua/Scripts/Client/MultiLineTextBox.lua new file mode 100644 index 0000000..862ef08 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Client/MultiLineTextBox.lua @@ -0,0 +1,56 @@ +-- why barotrauma's GUI libraries don't have this implemented by default? this is stupid + +local function updateServerMessageScrollBasedOnCaret(textBox, listBox) + local caretY = textBox.CaretScreenPos.Y + local bottomCaretExtent = textBox.Font.LineHeight * 1.5 + local topCaretExtent = -textBox.Font.LineHeight * 0.5 + + if caretY + bottomCaretExtent > listBox.Rect.Bottom then + listBox.ScrollBar.BarScroll = (caretY - textBox.Rect.Top - listBox.Rect.Height + bottomCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + elseif caretY + topCaretExtent < listBox.Rect.Top then + listBox.ScrollBar.BarScroll = (caretY - textBox.Rect.Top + topCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + end +end + +local function CreateMultiLineTextBox(rectransform, text, size) + local multineListBox = GUI.ListBox(GUI.RectTransform(Vector2(1, size or 0.2), rectransform)) + + local textBox = GUI.TextBox( + GUI.RectTransform(Vector2(1, 1), multineListBox.Content.RectTransform), + text, + nil, + nil, + nil, + true, + "GUITextBoxNoBorder" + ) + + textBox.add_OnSelected(function() + updateServerMessageScrollBasedOnCaret(textBox, multineListBox) + end) + + textBox.OnTextChangedDelegate = function() + local textSize = textBox.Font.MeasureString(textBox.WrappedText) + textBox.RectTransform.NonScaledSize = + Point(textBox.RectTransform.NonScaledSize.X, math.max(multineListBox.Content.Rect.Height, textSize.Y + 10)) + multineListBox.UpdateScrollBarSize() + + return true + end + + textBox.OnEnterPressed = function() + local str = textBox.Text + local caretIndex = textBox.CaretIndex + + textBox.Text = str:sub(1, caretIndex) .. "\n" .. str:sub(caretIndex + 1) + textBox.CaretIndex = caretIndex + 1 + + return true + end + + return textBox +end + +return CreateMultiLineTextBox diff --git a/Neurotrauma/Lua/Scripts/Client/configgui.lua b/Neurotrauma/Lua/Scripts/Client/configgui.lua new file mode 100644 index 0000000..aad62da --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Client/configgui.lua @@ -0,0 +1,242 @@ +--easysettings by Evil Factory +local easySettings = dofile(NT.Path .. "/Lua/Scripts/Client/easysettings.lua") +local MultiLineTextBox = dofile(NT.Path .. "/Lua/Scripts/Client/MultiLineTextBox.lua") +local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent") +local configUI + +local function CommaStringToTable(str) + local tbl = {} + + for word in string.gmatch(str, "([^,]+)") do + table.insert(tbl, word) + end + + return tbl +end + +--calculate difficulty +local function DetermineDifficulty() + local difficulty = 0 + local defaultDifficulty = 0 + local res = "" + + for key, entry in pairs(NTConfig.Entries) do + if entry.difficultyCharacteristics then + local entryValue = entry.value + local entryValueDefault = entry.default + local diffMultiplier = 1 + if entry.type == "bool" then + entryValue = HF.BoolToNum(entry.value) + entryValueDefault = HF.BoolToNum(entry.default) + end + if entry.difficultyCharacteristics.multiplier then + diffMultiplier = entry.difficultyCharacteristics.multiplier + end + + defaultDifficulty = defaultDifficulty + entryValueDefault * diffMultiplier + difficulty = difficulty + math.min(entryValue * diffMultiplier, entry.difficultyCharacteristics.max or 1) + end + end + + -- normalize to 10 + difficulty = difficulty / defaultDifficulty * 10 + + if difficulty > 23 then + res = "Impossible" + elseif difficulty > 16 then + res = "Very hard" + elseif difficulty > 11 then + res = "Hard" + elseif difficulty > 8 then + res = "Normal" + elseif difficulty > 6 then + res = "Easy" + elseif difficulty > 4 then + res = "Very easy" + elseif difficulty > 2 then + res = "Barely different" + else + res = "Vanilla but sutures" + end + + res = res .. " (" .. HF.Round(difficulty, 1) .. ")" + return res +end + +--bulk of the GUI code +local function ConstructUI(parent) + local list = easySettings.BasicList(parent) + + --info text + local userBlock = GUI.TextBlock( + GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform), + "Server config can be changed by owner or a client with manage settings permission. If the server doesn't allow writing into the config folder, then it must be edited manually.", + Color(200, 255, 255), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + local difficultyBlock = GUI.TextBlock( + GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), + "", + Color(200, 255, 255), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + + --set difficulty text (why does this even exist in the first place) + local function OnChanged() + difficultyRate = "Calculated difficulty rating: " .. DetermineDifficulty() + difficultyBlock.Text = difficultyRate + end + OnChanged() + + --empty space + --GUI.TextBlock(GUI.RectTransform(Vector2(0.2, 0.1), list.Content.RectTransform), "", Color(255,255,255), nil, GUI.Alignment.Center, true, nil, Color(0,0,0)) + + -- procedurally construct config UI + for key, entry in pairs(NTConfig.Entries) do + if entry.type == "float" then + -- scalar value + --grab range + local minrange = "" + local maxrange = "" + local count = 0 + for _, rangegrab in pairs(entry.range) do + if count == 0 then + minrange = rangegrab + end + if count == 1 then + maxrange = rangegrab + end + count = count + 1 + end + + local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform) + local textBlock = GUI.TextBlock( + rect, + entry.name .. " (" .. minrange .. "-" .. maxrange .. ")", + Color(230, 230, 170), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + if entry.description then + textBlock.ToolTip = entry.description + end + local scalar = + GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.08), list.Content.RectTransform), NumberType.Float) + local key2 = key + scalar.valueStep = 0.1 + scalar.MinValueFloat = 0 + scalar.MaxValueFloat = 100 + if entry.range then + scalar.MinValueFloat = entry.range[1] + scalar.MaxValueFloat = entry.range[2] + end + scalar.FloatValue = NTConfig.Get(key2, 1) + scalar.OnValueChanged = function() + NTConfig.Set(key2, scalar.FloatValue) + OnChanged() + end + elseif entry.type == "string" then + --user string input + local style = "" + --get custom style + if entry.style ~= nil then + style = " (" .. entry.style .. ")" + end + + local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform) + local textBlock = GUI.TextBlock( + rect, + entry.name .. style, + Color(230, 230, 170), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + if entry.description then + textBlock.ToolTip = entry.description + end + + local stringinput = MultiLineTextBox(list.Content.RectTransform, "", entry.boxsize) + + stringinput.Text = table.concat(entry.value, ",") + + stringinput.OnTextChangedDelegate = function(textBox) + entry.value = CommaStringToTable(textBox.Text) + end + elseif entry.type == "bool" then + -- toggle + local rect = GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform) + local toggle = GUI.TickBox(rect, entry.name) + if entry.description then + toggle.ToolTip = entry.description + end + local key2 = key + toggle.Selected = NTConfig.Get(key2, false) + toggle.OnSelected = function() + NTConfig.Set(key2, toggle.State == GUIComponent.ComponentState.Selected) + OnChanged() + end + elseif entry.type == "category" then + -- visual separation + GUI.TextBlock( + GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), + entry.name, + Color(255, 255, 255), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + end + end + + --empty space as last tickbox was getting cutoff + GUI.TextBlock( + GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), + "", + Color(255, 255, 255), + nil, + GUI.Alignment.Center, + true, + nil, + Color(0, 0, 0) + ) + + if Game.IsMultiplayer and not Game.Client.HasPermission(ClientPermissions.ManageSettings) then + for guicomponent in list.GetAllChildren() do + guicomponent.enabled = false + end + end + + return list +end + +Networking.Receive("NT.ConfigUpdate", function(msg) + NTConfig.ReceiveConfig(msg) + local parent = configUI.Parent.Parent + configUI.RectTransform.Parent = nil + configUI = nil + configUI = ConstructUI(parent) +end) + +easySettings.AddMenu("Neurotrauma", function(parent) + if Game.IsMultiplayer then + local msg = Networking.Start("NT.ConfigRequest") + Networking.Send(msg) + end + configUI = ConstructUI(parent) +end) diff --git a/Neurotrauma/Lua/Scripts/Client/easysettings.lua b/Neurotrauma/Lua/Scripts/Client/easysettings.lua new file mode 100644 index 0000000..9073afd --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Client/easysettings.lua @@ -0,0 +1,170 @@ +--original code by Evil Factory, +--adapted to NT +local easySettings = {} + +easySettings.Settings = {} + +local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent") + +local function GetChildren(comp) + local tbl = {} + for value in comp.GetAllChildren() do + table.insert(tbl, value) + end + return tbl +end + +Hook.Patch("Barotrauma.GUI", "TogglePauseMenu", {}, function() + if GUI.GUI.PauseMenuOpen then + local frame = GUI.GUI.PauseMenu + + local list = GetChildren(GetChildren(frame)[2])[1] + + for key, value in pairs(easySettings.Settings) do + local button = GUI.Button( + GUI.RectTransform(Vector2(1, 0.1), list.RectTransform), + value.Name, + GUI.Alignment.Center, + "GUIButtonSmall" + ) + + button.OnClicked = function() + value.OnOpen(frame) + end + end + end +end, Hook.HookMethodType.After) + +easySettings.SaveTable = function(path, tbl) + File.Write(path, json.serialize(tbl)) +end +easySettings.LoadTable = function(path) + if not File.Exists(path) then + return {} + end + + return json.parse(File.Read(path)) +end + +easySettings.AddMenu = function(name, onOpen) + table.insert(easySettings.Settings, { Name = name, OnOpen = onOpen }) +end + +easySettings.BasicList = function(parent, size) + local menuContent = GUI.Frame(GUI.RectTransform(size or Vector2(0.3, 0.6), parent.RectTransform, GUI.Anchor.Center)) + local menuList = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.95), menuContent.RectTransform, GUI.Anchor.TopCenter)) + + easySettings.SaveButton(menuContent) + easySettings.CloseButton(menuContent) + easySettings.ResetButton(menuContent) + + return menuList +end + +easySettings.TickBox = function(parent, text, onSelected, state) + if state == nil then + state = true + end + + local tickBox = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), parent.RectTransform), text) + tickBox.Selected = state + tickBox.OnSelected = function() + onSelected(tickBox.State == GUIComponent.ComponentState.Selected) + end + + return tickBox +end + +easySettings.Slider = function(parent, min, max, onSelected, value) + local scrollBar = GUI.ScrollBar(GUI.RectTransform(Vector2(1, 0.1), parent.RectTransform), 0.1, nil, "GUISlider") + scrollBar.Range = Vector2(min, max) + scrollBar.BarScrollValue = value or max / 2 + scrollBar.OnMoved = function() + onSelected(scrollBar.BarScrollValue) + end + + return scrollBar +end + +--save and exit +easySettings.SaveButton = function(parent) + local button = GUI.Button( + GUI.RectTransform(Vector2(0.33, 0.05), parent.RectTransform, GUI.Anchor.BottomLeft), + "Save and Exit", + GUI.Alignment.Center, + "GUIButton" + ) + + button.OnClicked = function() + if Game.IsMultiplayer and Game.Client.HasPermission(ClientPermissions.ManageSettings) then + NTConfig.SendConfig() + elseif Game.IsSingleplayer then + NTConfig.SaveConfig() + end + GUI.GUI.TogglePauseMenu() + end + + return button +end + +--discard and exit +easySettings.CloseButton = function(parent) + local button = GUI.Button( + GUI.RectTransform(Vector2(0.33, 0.05), parent.RectTransform, GUI.Anchor.BottomCenter), + "Discard and Exit", + GUI.Alignment.Center, + "GUIButton" + ) + + button.OnClicked = function() + GUI.GUI.TogglePauseMenu() + NTConfig.LoadConfig() + end + + return button +end + +--reset and exit +easySettings.ResetButton = function(parent) + local button = GUI.Button( + GUI.RectTransform(Vector2(0.33, 0.05), parent.RectTransform, GUI.Anchor.BottomRight), + "Reset Config", + GUI.Alignment.Center, + "GUIButton" + ) + + button.OnClicked = function() + if + Game.IsSingleplayer or (Game.IsMultiplayer and Game.Client.HasPermission(ClientPermissions.ManageSettings)) + then + easySettings.ResetMessage(parent) + end + end + return button +end + +easySettings.ResetMessage = function(parent) + local ResetMessage = GUI.MessageBox( + "Reset neurotrauma settings", + "Are you sure you want to reset neurotrauma settings to default values?", + { "Yes", "No" } + ) + ResetMessage.DrawOnTop = true + ResetMessage.Text.TextAlignment = GUI.Alignment.Center + ResetMessage.Buttons[1].OnClicked = function() + NTConfig.ResetConfig() + if Game.IsMultiplayer and Game.Client.HasPermission(ClientPermissions.ManageSettings) then + NTConfig.SendConfig() + elseif Game.IsSingleplayer then + NTConfig.SaveConfig() + end + GUI.GUI.TogglePauseMenu() + ResetMessage.Close() + end + ResetMessage.Buttons[2].OnClicked = function() + ResetMessage.Close() + end + return ResetMessage +end + +return easySettings diff --git a/Neurotrauma/Lua/Scripts/Server/blood.lua b/Neurotrauma/Lua/Scripts/Server/blood.lua new file mode 100644 index 0000000..c7ac650 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/blood.lua @@ -0,0 +1,182 @@ +-- Neurotrauma blood types functions +-- Hooks Lua event "characterCreated" to create a randomized blood type for spawned character and sets their immunity to 100 +---@diagnostic disable: lowercase-global, undefined-global +NT.BLOODTYPE = { -- blood types and chance in percent + { "ominus", 7 }, + { "oplus", 37 }, + { "aminus", 6 }, + { "aplus", 36 }, + { "bminus", 2 }, + { "bplus", 8 }, + { "abminus", 1 }, + { "abplus", 3 }, +} +NT.setBlood = {} +NT.foundAny = false + +-- Insert all blood types in one table for RandomizeBlood() +for index, value in ipairs(NT.BLOODTYPE) do + -- print(index," : ",value[1],", ",value[2],"%") + table.insert(NT.setBlood, index, { value[2], value[1] }) +end + +-- Applies math.random() blood type. +-- returns the applied bloodtype as an affliction identifier +function NT.RandomizeBlood(character) + rand = math.random(0, 99) + local i = 0 + for index, value in ipairs(NT.setBlood) do + i = i + value[1] + if i > rand then + HF.SetAffliction(character, value[2], 100) + return value[2] + end + end +end + +Hook.Add("characterCreated", "NT.BloodAndImmunity", function(createdCharacter) + Timer.Wait(function() + if createdCharacter.IsHuman and not createdCharacter.IsDead then + NT.TryRandomizeBlood(createdCharacter) + + -- add immunity + local conditional2 = createdCharacter.CharacterHealth.GetAffliction("immunity") + if conditional2 == nil then + HF.SetAffliction(createdCharacter, "immunity", 100) + end + end + end, 1000) +end) + +-- applies a new bloodtype only if the character doesnt already have one +function NT.TryRandomizeBlood(character) + NT.GetBloodtype(character) +end + +-- returns the bloodtype of the character as an affliction identifier string +-- generates blood type if none present +function NT.GetBloodtype(character) + for index, affliction in ipairs(NT.BLOODTYPE) do + local conditional = character.CharacterHealth.GetAffliction(affliction[1]) + + if conditional ~= nil and conditional.Strength > 0 then + return affliction[1] -- TODO: give out abplus (AB+) to enemy team for blood infusions + end + end + + return NT.RandomizeBlood(character) +end + +function NT.HasBloodtype(character) + for index, affliction in ipairs(NT.BLOODTYPE) do + local conditional = character.CharacterHealth.GetAffliction(affliction[1]) + + if conditional ~= nil and conditional.Strength > 0 then + return true + end + end + + return false +end + +Hook.Add("OnInsertedIntoBloodAnalyzer", "NT.BloodAnalyzer", function(effect, deltaTime, item, targets, position) + -- Hematology Analyzer (bloodanalyzer) can scan inserted blood bags + local owner = item.GetRootInventoryOwner() + if owner == nil then return end + if not LuaUserData.IsTargetType(owner, "Barotrauma.Character") then return end + if not owner.IsPlayer then return end + + local character = owner + local contained = item.OwnInventory.GetItemAt(0) + + local BaseColor = "127,255,255" + local NameColor = "127,255,255" + local LowColor = "127,255,255" + local HighColor = "127,255,255" + local VitalColor = "127,255,255" + + if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then + BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",") + NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",") + LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",") + HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",") + VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",") + end + + -- NT adds bloodbag; NT Blood Work or 'Real Sonar Medical Item Recipes Patch for Neurotrauma' add allblood, lets check for either + if contained ~= nil and (contained.HasTag("bloodbag") or contained.HasTag("allblood")) then + HF.GiveItem(character, "ntsfx_syringe") + Timer.Wait(function() + if item == nil or character == nil or item.OwnInventory.GetItemAt(0) ~= contained then + return + end + + local identifier = contained.Prefab.Identifier.Value + local packtype = "o-" + if identifier ~= "antibloodloss2" then + packtype = string.sub(identifier, string.len("bloodpack") + 1) + end + local bloodTypeDisplay = string.gsub(packtype, "abc", "c") + bloodTypeDisplay = string.gsub(bloodTypeDisplay, "plus", "+") + bloodTypeDisplay = string.gsub(bloodTypeDisplay, "minus", "-") + bloodTypeDisplay = string.upper(bloodTypeDisplay) + + local readoutString = "‖color:" + .. BaseColor + .. "‖" + .. "Bloodpack: " + .. "‖color:end‖" + .. "‖color:" + .. NameColor + .. "‖" + .. bloodTypeDisplay + .. "‖color:end‖" + -- check if acidosis, alkalosis or sepsis + local tags = HF.SplitString(contained.Tags, ",") + local defects = "" + for tag in tags do + if tag == "sepsis" then + defects = defects .. "‖color:" .. VitalColor .. "‖" .. "\nSepsis detected" .. "‖color:end‖" + end + + if HF.StartsWith(tag, "acid") then + local split = HF.SplitString(tag, ":") + if split[2] ~= nil then + defects = defects + .. "‖color:" + .. HighColor + .. "‖" + .. "\nAcidosis: " + .. tonumber(split[2]) + .. "%" + .. "‖color:end‖" + end + elseif HF.StartsWith(tag, "alkal") then + local split = HF.SplitString(tag, ":") + if split[2] ~= nil then + defects = defects + .. "‖color:" + .. HighColor + .. "‖" + .. "\nAlkalosis: " + .. tonumber(split[2]) + .. "%" + .. "‖color:end‖" + end + end + end + if defects ~= "" then + readoutString = readoutString .. defects + else + readoutString = readoutString + .. "‖color:" + .. LowColor + .. "‖" + .. "\nNo blood defects" + .. "‖color:end‖" + end + + HF.DMClient(HF.CharacterToClient(character), readoutString, Color(127, 255, 255, 255)) + end, 1500) + end +end) diff --git a/Neurotrauma/Lua/Scripts/Server/characterpatches.lua b/Neurotrauma/Lua/Scripts/Server/characterpatches.lua new file mode 100644 index 0000000..b5fa1ed --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/characterpatches.lua @@ -0,0 +1,32 @@ +-- Hooks CalculateMovementPenalty method of Barotrauma.Character +-- when painless enough, disable weapon sway / movement hindrance limb penalties +-- !!! Lags the game, skipping this file, and there is no Lua perf tracker to potentially fix, screw it for now + +-- Disable movement penalties for painless characters +-- Has about 2 ms performance drop on a many character save +Hook.Patch("Barotrauma.Character", "CalculateMovementPenalty", function(instance, ptable) + if HF.HasAffliction(instance, "analgesia", 20) then + ptable.PreventExecution = true + return 0 + end +end, Hook.HookMethodType.Before) + +-- Disable aim penalties for painless characters +Hook.Patch("Barotrauma.AnimController", "GetAimWobble", function(instance, ptable) + if HF.HasAffliction(instance.Character, "analgesia", 20) then + ptable.PreventExecution = true + return 0 + end +end, Hook.HookMethodType.Before) + +-- Patch to cause unconscious from the game rather than stun +-- Lags the game by 6 times (on the same save) +Hook.Patch("Barotrauma.CharacterHealth", "get_IsUnconscious", function(instance, ptable) + local isUnconscious = HF.HasAffliction(instance.Character, "sym_unconsciousness") + ptable.PreventExecution = true + return instance.Character.IsDead + or ( + (instance.Character.Vitality <= 0.0 or isUnconscious) + and not instance.Character.HasAbilityFlag(AbilityFlags.AlwaysStayConscious) + ) +end, Hook.HookMethodType.After) diff --git a/Neurotrauma/Lua/Scripts/Server/convertbloodpacks.lua b/Neurotrauma/Lua/Scripts/Server/convertbloodpacks.lua new file mode 100644 index 0000000..f3f21a9 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/convertbloodpacks.lua @@ -0,0 +1,112 @@ +-- THIS FILE IS NO LONGER IN USE +-- the defunct item in question has been removed from the mod +-- i'm keeping it here for...safekeeping i guess + +LuaUserData.RegisterTypeBarotrauma("PurchasedItem") +LuaUserData.RegisterType("System.Xml.Linq.XElement") + +local VANILLA_PREFAB_ID = "antibloodloss2" +local DEFUNCT_PREFAB_ID = "bloodpackominus" + +-- Removes vanilla bloodpacks from cached stores in case the user installed +-- this mod mid-campaign. +-- NOTE: stores that had their stocks generated before installing this mod +-- won't have any new medical items added. +Hook.HookMethod("Barotrauma.Location", "LoadStores", function(instance, ptable) + if instance.Stores == nil then + return + end + + for storeId, store in pairs(instance.Stores) do + for _, purchasedItem in pairs(store.Stock) do + local itemId = purchasedItem.ItemPrefabIdentifier + if itemId == DEFUNCT_PREFAB_ID then + -- print("Removing defunct bloodpack (qty " .. purchasedItem.Quantity .. ") from " .. tostring(storeId)) + store.RemoveStock({ purchasedItem }) + end + end + end +end, Hook.HookMethodType.After) + +-- Replaces all vanilla bloodpack items with O- blood +local function replaceItems() + local ntBloodPrefab = ItemPrefab.Prefabs[DEFUNCT_PREFAB_ID] + local vanillaBloodPrefab = ItemPrefab.Prefabs[VANILLA_PREFAB_ID] + if ntBloodPrefab == nil then + print("ERROR: couldn't find " .. DEFUNCT_PREFAB_ID) + return + end + + for _, item in pairs(Item.ItemList) do + local id = tostring(item.Prefab.Identifier) + if id == DEFUNCT_PREFAB_ID then + -- Don't replace decorative blood packs + if item.NonInteractable then + return + end + + local pos = item.WorldPosition + local inv = item.ParentInventory + local condition = item.ConditionPercentage + local quality = item.Quality + -- print("replacing blood pack (pos=" .. tostring(pos) .. ", inv=" .. tostring(inv) .. ")") + + local slotIdx = -1 + if inv ~= nil then + slotIdx = inv.FindIndex(item) + if slotIdx < 0 then + print( + "ERROR: couldn't find item (" + .. tostring(item) + .. ", pos " + .. tostring(pos) + .. ") in inventory (" + .. tostring(inv) + .. ")" + ) + return + end + end + + -- We call `Drop()` first in case the inventory is full because + -- `AddEntityToRemoveQueue` may not remove the item before we + -- insert the new one, causing the inventory to overflow. + item.Drop() + Entity.Spawner.AddEntityToRemoveQueue(item) + + Entity.Spawner.AddItemToSpawnQueue(vanillaBloodPrefab, pos, condition, quality, function(newItem) + newItem.Rotation = item.Rotation + -- Stolen items stay stolen + newItem.AllowStealing = item.AllowStealing + newItem.OriginalOutpost = item.OriginalOutpost + + if inv ~= nil then + if not inv.TryPutItem(newItem, slotIdx, false, true, nil) then + print( + "ERROR: failed to replace neurotrauma bloodpack (" + .. tostring(item) + .. ", pos " + .. tostring(pos) + .. ", slotIdx " + .. tostring(slotIdx) + .. ", inv " + .. tostring(inv) + .. ") with new item: " + .. tostring(newItem) + ) + end + end + end) + end + end +end + +Hook.Add("roundStart", "NT.ConvertBloodPacks", function() + replaceItems() +end) + +-- Hook.Add("chatMessage", "NT.BloodPackTesting", function(msg, client) +-- if (msg == "convertblood") then +-- replaceItems() +-- end +-- end) diff --git a/Neurotrauma/Lua/Scripts/Server/cpr.lua b/Neurotrauma/Lua/Scripts/Server/cpr.lua new file mode 100644 index 0000000..86eb55e --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/cpr.lua @@ -0,0 +1,41 @@ +-- Hooks Lua event "human.CPRSuccess" to prevent fractures from ragdoll jank, and +-- apply NT affliction cpr_buff or cause rib fractures in Hooked Lua event "human.CPRFailed" +Hook.Add("human.CPRSuccess", "NT.CPRSuccess", function(animcontroller) + if + animcontroller == nil + or animcontroller.Character == nil + or animcontroller.Character.SelectedCharacter == nil + then + return + end + local character = animcontroller.Character.SelectedCharacter + + if not HF.HasAffliction(character, "cpr_buff_auto") then + HF.AddAffliction(character, "cpr_buff", 2) + end + HF.AddAffliction(character, "cpr_fracturebuff", 2) -- prevent fractures during CPR (fuck baro physics) +end) + +Hook.Add("human.CPRFailed", "NT.CPRFailed", function(animcontroller) + if + animcontroller == nil + or animcontroller.Character == nil + or animcontroller.Character.SelectedCharacter == nil + then + return + end + local character = animcontroller.Character.SelectedCharacter + + HF.AddAffliction(character, "cpr_fracturebuff", 2) -- prevent fractures during CPR (fuck baro physics) + HF.AddAfflictionLimb(character, "blunttrauma", LimbType.Torso, 0.3) + if + HF.Chance( + NTConfig.Get("NT_fractureChance", 1) + * NTConfig.Get("NT_CPRFractureChance", 1) + * 0.2 + / HF.GetSkillLevel(animcontroller.Character, "medical") + ) + then + HF.AddAffliction(character, "t_fracture", 1) + end +end) diff --git a/Neurotrauma/Lua/Scripts/Server/falldamage.lua b/Neurotrauma/Lua/Scripts/Server/falldamage.lua new file mode 100644 index 0000000..094c960 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/falldamage.lua @@ -0,0 +1,312 @@ +-- Hooks Lua event "changeFallDamage" to cause more damage and NT afflictions like fractures and artery cuts on extremities depending on severity +local limbtypes = { + LimbType.Torso, + LimbType.Head, + LimbType.LeftArm, + LimbType.RightArm, + LimbType.LeftLeg, + LimbType.RightLeg, +} +local function HasLungs(c) + return not HF.HasAffliction(c, "lungremoved") +end + +local function getCalculatedReductionSuit(armor, strength, limbtype) + if armor == nil then + return 0 + end + local reduction = 0 + + if armor.HasTag("deepdivinglarge") or armor.HasTag("deepdiving") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "blunttrauma") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + elseif armor.HasTag("clothing") and armor.HasTag("smallitem") and limbtype == LimbType.Torso then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "blunttrauma") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + end + return reduction +end +local function getCalculatedReductionClothes(armor, strength, limbtype) + if armor == nil then + return 0 + end + local reduction = 0 + if armor.HasTag("deepdiving") or armor.HasTag("diving") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "blunttrauma") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + elseif armor.HasTag("clothing") and armor.HasTag("smallitem") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "blunttrauma") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + end + return reduction +end +local function getCalculatedReductionHelmet(armor, strength) + if armor == nil then + return 0 + end + local reduction = 0 + + if armor.HasTag("smallitem") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "blunttrauma") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + end + return reduction +end +local function getCalculatedConcussionReduction(armor, strength) + if armor == nil then + return 0 + end + local reduction = 0 + + if armor.HasTag("deepdiving") or armor.HasTag("deepdivinglarge") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + elseif armor.HasTag("smallitem") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + end + return reduction +end +Hook.Add("changeFallDamage", "NT.falldamage", function(impactDamage, character, impactPos, velocity) + -- dont bother with creatures + if not character.IsHuman then + return + end + + -- dont apply fall damage in water + if character.InWater then + return 0 + end + + -- dont apply fall damage when dragged by someone + if character.SelectedBy ~= nil then + return 0 + end + + local velocityMagnitude = HF.Magnitude(velocity) + velocityMagnitude = velocityMagnitude ^ 1.5 + + -- apply fall damage to all limbs based on fall direction + local mainlimbPos = character.AnimController.MainLimb.WorldPosition + + local limbDotResults = {} + local minDotRes = 1000 + + for limb in character.AnimController.Limbs do + for type in limbtypes do + if limb.type == type then + -- fetch the direction of each limb relative to the torso + local limbPosition = limb.WorldPosition + local posDif = limbPosition - mainlimbPos + posDif.X = posDif.X / 100 + posDif.Y = posDif.Y / 100 + local posDifMagnitude = HF.Magnitude(posDif) + if posDifMagnitude > 1 then + posDif.Normalize() + end + + local normalizedVelocity = Vector2(velocity.X, velocity.Y) + normalizedVelocity.Normalize() + + -- compare those directions to the direction we're moving + -- this will later be used to hurt the limbs facing impact more than the others + local limbDot = Vector2.Dot(posDif, normalizedVelocity) + limbDotResults[type] = limbDot + if minDotRes > limbDot then + minDotRes = limbDot + end + break + end + end + end + + -- shift all weights out of the negatives + -- increase the weight of all limbs if speed is high + -- the effect of this is that, at higher speeds, all limbs take damage instead of mainly the ones facing the impact site + for type, dotResult in pairs(limbDotResults) do + limbDotResults[type] = dotResult - minDotRes + math.max(0, (velocityMagnitude - 30) / 10) + end + + -- count weight so we're able to distribute the damage fractionally + local weightsum = 0 + for dotResult in limbDotResults do + weightsum = weightsum + dotResult + end + + for type, dotResult in pairs(limbDotResults) do + local relativeWeight = dotResult / weightsum + + -- lets limit the numbers to the max value of blunttrauma so that resistances make sense + local damageInflictedToThisLimb = math.min( + relativeWeight * math.max(0, velocityMagnitude - 10) ^ 1.5 * NTConfig.Get("NT_falldamage", 1) * 0.5, + 200 + ) + NT.CauseFallDamage(character, type, damageInflictedToThisLimb) + end + + -- make the normal damage not run + return 0 +end) +NT.CauseFallDamage = function(character, limbtype, strength) + local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.InnerClothes) + if limbtype ~= LimbType.Head then + strength = math.max( + strength + - getCalculatedReductionSuit(armor1, strength, limbtype) + - getCalculatedReductionClothes(armor2, strength, limbtype), + 0 + ) + else + armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + strength = math.max( + strength + - getCalculatedReductionSuit(armor1, strength, limbtype) + - getCalculatedReductionHelmet(armor2, strength, limbtype), + 0 + ) + end + + -- additionally calculate the affliction reduced damage + local prefab = AfflictionPrefab.Prefabs["blunttrauma"] + local resistance = character.CharacterHealth.GetResistance(prefab, limbtype) + if resistance >= 1 then + return + end + strength = strength * (1 - resistance) + HF.AddAfflictionLimb(character, "blunttrauma", limbtype, strength) + + -- return earlier if the strength value is not high enough for damage checks + if strength < 1 then + return + end + + local fractureImmune = false + + local injuryChanceMultiplier = NTConfig.Get("NT_falldamageSeriousInjuryChance", 1) + + -- torso + if not fractureImmune and strength >= 1 and limbtype == LimbType.Torso then + if + HF.Chance( + (strength - 15) + / 100 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + * injuryChanceMultiplier + ) + then + NT.BreakLimb(character, limbtype) + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + strength + / 70 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + end + end + + -- head + if not fractureImmune and strength >= 1 and limbtype == LimbType.Head then + if strength >= 15 and HF.Chance(math.min(strength / 100, 0.7)) then + HF.AddAfflictionResisted( + character, + "concussion", + math.max( + 10 + - getCalculatedConcussionReduction(armor1, 10, limbtype) + - getCalculatedConcussionReduction(armor2, 10, limbtype), + 0 + ) + ) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 15) / 100, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + * injuryChanceMultiplier + ) + then + NT.BreakLimb(character, limbtype) + end + if + strength >= 55 + and HF.Chance( + math.min((strength - 55) / 100, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + * injuryChanceMultiplier + ) + then + HF.AddAffliction(character, "n_fracture", 5) + end + if strength >= 5 and HF.Chance(0.7) then + HF.AddAffliction(character, "cerebralhypoxia", strength * HF.RandomRange(0.1, 0.4)) + end + end + + -- extremities + if not fractureImmune and strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + HF.Chance( + (strength - 15) + / 100 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + * injuryChanceMultiplier + ) + then + NT.BreakLimb(character, limbtype) + if HF.Chance((strength - 2) / 60) then + -- this is here to simulate open fractures + NT.ArteryCutLimb(character, limbtype) + end + end + if + HF.Chance( + HF.Clamp((strength - 5) / 120, 0, 0.5) + * NTC.GetMultiplier(character, "dislocationchance") + * NTConfig.Get("NT_dislocationChance", 1) + * injuryChanceMultiplier + ) and not NT.LimbIsAmputated(character, limbtype) + then + NT.DislocateLimb(character, limbtype) + end + end +end diff --git a/Neurotrauma/Lua/Scripts/Server/fuckbots.lua b/Neurotrauma/Lua/Scripts/Server/fuckbots.lua new file mode 100644 index 0000000..2b79d03 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/fuckbots.lua @@ -0,0 +1,23 @@ +-- hopefully this stops bots from doing any rescuing at all. +-- and also hopefully my assumption that this very specific thing +-- about bots is what is causing them to eat frames is correct. + +if NTConfig.Get("NT_disableBotAlgorithms", true) then + Hook.Patch("Barotrauma.AIObjectiveRescueAll", "IsValidTarget", { + "Barotrauma.Character", + "Barotrauma.Character", + "out System.Boolean", + }, function(instance, ptable) + -- TODO: some bot behavior + -- make it hostile act if: + -- surgery without corresponding ailments + -- treatment without ailments + + -- basic self treatments: + -- find items to treat each other for blood loss or bleeding or suturable damage or fractures and dislocations + -- ^ would possibly need items to have proper suitable treatments too, and yk bots dont spawn with enough meds... + + ptable.PreventExecution = true + return false + end, Hook.HookMethodType.Before) +end diff --git a/Neurotrauma/Lua/Scripts/Server/humanupdate.lua b/Neurotrauma/Lua/Scripts/Server/humanupdate.lua new file mode 100644 index 0000000..5a9866b --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/humanupdate.lua @@ -0,0 +1,2053 @@ +-- Neurotrauma human update functions +-- Hooks Lua event "think" to update and use for applying NT specific character data (its called 'c') with +-- values/functions defined here in NT.UpdateHuman, NT.LimbAfflictions and NT.Afflictions +NT.UpdateCooldown = 0 +NT.UpdateInterval = 120 +NT.Deltatime = NT.UpdateInterval / 60 -- Time in seconds that transpires between updates + +Hook.Add("think", "NT.update", function() + if HF.GameIsPaused() then + return + end + + NT.UpdateCooldown = NT.UpdateCooldown - 1 + if NT.UpdateCooldown <= 0 then + NT.UpdateCooldown = NT.UpdateInterval + NT.Update() + end + + NT.TickUpdate() +end) + +-- gets run once every two seconds +function NT.Update() + local updateHumans = {} + local amountHumans = 0 + local updateMonsters = {} + local amountMonsters = 0 + + -- fetchcharacters to update + for key, character in pairs(Character.CharacterList) do + if not character.IsDead then + if character.IsHuman then + table.insert(updateHumans, character) + amountHumans = amountHumans + 1 + else + table.insert(updateMonsters, character) + amountMonsters = amountMonsters + 1 + end + end + end + + -- we spread the characters out over the duration of an update so that the load isnt done all at once + for key, value in pairs(updateHumans) do + -- make sure theyre still alive and human + if value ~= nil and not value.Removed and value.IsHuman and not value.IsDead then + Timer.Wait(function() + if value ~= nil and not value.Removed and value.IsHuman and not value.IsDead then + NT.UpdateHuman(value) + end + end, ((key + 1) / amountHumans) * NT.Deltatime * 1000) + end + end + + -- we spread the monsters out over the duration of an update so that the load isnt done all at once + for key, value in pairs(updateMonsters) do + -- make sure theyre still alive + if value ~= nil and not value.Removed and not value.IsDead then + Timer.Wait(function() + if value ~= nil and not value.Removed and not value.IsDead then + NT.UpdateMonster(value) + end + end, ((key + 1) / amountMonsters) * NT.Deltatime * 1000) + end + end +end + +-- some local functions to avoid code duplicates +local function limbLockedInitial(c, limbtype, key) + return not NTC.GetSymptomFalse(c.character, key) + and ( + NTC.GetSymptom(c.character, key) + or c.afflictions.t_paralysis.strength > 0 + or NT.LimbIsAmputated(c.character, limbtype) + or (HF.GetAfflictionStrengthLimb(c.character, limbtype, "bandaged", 0) <= 0 and HF.GetAfflictionStrengthLimb( + c.character, + limbtype, + "dirtybandage", + 0 + ) <= 0 and NT.LimbIsDislocated(c.character, limbtype)) + or ( + HF.GetAfflictionStrengthLimb(c.character, limbtype, "gypsumcast", 0) <= 0 + and NT.LimbIsBroken(c.character, limbtype) + ) + ) +end +NT.organDamageCalc = function(c, damagevalue, nomaxstrength) + if damagevalue >= 99 and (nomaxstrength == nil or nomaxstrength == false) then + return 100 + end + return damagevalue - 0.01 * c.stats.healingrate * c.stats.specificOrganDamageHealMultiplier * NT.Deltatime +end +local function kidneyDamageCalc(c, damagevalue) + if damagevalue >= 99 then + return 100 + end + if damagevalue >= 50 then + if damagevalue <= 51 then + return damagevalue + end + return damagevalue - 0.01 * c.stats.healingrate * c.stats.specificOrganDamageHealMultiplier * NT.Deltatime + end + return damagevalue - 0.02 * c.stats.healingrate * c.stats.specificOrganDamageHealMultiplier * NT.Deltatime +end +local function isExtremity(type) + return type ~= LimbType.Torso and type ~= LimbType.Head +end +local limbtypes = { + LimbType.Torso, + LimbType.Head, + LimbType.LeftArm, + LimbType.RightArm, + LimbType.LeftLeg, + LimbType.RightLeg, +} + +-- define all the afflictions and their update functions +NT.Afflictions = { + -- Arterial cuts + t_arterialcut = {}, + -- Fractures and amputations + t_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.Torso)) + * NT.Deltatime + end + end, + }, + h_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.Head)) + * NT.Deltatime + end + end, + }, + la_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.LeftArm)) + * NT.Deltatime + end + end, + }, + ra_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.RightArm)) + * NT.Deltatime + end + end, + }, + ll_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.LeftLeg)) + * NT.Deltatime + end + end, + }, + rl_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.RightLeg)) + * NT.Deltatime + end + end, + }, + n_fracture = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + + 2 + * HF.BoolToNum(not HF.HasAfflictionLimb(c.character, "gypsumcast", LimbType.Head)) + * NT.Deltatime + end + end, + }, + tla_amputation = {}, + tra_amputation = {}, + tll_amputation = {}, + trl_amputation = {}, + sla_amputation = {}, + sra_amputation = {}, + sll_amputation = {}, + srl_amputation = {}, + t_paralysis = {}, + alv = {}, -- artificial ventilation + needlec = { + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - 0.15 * NT.Deltatime + end, + }, + forceprone = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and not c.character.IsClimbing + and ( + NTC.GetSymptom(c.character, i) + or (c.stats.lockleftleg and c.stats.lockrightleg and not c.stats.wheelchaired) + or c.character.IsKeyDown(InputType.Attack) + ), + 2 + ) + end, + }, + onwheelchair = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.stats.wheelchaired), + 2 + ) + end, + }, + + -- Organ conditions + cardiacarrest = { + update = function(c, i) + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_cardiacarrest") + and ( + NTC.GetSymptom(c.character, "triggersym_cardiacarrest") + or c.stats.stasis + or c.afflictions.heartremoved.strength > 0 + or c.afflictions.brainremoved.strength > 0 + or (c.afflictions.heartdamage.strength > 99 and HF.Chance(0.3)) + or (c.afflictions.traumaticshock.strength > 40 and HF.Chance(0.1)) + or (c.afflictions.coma.strength > 40 and HF.Chance(0.03)) + or (c.afflictions.hypoxemia.strength > 80 and HF.Chance(0.01)) + or ( + c.afflictions.fibrillation.strength > 20 + and HF.Chance((c.afflictions.fibrillation.strength / 100) ^ 4) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 10 + end + end, + }, + respiratoryarrest = { + update = function(c, i) + -- passive regen + c.afflictions[i].strength = c.afflictions[i].strength + - (0.05 + HF.BoolToNum(c.afflictions.sym_unconsciousness.strength < 0.1, 0.45)) * NT.Deltatime + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_respiratoryarrest") + and ( + NTC.GetSymptom(c.character, "triggersym_respiratoryarrest") + or c.stats.stasis + or c.afflictions.lungremoved.strength > 0 + or c.afflictions.brainremoved.strength > 0 + or c.afflictions.opiateoverdose.strength > 60 + or (c.afflictions.lungdamage.strength > 99 and HF.Chance(0.8)) + or (c.afflictions.traumaticshock.strength > 30 and HF.Chance(0.2)) + or ( + (c.afflictions.cerebralhypoxia.strength > 100 or c.afflictions.hypoxemia.strength > 70) + and HF.Chance(0.05) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 10 + end + end, + }, + pneumothorax = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = HF.Clamp( + c.afflictions[i].strength + + NT.Deltatime + * ( + 0.5 -- gain 0.5/s + - HF.BoolToNum(c.afflictions[i].strength > 15) + * HF.Clamp(c.afflictions.needlec.strength, 0, 1) + ), -- ...except if needled and >15%, then lose 0.5/s + 0, + 100 + ) + end + end, + }, + tamponade = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = c.afflictions[i].strength + NT.Deltatime * 0.5 + end + + if c.afflictions.heartremoved.strength > 0 then + c.afflictions[i].strength = 0 + end + end, + }, + heartattack = { + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime + + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_heartattack") + and not c.stats.stasis + and c.afflictions.afstreptokinase.strength <= 0 + and c.afflictions.heartremoved.strength <= 0 + and ( + NTC.GetSymptom(c.character, "triggersym_heartattack") + or ( + c.afflictions.bloodpressure.strength > 150 + and HF.Chance( + NTConfig.Get("NT_heartattackChance", 1) + * ((c.afflictions.bloodpressure.strength - 150) / 50 * 0.02) + ) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 50 + end + + if c.afflictions.heartremoved.strength > 0 then + c.afflictions[i].strength = 0 + end + end, + }, + -- Organs removed + brainremoved = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = 1 + + HF.BoolToNum(HF.HasAfflictionLimb(c.character, "retractedskin", LimbType.Head, 99), 99) + end + end, + }, + heartremoved = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = 1 + + HF.BoolToNum(HF.HasAfflictionLimb(c.character, "retractedskin", LimbType.Torso, 99), 99) + end + end, + }, + lungremoved = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = 1 + + HF.BoolToNum(HF.HasAfflictionLimb(c.character, "retractedskin", LimbType.Torso, 99), 99) + end + end, + }, + liverremoved = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = 1 + + HF.BoolToNum(HF.HasAfflictionLimb(c.character, "retractedskin", LimbType.Torso, 99), 99) + end + end, + }, + kidneyremoved = { + update = function(c, i) + if c.afflictions[i].strength > 0 then + c.afflictions[i].strength = 1 + + HF.BoolToNum(HF.HasAfflictionLimb(c.character, "retractedskin", LimbType.Torso, 99), 99) + end + end, + }, + -- Organ damage + cerebralhypoxia = { + max = 200, + update = function(c, i) + if c.stats.stasis then + return + end + -- calculate new neurotrauma + local gain = ( + -0.1 * c.stats.healingrate -- passive regen + + c.afflictions.hypoxemia.strength / 100 -- from hypoxemia + + HF.Clamp(c.afflictions.stroke.strength, 0, 20) * 0.1 -- from stroke + + c.afflictions.sepsis.strength / 100 * 0.4 -- from sepsis + + c.afflictions.liverdamage.strength / 800 -- from liverdamage + + c.afflictions.kidneydamage.strength / 1000 -- from kidneydamage + + c.afflictions.traumaticshock.strength / 100 -- from traumatic shock + ) * NT.Deltatime + + if gain > 0 then + gain = gain + * NTC.GetMultiplier(c.character, "neurotraumagain") -- NTC multiplier + * NTConfig.Get("NT_neurotraumaGain", 1) -- Config multiplier + * (1 - HF.Clamp(c.afflictions.afmannitol.strength, 0, 0.5)) -- half if mannitol + end + + c.afflictions[i].strength = c.afflictions[i].strength + gain + + c.afflictions[i].strength = HF.Clamp(c.afflictions[i].strength, 0, 200) + end, + }, + heartdamage = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = NT.organDamageCalc( + c, + c.afflictions[i].strength + + NTC.GetMultiplier(c.character, "heartdamagegain") + * (c.stats.neworgandamage + HF.Clamp(c.afflictions.heartattack.strength, 0, 0.5) * NT.Deltatime) + ) + end, + }, + lungdamage = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = NT.organDamageCalc( + c, + c.afflictions.lungdamage.strength + + NTC.GetMultiplier(c.character, "lungdamagegain") + * (c.stats.neworgandamage + math.max(c.afflictions.radiationsickness.strength - 25, 0) / 800 * NT.Deltatime) + ) + end, + }, + liverdamage = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = NT.organDamageCalc( + c, + c.afflictions.liverdamage.strength + + NTC.GetMultiplier(c.character, "liverdamagegain") * c.stats.neworgandamage + ) + if + c.afflictions[i].strength >= 99 + and not NTC.GetSymptom(c.character, "sym_hematemesis") + and HF.Chance(0.05) + then + -- if liver failed: 5% chance for 6-20 seconds of blood vomiting and internal bleeding + NTC.SetSymptomTrue(c.character, "sym_hematemesis", math.random(3, 10)) + c.afflictions.internalbleeding.strength = c.afflictions.internalbleeding.strength + 2 + end + end, + }, + kidneydamage = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = kidneyDamageCalc( + c, + c.afflictions.kidneydamage.strength + + NTC.GetMultiplier(c.character, "kidneydamagegain") + * (c.stats.neworgandamage + HF.Clamp((c.afflictions.bloodpressure.strength - 120) / 160, 0, 0.5) * NT.Deltatime * 0.5) + ) + if + c.afflictions[i].strength >= 60 + and not NTC.GetSymptom(c.character, "sym_vomiting") + and HF.Chance((c.afflictions[i].strength - 60) / 40 * 0.07) + then + -- at 60% kidney damage: 0% chance for vomiting + -- at 100% kidney damage: 7% chance for vomiting + NTC.SetSymptomTrue(c.character, "sym_vomiting", math.random(3, 10)) + end + end, + }, + bonedamage = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = NT.organDamageCalc( + c, + c.afflictions.bonedamage.strength + + NTC.GetMultiplier(c.character, "bonedamagegain") + * (c.afflictions.sepsis.strength / 500 + c.afflictions.hypoxemia.strength / 1000 + math.max( + c.afflictions.radiationsickness.strength - 25, + 0 + ) / 600) + * NT.Deltatime + ) + if c.afflictions[i].strength < 90 then + c.afflictions[i].strength = c.afflictions[i].strength - (c.stats.bonegrowthCount * 0.3) * NT.Deltatime + elseif c.stats.bonegrowthCount >= 6 then + c.afflictions[i].strength = c.afflictions[i].strength - 2 * NT.Deltatime + end + if c.afflictions.kidneydamage.strength > 70 then + c.afflictions[i].strength = c.afflictions[i].strength + + (c.afflictions.kidneydamage.strength - 70) / 30 * 0.15 * NT.Deltatime + end + end, + }, + organdamage = { + max = 200, + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = + NT.organDamageCalc(c, c.afflictions.organdamage.strength + c.stats.neworgandamage, true) + end, + }, + -- Blood + sepsis = { + update = function(c, i) + if c.afflictions.afantibiotics.strength > 0.1 then + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime + end + if c.stats.stasis then + return + end + if c.afflictions[i].strength > 0.1 then + c.afflictions[i].strength = c.afflictions[i].strength + 0.05 * NT.Deltatime + end + end, + }, + immunity = { + default = -1, + min = 5, + update = function(c, i) + if c.afflictions[i].strength == -1 then + -- no immunity affliction! + -- assume it has been wiped by "revive" or "heal all", attempt to assign new blood type + if NT.HasBloodtype(c.character) then + -- if blood type is already here, set immunity to the minimum + c.afflictions[i].strength = 5 + else + -- no bloodtype -> all afflictions have been cleared, set immunity to maximum + c.afflictions[i].strength = 100 + NT.TryRandomizeBlood(c.character) + end + end + if c.stats.stasis then + return + end + + -- immunity regeneration + c.afflictions[i].strength = + HF.Clamp(c.afflictions[i].strength + (0.5 + c.afflictions[i].strength / 100) * NT.Deltatime, 5, 100) + end, + }, + bloodloss = { max = 200 }, + bloodpressure = { + min = 5, + max = 200, + default = 100, + update = function(c, i) + -- fix people not having a blood pressure + if not HF.HasAffliction(c.character, i) then + HF.SetAffliction(c.character, i, 100) + end + + if c.stats.stasis then + return + end + -- calculate new blood pressure + local desiredbloodpressure = ( + c.stats.bloodamount + - c.afflictions.tamponade.strength / 2 -- -50 if full tamponade + - HF.Clamp(c.afflictions.afpressuredrug.strength * 5, 0, 45) -- -45 if blood pressure medication + - HF.Clamp(c.afflictions.anesthesia.strength, 0, 15) -- -15 if propofol (fuck propofol) + + HF.Clamp(c.afflictions.afadrenaline.strength * 10, 0, 30) -- +30 if adrenaline + + HF.Clamp(c.afflictions.afsaline.strength * 5, 0, 30) -- +30 if saline + + HF.Clamp(c.afflictions.afringerssolution.strength * 5, 0, 30) -- +30 if ringers + ) + * (1 + 0.5 * ((c.afflictions.liverdamage.strength / 100) ^ 2)) -- elevated if full liver damage + * (1 + 0.5 * ((c.afflictions.kidneydamage.strength / 100) ^ 2)) -- elevated if full kidney damage + * (1 + c.afflictions.alcoholwithdrawal.strength / 200) -- elevated if alcohol withdrawal + * HF.Clamp((100 - c.afflictions.traumaticshock.strength * 2) / 100, 0, 1) -- none if half or more traumatic shock + * ((100 - c.afflictions.fibrillation.strength) / 100) -- lowered if fibrillated + * (1 - math.min(1, c.afflictions.cardiacarrest.strength)) -- none if cardiac arrest + * NTC.GetMultiplier(c.character, "bloodpressure") + + local bloodpressurelerp = 0.2 * NTC.GetMultiplier(c.character, "bloodpressurerate") + -- adjust three times slower to heightened blood pressure + if desiredbloodpressure > c.afflictions.bloodpressure.strength then + bloodpressurelerp = bloodpressurelerp / 3 + end + c.afflictions.bloodpressure.strength = HF.Clamp( + HF.Round(HF.Lerp(c.afflictions.bloodpressure.strength, desiredbloodpressure, bloodpressurelerp), 2), + 5, + 200 + ) + end, + }, + hypoxemia = { + update = function(c, i) + if c.stats.stasis then + return + end + -- completely cancel out hypoxemia regeneration if penumothorax is full + c.stats.availableoxygen = math.min(c.stats.availableoxygen, 100 - c.afflictions.pneumothorax.strength / 2) + + local hypoxemiagain = NTC.GetMultiplier(c.character, "hypoxemiagain") + local regularHypoxemiaChange = (-c.stats.availableoxygen + 50) / 8 + if regularHypoxemiaChange > 0 then + -- not enough oxygen, increase hypoxemia + regularHypoxemiaChange = regularHypoxemiaChange * hypoxemiagain + else + -- enough oxygen, decrease hypoxemia + regularHypoxemiaChange = + HF.Lerp(regularHypoxemiaChange * 2, 0, HF.Clamp((50 - c.stats.bloodamount) / 50, 0, 1)) + end + c.afflictions.hypoxemia.strength = HF.Clamp( + c.afflictions.hypoxemia.strength + + ( + -math.min(0, (c.afflictions.bloodpressure.strength - 70) / 7) * hypoxemiagain -- loss because of low blood pressure (+10 at 0 bp) + - math.min(0, (c.stats.bloodamount - 60) / 4) * hypoxemiagain -- loss because of low blood amount (+15 at 0 blood) + + regularHypoxemiaChange -- change because of oxygen in lungs (+6.25 <> -12.5) + ) + * NT.Deltatime, + 0, + 100 + ) + end, + }, + hemotransfusionshock = {}, + -- Other + oxygenlow = { + max = 200, + update = function(c, i) + -- respiratory arrest? -> oxygen in lungs rapidly decreases + if c.afflictions.respiratoryarrest.strength > 0 then + c.afflictions.oxygenlow.strength = c.afflictions.oxygenlow.strength + 15 * NT.Deltatime + end + end, + }, + radiationsickness = { + max = 200, + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime * 0.02 + end, + }, + stasis = {}, + table = {}, + internalbleeding = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime * 0.02 * c.stats.clottingrate + if c.afflictions[i].strength > 0 then + c.afflictions.bloodloss.strength = c.afflictions.bloodloss.strength + + c.afflictions[i].strength * (1 / 40) * NT.Deltatime + end + end, + }, + acidosis = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = c.afflictions[i].strength + + HF.BoolToNum(c.afflictions.hypoventilation.strength > 0 and c.afflictions.alv.strength <= 0.1) * 0.09 * NT.Deltatime + + HF.BoolToNum( + ( + c.afflictions.cardiacarrest.strength + + c.afflictions.respiratoryarrest.strength * HF.BoolToNum(c.afflictions.alv.strength <= 0.1) + ) > 0 + ) * 0.18 * NT.Deltatime + + math.max(0, c.afflictions.kidneydamage.strength - 80) / 20 * 0.1 * NT.Deltatime + - NT.Deltatime * 0.03 + end, + }, + alkalosis = { + update = function(c, i) + if not c.stats.stasis then + c.afflictions[i].strength = c.afflictions[i].strength + - NT.Deltatime * 0.03 + + HF.Clamp(c.afflictions.hyperventilation.strength, 0, 1) * 0.09 * NT.Deltatime + + HF.Clamp(c.afflictions.sym_vomiting.strength, 0, 1) * 0.1 * NT.Deltatime + + HF.Clamp(HF.GetAfflictionStrength(c.character, "nausea", 0), 0, 1) * 0.1 * NT.Deltatime + end + if c.afflictions.acidosis.strength > 1 and c.afflictions.alkalosis.strength > 1 then + local min = math.min(c.afflictions.acidosis.strength, c.afflictions.alkalosis.strength) + c.afflictions.acidosis.strength = c.afflictions.acidosis.strength - min + c.afflictions.alkalosis.strength = c.afflictions.alkalosis.strength - min + end + end, + }, + seizure = { + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime + + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_seizure") + and not c.stats.stasis + and ( + NTC.GetSymptom(c.character, "triggersym_seizure") + or (c.afflictions.stroke.strength > 1 and HF.Chance(0.05)) + or (c.afflictions.acidosis.strength > 60 and HF.Chance(0.05)) + or (c.afflictions.alkalosis.strength > 60 and HF.Chance(0.05)) + or HF.Chance(HF.Minimum(c.afflictions.radiationsickness.strength, 50, 0) / 200 * 0.1) + or (c.afflictions.alcoholwithdrawal.strength > 50 and HF.Chance( + c.afflictions.alcoholwithdrawal.strength / 1000 + )) + or ( + c.afflictions.opiateoverdose.strength > 60 + and HF.Chance(c.afflictions.opiateoverdose.strength / 500) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 10 + end + + -- check for spasm trigger + if c.afflictions[i].strength > 0.1 then + for type in limbtypes do + if HF.Chance(0.5) then + HF.AddAfflictionLimb(c.character, "spasm", type, 10) + end + end + end + end, + }, + stroke = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = c.afflictions[i].strength - (1 / 20) * c.stats.clottingrate * NT.Deltatime + + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_stroke") + and not c.stats.stasis + and ( + NTC.GetSymptom(c.character, "triggersym_stroke") + or ( + c.afflictions.bloodpressure.strength > 150 + and HF.Chance( + NTConfig.Get("NT_strokeChance", 1) + * ( + (c.afflictions.bloodpressure.strength - 150) / 50 * 0.02 + + HF.Clamp(c.afflictions.afstreptokinase.strength, 0, 1) * 0.05 + ) + ) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 5 + end + end, + }, + coma = { + update = function(c, i) + if c.stats.stasis then + return + end + c.afflictions[i].strength = c.afflictions[i].strength - NT.Deltatime / 5 + + -- triggers + if + not NTC.GetSymptomFalse(c.character, "triggersym_coma") + and not c.stats.stasis + and ( + NTC.GetSymptom(c.character, "triggersym_coma") + or (c.afflictions.cardiacarrest.strength > 1 and HF.Chance(0.05)) + or (c.afflictions.stroke.strength > 1 and HF.Chance(0.05)) + or ( + c.afflictions.acidosis.strength > 60 + and HF.Chance(0.05 + (c.afflictions.acidosis.strength - 60) / 100) + ) + ) + then + c.afflictions[i].strength = c.afflictions[i].strength + 14 + end + end, + }, + stun = { + max = 30, + update = function(c, i) + if c.afflictions.t_paralysis.strength > 0 or c.afflictions.anesthesia.strength > 15 then + c.afflictions[i].strength = math.max(5, c.afflictions[i].strength) + end + end, + apply = function(c, i, newval) + -- using the character stun property to apply instead of an affliction so that the networking doesnt shit itself (hopefully) + c.character.Stun = newval + end, + }, + slowdown = { + lateupdate = function(c, i) + c.afflictions[i].strength = HF.Clamp(100 * (1 - c.stats.speedmultiplier), 0, 100) + end, + }, + givein = { + max = 1, + update = function(c, i) + c.afflictions[i].strength = + HF.BoolToNum(c.afflictions.t_paralysis.strength > 0 or c.afflictions.sym_unconsciousness.strength > 0) + end, + }, + lockedhands = { + update = function(c, i) + -- arm locking + local leftlockitem = c.character.Inventory.FindItemByIdentifier("armlock2", false) + local rightlockitem = c.character.Inventory.FindItemByIdentifier("armlock1", false) + + -- handcuffs + local handcuffs = c.character.Inventory.FindItemByIdentifier("handcuffs", false) + local handcuffed = handcuffs ~= nil and c.character.Inventory.FindIndex(handcuffs) <= 6 + if handcuffed then + -- drop non-handcuff items + local leftHandItem = HF.GetItemInLeftHand(c.character) + local rightHandItem = HF.GetItemInRightHand(c.character) + if leftHandItem ~= nil and leftHandItem ~= handcuffs and leftlockitem == nil then + leftHandItem.Drop(c.character) + end + if rightHandItem ~= nil and rightHandItem ~= handcuffs and rightlockitem == nil then + rightHandItem.Drop(c.character) + end + end + + local leftarmlocked = leftlockitem ~= nil and not handcuffed + local rightarmlocked = rightlockitem ~= nil and not handcuffed + + if leftarmlocked and not c.stats.lockleftarm then + HF.RemoveItem(leftlockitem) + end + if rightarmlocked and not c.stats.lockrightarm then + HF.RemoveItem(rightlockitem) + end + + if not leftarmlocked and c.stats.lockleftarm then + HF.ForceArmLock(c.character, "armlock2") + end + if not rightarmlocked and c.stats.lockrightarm then + HF.ForceArmLock(c.character, "armlock1") + end + + c.afflictions[i].strength = HF.BoolToNum((c.stats.lockleftarm and c.stats.lockrightarm) or handcuffed, 100) + end, + }, + traumaticshock = { + update = function(c, i) + local shouldReduce = (c.stats.sedated and c.afflictions.table.strength > 0) + or c.afflictions.anesthesia.strength > 15 + c.afflictions[i].strength = c.afflictions[i].strength + - (0.5 + HF.BoolToNum(shouldReduce, 1.5)) * NT.Deltatime + + if c.afflictions[i].strength > 5 and c.afflictions.sym_unconsciousness.strength < 0.1 then + HF.AddAffliction(c.character, "shockpain", 10 * NT.Deltatime) + HF.AddAffliction(c.character, "psychosis", c.afflictions[i].strength / 100 * NT.Deltatime) + end + end, + }, + alcoholwithdrawal = {}, + opiatewithdrawal = {}, + chemwithdrawal = {}, + opiateoverdose = {}, + -- Drugs + analgesia = { max = 200 }, + + -- propofol (i hate it) + anesthesia = { + update = function(c, i) + if c.afflictions[i].strength <= 0 then + return + end + -- cause bloody vomiting or hallucinations sometimes (real sideeffects of propofol!) + if HF.Chance(0.06) then + local case = math.random() + local casecount = 7 + + if case < 1 / casecount then + NTC.SetSymptomTrue(c.character, "sym_hematemesis", 5 + math.random() * 10) + elseif case < 2 / casecount then + NTC.SetSymptomTrue(c.character, "sym_blurredvision", 5 + math.random() * 10) + elseif case < 3 / casecount then + NTC.SetSymptomTrue(c.character, "sym_confusion", 5 + math.random() * 10) + elseif case < 4 / casecount then + NTC.SetSymptomTrue(c.character, "sym_fever", 5 + math.random() * 10) + elseif case < 5 / casecount then + NTC.SetSymptomTrue(c.character, "triggersym_seizure", 1 + math.random() * 2) + elseif case < 6 / casecount then + NT.Fibrillate(c.character, 5 + math.random() * 30) + else + HF.AddAffliction(c.character, "psychosis", 10) + end + end + end, + }, + drunk = { max = 200 }, + afadrenaline = {}, + afantibiotics = {}, + afthiamine = {}, + afsaline = {}, + afringerssolution = {}, + afstreptokinase = {}, + afmannitol = {}, + afpressuredrug = { + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - 0.25 * NT.Deltatime + end, + }, + concussion = { + update = function(c, i) + c.afflictions[i].strength = c.afflictions[i].strength - 0.01 * NT.Deltatime + if c.afflictions[i].strength <= 0 then + return + end + + -- cause headaches, blurred vision, nausea, confusion + if HF.Chance(HF.Clamp(c.afflictions[i].strength / 10 * 0.08, 0.02, 0.08)) then + local case = math.random() + + if case < 0.25 then + NTC.SetSymptomTrue(c.character, "sym_nausea", 5 + math.random() * 10) + elseif case < 0.5 then + NTC.SetSymptomTrue(c.character, "sym_blurredvision", 5 + math.random() * 9) + elseif case < 0.75 then + NTC.SetSymptomTrue(c.character, "sym_headache", 6 + math.random() * 8) + else + NTC.SetSymptomTrue(c.character, "sym_confusion", 6 + math.random() * 8) + end + end + end, + }, + + -- /// Symptoms /// + --============================================================================== + sym_unconsciousness = { + update = function(c, i) + local isUnconscious = not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.stats.stasis + or c.afflictions.brainremoved.strength > 0 + or (not HF.HasAffliction(c.character, "implacable", 0.05) and (c.character.Vitality <= 0 or c.afflictions.hypoxemia.strength > 80)) + or c.afflictions.cerebralhypoxia.strength > 100 + or c.afflictions.coma.strength > 15 + or c.afflictions.t_arterialcut.strength > 0 + or c.afflictions.seizure.strength > 0.1 + or c.afflictions.opiateoverdose.strength > 60 + ) + c.afflictions[i].strength = HF.BoolToNum(isUnconscious, 2) + if isUnconscious then + c.afflictions.stun.strength = math.max(7, c.afflictions.stun.strength) + end + end, + }, + tachycardia = { + update = function(c, i) + -- harmless symptom (doesnt lead to fibrillation) + local hasSymHarmless = not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.cardiacarrest.strength < 1 + and c.afflictions.heartremoved.strength < 1 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.sepsis.strength > 20 + or c.stats.bloodamount < 60 + or c.afflictions.acidosis.strength > 20 + or c.afflictions.pneumothorax.strength > 30 + or c.afflictions.afadrenaline.strength > 1 + or c.afflictions.alcoholwithdrawal.strength > 75 + ) + c.afflictions[i].strength = math.max(c.afflictions[i].strength, HF.BoolToNum(hasSymHarmless, 2)) + + -- harmful symptom (leads to fibrillation and cardiac arrest) + local fibrillationSpeed = -0.1 + + HF.Clamp(c.afflictions.t_arterialcut.strength, 0, 2) -- aortic rupture (very fast) + + HF.Clamp(c.afflictions.acidosis.strength / 200, 0, 0.5) -- acidosis (slow) + + HF.Clamp( + 0.9 + - ( -- low blood pressure (varies) + ( + c.afflictions.bloodpressure.strength + + HF.Clamp(c.afflictions.afpressuredrug.strength * 5, 0, 20) -- less fibrillation from low blood pressure if blood pressure reducing medicines active + ) / 90 + ), + 0, + 1 + ) + * 2 + + HF.Clamp(c.afflictions.hypoxemia.strength / 100, 0, 1) * 1.5 -- hypoxemia (varies) + + HF.Clamp((c.afflictions.traumaticshock.strength - 5) / 40, 0, 3) -- traumatic shock (fast) + - HF.Clamp(c.afflictions.afadrenaline.strength, 0, 0.9) -- faster defib if adrenaline + + if fibrillationSpeed > 0 and c.afflictions.afadrenaline.strength > 0 then + -- if adrenaline, fibrillate half as fast + fibrillationSpeed = fibrillationSpeed / 2 + end + + if c.afflictions.cardiacarrest.strength > 0 or c.afflictions.heartremoved.strength > 0 then + fibrillationSpeed = -1000 + c.afflictions.fibrillation.strength = 0 + c.afflictions[i].strength = 0 + end + + -- fibrillation multiplier + if fibrillationSpeed > 0 then + fibrillationSpeed = fibrillationSpeed + * NTC.GetMultiplier(c.character, "fibrillation") + * NTConfig.Get("NT_fibrillationSpeed", 1) + end + + if c.afflictions.fibrillation.strength <= 0 then -- havent reached fibrillation yet + c.afflictions[i].strength = c.afflictions[i].strength + fibrillationSpeed * 5 * NT.Deltatime + -- we reached max tachycardia, switch over to fibrillation + if c.afflictions[i].strength >= 100 then + c.afflictions.fibrillation.strength = 5 + c.afflictions[i].strength = 0 + end + else -- have reached fibrillation + c.afflictions[i].strength = 0 -- set tachycardia to 0 + c.afflictions.fibrillation.strength = c.afflictions.fibrillation.strength + + fibrillationSpeed * NT.Deltatime + end + end, + }, + fibrillation = { + update = function(c, i) + -- see above for vfib accumulation logic + if + NTC.GetSymptomFalse(c.character, i) + or c.afflictions.cardiacarrest.strength >= 1 + or c.afflictions.heartremoved.strength >= 1 + then + c.afflictions[i].strength = 0 + end + end, + }, + hyperventilation = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.respiratoryarrest.strength < 1 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.hypoxemia.strength > 10 + or c.afflictions.bloodpressure.strength < 80 + or c.afflictions.afadrenaline.strength > 1 + or c.afflictions.pneumothorax.strength > 15 + or c.afflictions.sepsis.strength > 15 + ), + 2 + ) + end, + }, + hypoventilation = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.respiratoryarrest.strength < 1 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.analgesia.strength > 20 + or c.afflictions.anesthesia.strength > 40 + or c.afflictions.opiateoverdose.strength > 30 + ), + 2 + ) + if c.afflictions.hyperventilation.strength > 0 and c.afflictions.hypoventilation.strength > 0 then + c.afflictions.hyperventilation.strength = 0 + c.afflictions.hypoventilation.strength = 0 + end + end, + }, + dyspnea = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.respiratoryarrest.strength <= 0 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.heartattack.strength > 1 + or c.afflictions.heartdamage.strength > 80 + or c.afflictions.hypoxemia.strength > 20 + or c.afflictions.lungdamage.strength > 45 + or c.afflictions.pneumothorax.strength > 40 + or c.afflictions.tamponade.strength > 10 + or ( + c.afflictions.hemotransfusionshock.strength > 0 + and c.afflictions.hemotransfusionshock.strength < 70 + ) + ), + 2 + ) + end, + }, + sym_cough = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and c.afflictions.lungremoved.strength <= 0 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.lungdamage.strength > 50 + or c.afflictions.heartdamage.strength > 50 + or c.afflictions.tamponade.strength > 20 + ), + 2 + ) + end, + }, + sym_paleskin = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.stats.bloodamount < 60 + or c.afflictions.bloodpressure.strength < 50 + ), + 2 + ) + end, + }, + sym_lightheadedness = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.afflictions.bloodpressure.strength < 60), + 2 + ) + end, + }, + sym_blurredvision = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.afflictions.bloodpressure.strength < 55), + 2 + ) + end, + }, + sym_confusion = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.acidosis.strength > 15 + or c.afflictions.bloodpressure.strength < 30 + or c.afflictions.hypoxemia.strength > 50 + or c.afflictions.sepsis.strength > 40 + or c.afflictions.alcoholwithdrawal.strength > 80 + ), + 2 + ) + end, + }, + sym_headache = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and not c.stats.sedated + and ( + NTC.GetSymptom(c.character, i) + or c.stats.bloodamount < 50 + or c.afflictions.acidosis.strength > 20 + or c.afflictions.stroke.strength > 1 + or c.afflictions.hypoxemia.strength > 40 + or c.afflictions.bloodpressure.strength < 60 + or c.afflictions.alcoholwithdrawal.strength > 50 + or c.afflictions.h_fracture.strength > 0 + ), + 2 + ) + end, + }, + sym_legswelling = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and HF.GetAfflictionStrength(c.character, "rl_cyber", 0) < 0.1 + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.liverdamage.strength > 40 + or c.afflictions.kidneydamage.strength > 60 + or c.afflictions.heartdamage.strength > 80 + ), + 2 + ) + end, + }, + sym_weakness = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.tamponade.strength > 30 + or c.stats.bloodamount < 40 + or c.afflictions.acidosis.strength > 35 + ), + 2 + ) + end, + }, + sym_wheezing = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.respiratoryarrest.strength <= 0 + and ( + NTC.GetSymptom(c.character, i) + or ( + c.afflictions.hemotransfusionshock.strength > 0 + and c.afflictions.hemotransfusionshock.strength < 90 + ) + ), + 2 + ) + end, + }, + sym_vomiting = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.drunk.strength > 100 + or (c.afflictions.hemotransfusionshock.strength > 0 and c.afflictions.hemotransfusionshock.strength < 40) + or c.afflictions.alcoholwithdrawal.strength > 60 + ), + 2 + ) + end, + }, + sym_nausea = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.kidneydamage.strength > 60 + or c.afflictions.radiationsickness.strength > 80 + or (c.afflictions.hemotransfusionshock.strength > 0 and c.afflictions.hemotransfusionshock.strength < 90) + or c.stats.withdrawal > 40 + ), + 2 + ) + end, + }, + sym_hematemesis = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and (NTC.GetSymptom(c.character, i) or c.afflictions.internalbleeding.strength > 50), + 2 + ) + end, + }, + fever = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.sepsis.strength > 5 + or c.afflictions.alcoholwithdrawal.strength > 90 + ), + 2 + ) + end, + }, + sym_abdomdiscomfort = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.afflictions.liverdamage.strength > 65), + 2 + ) + end, + }, + sym_bloating = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and (NTC.GetSymptom(c.character, i) or c.afflictions.liverdamage.strength > 50), + 2 + ) + end, + }, + sym_jaundice = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and (NTC.GetSymptom(c.character, i) or c.afflictions.liverdamage.strength > 80), + 2 + ) + end, + }, + sym_sweating = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and ( + NTC.GetSymptom(c.character, i) + or c.afflictions.heartattack.strength > 1 + or c.stats.withdrawal > 30 + ), + 2 + ) + end, + }, + sym_palpitations = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.cardiacarrest.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.afflictions.alkalosis.strength > 20), + 2 + ) + end, + }, + sym_craving = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and (NTC.GetSymptom(c.character, i) or c.stats.withdrawal > 20), + 2 + ) + end, + }, + pain_abdominal = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and not c.stats.sedated + and ( + NTC.GetSymptom(c.character, i) + or (c.afflictions.hemotransfusionshock.strength > 0 and c.afflictions.hemotransfusionshock.strength < 80) + or c.afflictions.t_arterialcut.strength > 0 + ), + 2 + ) + end, + }, + pain_chest = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum( + not NTC.GetSymptomFalse(c.character, i) + and c.afflictions.sym_unconsciousness.strength <= 0 + and ( + NTC.GetSymptom(c.character, i) + or (c.afflictions.hemotransfusionshock.strength > 0 and c.afflictions.hemotransfusionshock.strength < 60) + or c.afflictions.t_fracture.strength > 0 + or c.afflictions.t_arterialcut.strength > 0 + ), + 2 + ) + end, + }, + luabotomy = { + update = function(c, i) + c.afflictions[i].strength = 0 + end, + }, + modconflict = { + update = function(c, i) + c.afflictions[i].strength = HF.BoolToNum(NT.modconflict, 1) + end, + }, + -- Heelge: this really does the same thing as vanilla burns, why does it even exists? + --sym_scorched = { + -- update = function(c, i) + -- c.afflictions[i].strength = HF.BoolToNum(c.stats.burndamage > 500, 10) + -- end, + --}, +} +-- define all the limb specific afflictions and their update functions +NT.LimbAfflictions = { + bandaged = { + update = function(c, limbaff, i) + -- turning a bandage into a dirty bandage + local wounddamage = limbaff.burn.strength + + limbaff.lacerations.strength + + limbaff.gunshotwound.strength + + limbaff.bitewounds.strength + + limbaff.explosiondamage.strength + + local bandageDirtifySpeed = 0.1 + HF.Clamp(wounddamage / 100, 0, 0.4) + limbaff.bleeding.strength / 20 + + if limbaff[i].strength > 0 then + limbaff[i].strength = limbaff[i].strength - bandageDirtifySpeed * NT.Deltatime + if limbaff[i].strength <= 0 then + -- transition to dirty bandage + limbaff.dirtybandage.strength = math.max(limbaff.dirtybandage.strength, 1) + limbaff[i].strength = 0 + end + end + if limbaff.dirtybandage.strength > 0 then + limbaff.dirtybandage.strength = limbaff.dirtybandage.strength + bandageDirtifySpeed * NT.Deltatime + end + + -- bandage slowdown + if limbaff[i].strength > 0 or limbaff.dirtybandage.strength > 0 then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.9 + end + end, + }, + dirtybandage = {}, -- for bandage dirtifaction logic see above + iced = { + update = function(c, limbaff, i, type) + -- over time skin temperature goes up again + if limbaff[i].strength > 0 then + limbaff[i].strength = limbaff[i].strength - 1.7 * NT.Deltatime + end + -- iced slowdown + if limbaff[i].strength > 0 then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.95 + end + end, + }, + gypsumcast = { + update = function(c, limbaff, i, type) + -- gypsum slowdown and fracture healing + if limbaff[i].strength > 0 then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.8 + NT.BreakLimb(c.character, type, -(100 / 300) * NT.Deltatime) + end + end, + }, + ointmented = {}, + bonegrowth = { + update = function(c, limbaff, i, type) + if limbaff[i].strength <= 0 then + -- check for bone death fracture triggers + if c.afflictions.bonedamage.strength > 90 and HF.Chance(0.01) then + NT.BreakLimb(c.character, type) + end + end + end, + }, + arteriesclamp = {}, + -- damage + bleeding = { + update = function(c, limbaff, i) + if limbaff[i].strength > 0 and math.abs(c.stats.clottingrate - 1) > 0.05 then + limbaff[i].strength = limbaff[i].strength - (c.stats.clottingrate - 1) * 0.1 * NT.Deltatime + end + end, + }, + burn = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 50 then + limbaff[i].strength = limbaff[i].strength + - (c.afflictions.immunity.prev / 3000 + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + acidburn = { + max = 200, + update = function(c, limbaff, i) + -- convert acid burns to regular burns + if limbaff[i].strength > 0 then + limbaff.burn.strength = limbaff.burn.strength + limbaff[i].strength + limbaff[i].strength = 0 + end + end, + }, + lacerations = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 50 then + limbaff[i].strength = limbaff[i].strength + - (c.afflictions.immunity.prev / 3000 + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + gunshotwound = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 50 then + limbaff[i].strength = limbaff[i].strength + - (c.afflictions.immunity.prev / 3000 + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + bitewounds = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 100 then + limbaff[i].strength = limbaff[i].strength + - (c.afflictions.immunity.prev / 3000 + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + explosiondamage = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 50 then + limbaff[i].strength = limbaff[i].strength + - (c.afflictions.immunity.prev / 3000 + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + blunttrauma = { + max = 200, + update = function(c, limbaff, i) + if limbaff[i].strength < 100 then + limbaff[i].strength = limbaff[i].strength + - ( + c.afflictions.immunity.prev / 8000 + + HF.Clamp(limbaff.bandaged.strength, 0, 1) * 0.1 + + HF.Clamp(limbaff.iced.strength, 0, 1) * 0.3 + ) + * c.stats.healingrate + * NT.Deltatime + end + end, + }, + internaldamage = { + max = 200, + update = function(c, limbaff, i, type) + limbaff[i].strength = limbaff[i].strength + + ( + -HF.BoolToNum(limbaff[i].strength < 50, 0.05 * c.stats.healingrate) + + HF.BoolToNum( + not c.stats.sedated + and limbaff.gypsumcast.strength <= 0 + and ( + ( + NT.LimbIsBroken(c.character, type) + and ( + HF.LimbIsExtremity(type) + or (limbaff.bandaged.strength <= 0 and limbaff.dirtybandage.strength <= 0) + ) + ) + or ( + NT.LimbIsDislocated(c.character, type) + and limbaff.bandaged.strength <= 0 + and limbaff.dirtybandage.strength <= 0 + ) + ), + 0.1 + ) + ) + * NT.Deltatime + end, + }, + -- other + infectedwound = { + update = function(c, limbaff, i) + if c.stats.stasis then + return + end + local infectindex = ( + -c.afflictions.immunity.prev / 200 + - HF.Clamp(limbaff.bandaged.strength, 0, 1) * 1.5 + - limbaff.ointmented.strength * 3 + + limbaff.burn.strength / 20 + + limbaff.lacerations.strength / 40 + + limbaff.bitewounds.strength / 30 + + limbaff.gunshotwound.strength / 40 + + limbaff.explosiondamage.strength / 40 + ) * NT.Deltatime + + local wounddamage = limbaff.burn.strength + + limbaff.lacerations.strength + + limbaff.gunshotwound.strength + + limbaff.bitewounds.strength + + limbaff.explosiondamage.strength + + -- open wounds and a dirty bandage? :grimacing: + if limbaff.dirtybandage.strength > 10 and wounddamage > 5 then + infectindex = infectindex + (wounddamage / 40 + limbaff.dirtybandage.strength / 20) * NT.Deltatime + end + + if infectindex > 0 then + infectindex = infectindex * NTConfig.Get("NT_infectionRate", 1) + end + + limbaff[i].strength = limbaff[i].strength + infectindex / 5 + c.afflictions.immunity.strength = c.afflictions.immunity.strength - HF.Clamp(infectindex / 3, 0, 10) + end, + }, + foreignbody = { + update = function(c, limbaff, i, type) + if limbaff[i].strength < 15 then + limbaff[i].strength = limbaff[i].strength - 0.05 * c.stats.healingrate * NT.Deltatime + end + + -- check for arterial cut triggers and foreign body sepsis + local foreignbodycutchance = ((HF.Minimum(limbaff[i].strength, 20) / 100) ^ 6) * 0.5 + if limbaff.bleeding.strength > 80 or HF.Chance(foreignbodycutchance) then + NT.ArteryCutLimb(c.character, type) + end + + -- sepsis + local sepsischance = HF.Minimum(limbaff.gangrene.strength, 15, 0) / 400 + + HF.Minimum(limbaff.infectedwound.strength, 50) / 1000 + + foreignbodycutchance + if HF.Chance(sepsischance) then + c.afflictions.sepsis.strength = c.afflictions.sepsis.strength + NT.Deltatime + end + end, + }, + gangrene = { + update = function(c, limbaff, i, type) + -- see foreignbody for sepsis chance + if isExtremity(type) then + -- surgical amputation prevents all gangrene on that stump + if NT.LimbIsSurgicallyAmputated(c.character, type) then + limbaff[i].strength = 0 + return + end + + if limbaff[i].strength < 15 and limbaff[i].strength > 0 then + limbaff[i].strength = limbaff[i].strength - 0.01 * c.stats.healingrate * NT.Deltatime + end + if c.afflictions.sepsis.strength > 5 then + limbaff[i].strength = limbaff[i].strength + + HF.BoolToNum(HF.Chance(0.04), 0.5 + c.afflictions.sepsis.strength / 150) + * NTConfig.Get("NT_gangrenespeed", 1) + * NT.Deltatime + end + if limbaff.arteriesclamp.strength > 0 then + limbaff[i].strength = limbaff[i].strength + + HF.BoolToNum(HF.Chance(0.1), 1) * 0.5 * NTConfig.Get("NT_gangrenespeed", 1) * NT.Deltatime + end + end + end, + }, + pain_extremity = { + max = 10, + update = function(c, limbaff, i, type) + if c.afflictions.sym_unconsciousness.strength > 0 then + limbaff[i].strength = 0 + return + end + limbaff[i].strength = limbaff[i].strength + + ( + -0.5 + + HF.BoolToNum( + type ~= LimbType.Torso + and limbaff.gypsumcast.strength <= 0 + and ( + ( + NT.LimbIsBroken(c.character, type) + and ( + HF.LimbIsExtremity(type) + or (limbaff.bandaged.strength <= 0 and limbaff.dirtybandage.strength <= 0) + ) + ) + or ( + NT.LimbIsDislocated(c.character, type) + and limbaff.bandaged.strength <= 0 + and limbaff.dirtybandage.strength <= 0 + ) + ), + 2 + ) + - HF.BoolToNum(c.stats.sedated, 100) + ) + * NT.Deltatime + end, + }, + -- limb symptoms + inflammation = { + update = function(c, limbaff, i) + limbaff[i].strength = limbaff[i].strength + + ( + -0.1 + + HF.BoolToNum(limbaff.infectedwound.strength > 10 or limbaff.foreignbody.strength > 15, 0.15) + ) + * NT.Deltatime + end, + }, + burn_deg1 = { + update = function(c, limbaff, i) + if limbaff.burn.strength < 1 or limbaff.burn.strength > 20 then + limbaff[i].strength = 0 + else + limbaff[i].strength = limbaff.burn.strength * 5 + end + end, + }, + burn_deg2 = { + update = function(c, limbaff, i) + if limbaff.burn.strength <= 20 or limbaff.burn.strength > 50 then + limbaff[i].strength = 0 + else + limbaff[i].strength = math.max(5, (limbaff.burn.strength - 20) / 30 * 100) + end + end, + }, + burn_deg3 = { + update = function(c, limbaff, i) + if limbaff.burn.strength <= 50 then + limbaff[i].strength = 0 + else + limbaff[i].strength = HF.Clamp((limbaff.burn.strength - 50) / 50 * 100, 5, 100) + end + end, + }, +} +-- define the stats and multipliers +NT.CharStats = { + healingrate = { + getter = function(c) + return NTC.GetMultiplier(c.character, "healingrate") + end, + }, + specificOrganDamageHealMultiplier = { + getter = function(c) + return NTC.GetMultiplier(c.character, "anyspecificorgandamage") + + HF.Clamp(c.afflictions.afthiamine.strength, 0, 1) * 4 + end, + }, + neworgandamage = { + getter = function(c) + return ( + c.afflictions.sepsis.strength / 300 + + c.afflictions.hypoxemia.strength / 400 + + math.max(c.afflictions.radiationsickness.strength - 25, 0) / 400 + ) + * NTC.GetMultiplier(c.character, "anyorgandamage") + * NTConfig.Get("NT_organDamageGain", 1) + * NT.Deltatime + end, + }, + clottingrate = { + getter = function(c) + return HF.Clamp(1 - c.afflictions.liverdamage.strength / 100, 0, 1) + * c.stats.healingrate + * HF.Clamp(1 - c.afflictions.afstreptokinase.strength, 0, 1) + * NTC.GetMultiplier(c.character, "clottingrate") + end, + }, + + bloodamount = { + getter = function(c) + return HF.Clamp(100 - c.afflictions.bloodloss.strength, 0, 100) + end, + }, + stasis = { + getter = function(c) + return c.afflictions.stasis.strength > 0 + end, + }, + sedated = { + getter = function(c) + return c.afflictions.analgesia.strength > 0 + or c.afflictions.anesthesia.strength > 10 + or c.afflictions.drunk.strength > 30 + or c.stats.stasis + end, + }, + withdrawal = { + getter = function(c) + return math.max( + c.afflictions.opiatewithdrawal.strength, + c.afflictions.chemwithdrawal.strength, + c.afflictions.alcoholwithdrawal.strength + ) + end, + }, + availableoxygen = { + getter = function(c) + local res = HF.Clamp(c.character.Oxygen, 0, 100) + -- heart isnt pumping blood? no new oxygen is getting into the bloodstream, no matter how oxygen rich the air in the lungs + res = res * (1 - c.afflictions.fibrillation.strength / 100) + -- and uuuh, maybe also dont let people without lungs use the oxygen where their lungs should be + if c.afflictions.cardiacarrest.strength > 1 or c.afflictions.lungremoved.strength > 0.1 then + res = 0 + end + return res + end, + }, + speedmultiplier = { + getter = function(c) + local res = 1 + if c.afflictions.t_paralysis.strength > 0 then + res = -9001 + end + + if c.afflictions.sym_vomiting.strength > 0 then + res = res * 0.8 + end + if c.afflictions.sym_nausea.strength > 0 then + res = res * 0.9 + end + if c.afflictions.anesthesia.strength > 0 then + res = res * 0.5 + end + if c.afflictions.opiateoverdose.strength > 50 then + res = res * 0.5 + end + + if c.stats.withdrawal > 80 then + res = res * 0.5 + elseif c.stats.withdrawal > 40 then + res = res * 0.7 + elseif c.stats.withdrawal > 20 then + res = res * 0.9 + end + + if c.afflictions.drunk.strength > 80 then + res = res * 0.5 + elseif c.afflictions.drunk.strength > 40 then + res = res * 0.7 + elseif c.afflictions.drunk.strength > 20 then + res = res * 0.8 + end + + res = res + c.afflictions.afadrenaline.strength / 100 -- mitigate slowing effects if doped up on epinephrine + + res = res * NTC.GetSpeedMultiplier(c.character) + + return res + end, + }, + + lockleftarm = { + getter = function(c) + return limbLockedInitial(c, LimbType.LeftArm, "lockleftarm") + end, + }, + lockrightarm = { + getter = function(c) + return limbLockedInitial(c, LimbType.RightArm, "lockrightarm") + end, + }, + lockleftleg = { + getter = function(c) + return limbLockedInitial(c, LimbType.LeftLeg, "lockleftleg") + end, + }, + lockrightleg = { + getter = function(c) + return limbLockedInitial(c, LimbType.RightLeg, "lockrightleg") + end, + }, + + wheelchaired = { + getter = function(c) + local outerwearItem = c.character.Inventory.GetItemAt(4) + local res = outerwearItem ~= nil and outerwearItem.Prefab.Identifier.Value == "wheelchair" + if res then + c.stats.lockleftleg = c.stats.lockleftarm + c.stats.lockrightleg = c.stats.lockrightarm + end + -- leg and wheelchair slowdown + if c.stats.lockleftleg or c.stats.lockrightleg or res then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.5 + end + local isProne = c.stats.lockleftleg and c.stats.lockrightleg + -- okay climbing ability + if isProne and c.character.IsClimbing then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.5 + end + -- moving prone with one arm or 95% slowdown when no arms + if (isProne or res) and c.stats.lockleftarm and c.stats.lockrightarm then + c.stats.speedmultiplier = 0.05 + elseif isProne and (c.stats.lockleftarm or c.stats.lockrightarm) then + c.stats.speedmultiplier = c.stats.speedmultiplier * 0.8 + end + -- if isProne then + -- c.character.AnimController.RagdollParams.ColliderHeightFromFloor = 4.0 + -- end - Heelge: collider adjustment scrapped for now, lets wait for proper method in Workshop + return res + end, + }, + + bonegrowthCount = { + getter = function(c) + local res = 0 + for type in limbtypes do + if HF.GetAfflictionStrengthLimb(c.character, type, "bonegrowth", 0) > 0 then + res = res + 1 + end + end + return res + end, + }, + burndamage = { + getter = function(c) + local res = 0 + for type in limbtypes do + res = res + HF.GetAfflictionStrengthLimb(c.character, type, "burn", 0) + end + return res + end, + }, +} + +function NT.UpdateHuman(character) + -- pre humanupdate hooks + for key, val in pairs(NTC.PreHumanUpdateHooks) do + val(character) + end + + local charData = { character = character, afflictions = {}, stats = {} } + + -- fetch all the current affliction data + for identifier, data in pairs(NT.Afflictions) do + local strength = HF.GetAfflictionStrength(character, identifier, data.default or 0) + charData.afflictions[identifier] = { prev = strength, strength = strength } + end + -- fetch and calculate all the current stats + for identifier, data in pairs(NT.CharStats) do + if data.getter ~= nil then + charData.stats[identifier] = data.getter(charData) + else + charData.stats[identifier] = data.default or 1 + end + end + -- update non-limb-specific afflictions + for identifier, data in pairs(NT.Afflictions) do + if data.update ~= nil then + data.update(charData, identifier) + end + end + + -- update and apply limb specific stuff + local function FetchLimbData(type) + local keystring = tostring(type) .. "afflictions" + charData[keystring] = {} + for identifier, data in pairs(NT.LimbAfflictions) do + local strength = HF.GetAfflictionStrengthLimb(character, type, identifier, data.default or 0) + charData[keystring][identifier] = { prev = strength, strength = strength } + end + end + local function UpdateLimb(type) + local keystring = tostring(type) .. "afflictions" + for identifier, data in pairs(NT.LimbAfflictions) do + if data.update ~= nil then + data.update(charData, charData[keystring], identifier, type) + end + end + end + local function ApplyLimb(type) + local keystring = tostring(type) .. "afflictions" + for identifier, data in pairs(charData[keystring]) do + local newval = HF.Clamp( + data.strength, + NT.LimbAfflictions[identifier].min or 0, + NT.LimbAfflictions[identifier].max or 100 + ) + if newval ~= data.prev then + if NT.LimbAfflictions[identifier].apply == nil then + HF.SetAfflictionLimb(character, identifier, type, newval) + else + NT.LimbAfflictions[identifier].apply(charData, identifier, type, newval) + end + end + end + end + + -- stasis completely halts activity in limbs + if not charData.stats.stasis then + for type in limbtypes do + FetchLimbData(type) + end + for type in limbtypes do + UpdateLimb(type) + end + for type in limbtypes do + ApplyLimb(type) + end + end + + -- non-limb-specific late update (useful for things that use stats that are altered by limb specifics) + for identifier, data in pairs(NT.Afflictions) do + if data.lateupdate ~= nil then + data.lateupdate(charData, identifier) + end + end + + -- apply non-limb-specific changes + for identifier, data in pairs(charData.afflictions) do + local newval = + HF.Clamp(data.strength, NT.Afflictions[identifier].min or 0, NT.Afflictions[identifier].max or 100) + if newval ~= data.prev then + if NT.Afflictions[identifier].apply == nil then + HF.SetAffliction(character, identifier, newval) + else + NT.Afflictions[identifier].apply(charData, identifier, newval) + end + end + end + + -- compatibility + NTC.TickCharacter(character) + -- humanupdate hooks + for key, val in pairs(NTC.HumanUpdateHooks) do + val(character) + end + + NTC.CharacterSpeedMultipliers[character] = nil +end + +function NT.UpdateMonster(character) + -- trade bloodloss on this creature for organ damage so that creatures can still bleed out + local bloodloss = HF.GetAfflictionStrength(character, "bloodloss", 0) + local oxygenlow = HF.GetAfflictionStrength(character, "oxygenlow", 0) + if bloodloss > 0 then + HF.AddAffliction(character, "organdamage", bloodloss * 2) + HF.SetAffliction(character, "bloodloss", 0) + elseif oxygenlow > 50 then + HF.AddAffliction(character, "organdamage", (oxygenlow - 50) * 2) + HF.SetAffliction(character, "oxygenlow", 50) + end +end + +-- gets run every tick, shouldnt be used unless necessary + +function NT.TickUpdate() + for key, value in pairs(NT.tickTasks) do + value.duration = value.duration - 1 + if value.duration <= 0 then + NT.tickTasks[key] = nil + end + end +end + +NT.tickTasks = {} +NT.tickTaskID = 0 +function NT.AddTickTask(type, duration, character) + local newtask = {} + newtask.type = type + newtask.duration = duration + newtask.character = character + NT.tickTasks[NT.tickTaskID] = newtask + NT.tickTaskID = NT.tickTaskID + 1 +end diff --git a/Neurotrauma/Lua/Scripts/Server/items.lua b/Neurotrauma/Lua/Scripts/Server/items.lua new file mode 100644 index 0000000..0eae5c8 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/items.lua @@ -0,0 +1,2304 @@ +Hook.Add("item.applyTreatment", "NT.itemused", function(item, usingCharacter, targetCharacter, limb) + if -- invalid use, dont do anything + item == nil + or usingCharacter == nil + or targetCharacter == nil + or limb == nil + then + return + end + + local identifier = item.Prefab.Identifier.Value + + local methodtorun = NT.ItemMethods[identifier] -- get the function associated with the identifier + if methodtorun ~= nil then + -- run said function + methodtorun(item, usingCharacter, targetCharacter, limb) + return + end + + -- startswith functions + for key, value in pairs(NT.ItemStartsWithMethods) do + if HF.StartsWith(identifier, key) then + value(item, usingCharacter, targetCharacter, limb) + return + end + end +end) +-- TODO: some items trigger afflictions after a single human update, to fix, trigger them immediately for consistency +-- storing all of the item-specific functions in a table +NT.ItemMethods = {} -- with the identifier as the key +NT.ItemStartsWithMethods = {} -- with the start of the identifier as the key + +-- misc + +NT.ItemMethods.healthscanner = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + local containedItem = item.OwnInventory.GetItemAt(0) + if containedItem == nil then + return + end + local hasVoltage = containedItem.Condition > 0 + + if hasVoltage then + --set base color values + local BaseColor = "127,255,255" + local NameColor = "127,255,255" + local LowColor = "127,255,255" + local MedColor = "127,255,255" + local HighColor = "127,255,255" + local VitalColor = "127,255,255" + local RemovalColor = "127,255,255" + local CustomColor = "127,255,255" + + if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then + BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",") + NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",") + LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",") + MedColor = table.concat(NTConfig.Get("NTSCAN_medcolor", 1), ",") + HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",") + VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",") + RemovalColor = table.concat(NTConfig.Get("NTSCAN_removalcolor", 1), ",") + CustomColor = table.concat(NTConfig.Get("NTSCAN_customcolor", 1), ",") + end + + local LowMedThreshold = NTConfig.Get("NTSCAN_lowmedThreshold", 1) + local MedHighThreshold = NTConfig.Get("NT_medhighThreshold", 1) + + local VitalCategory = NTConfig.Get("NTSCAN_VitalCategory", 1) + local RemovalCategory = NTConfig.Get("NTSCAN_RemovalCategory", 1) + local CustomCategory = NTConfig.Get("NTSCAN_CustomCategory", 1) + local PressureCategory = { "bloodpressure" } + local IgnoredCategory = NTConfig.Get("NTSCAN_IgnoredCategory", 1) + + HF.GiveItem(targetCharacter, "ntsfx_selfscan") + containedItem.Condition = containedItem.Condition - 5 + HF.AddAffliction(targetCharacter, "radiationsickness", 1, usingCharacter) + HF.AddAffliction(usingCharacter, "radiationsickness", 0.6) + + -- print readout of afflictions + local startReadout = "‖color:" + .. BaseColor + .. "‖" + .. "Affliction readout for " + .. "‖color:end‖" + .. "‖color:" + .. NameColor + .. "‖" + .. targetCharacter.Name + .. "‖color:end‖" + .. "‖color:" + .. BaseColor + .. "‖" + .. " on limb " + .. HF.LimbTypeToString(limbtype) + .. ":\n" + .. "‖color:end‖" + local LowPressureReadout = "" + local HighPressureReadout = "" + local LowStrengthReadout = "" + local MediumStrengthReadout = "" + local HighStrengthReadout = "" + local VitalReadout = "" + local RemovalReadout = "" + local CustomReadout = "" + + local afflictionlist = targetCharacter.CharacterHealth.GetAllAfflictions() + local afflictionsdisplayed = 0 + for value in afflictionlist do + local strength = HF.Round(value.Strength) + local prefab = value.Prefab + local limb = targetCharacter.CharacterHealth.GetAfflictionLimb(value) + local afflimbtype = LimbType.Torso + + if not prefab.LimbSpecific then + afflimbtype = prefab.IndicatorLimb + elseif limb ~= nil then + afflimbtype = limb.type + end + + afflimbtype = HF.NormalizeLimbType(afflimbtype) + + if strength >= prefab.ShowInHealthScannerThreshold and afflimbtype == limbtype then + if --low readout + (strength < LowMedThreshold) + and not HF.TableContains(VitalCategory, value.Identifier) + and not HF.TableContains(RemovalCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + and not HF.TableContains(CustomCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + LowStrengthReadout = LowStrengthReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + end + + if --medium readout + (strength >= LowMedThreshold) + and (strength < MedHighThreshold) + and not HF.TableContains(VitalCategory, value.Identifier) + and not HF.TableContains(RemovalCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + and not HF.TableContains(CustomCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + MediumStrengthReadout = MediumStrengthReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + end + + if --high readout + (strength >= MedHighThreshold) + and not HF.TableContains(VitalCategory, value.Identifier) + and not HF.TableContains(RemovalCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + and not HF.TableContains(CustomCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + HighStrengthReadout = HighStrengthReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + end + + if --vital readout + HF.TableContains(VitalCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + VitalReadout = VitalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --removed readout + HF.TableContains(RemovalCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + RemovalReadout = RemovalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --custom readout + HF.TableContains(CustomCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + CustomReadout = CustomReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --bloodpressure readout + HF.TableContains(PressureCategory, value.Identifier) + and ((strength > 130) or (strength < 70)) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + HighPressureReadout = HighPressureReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + elseif HF.TableContains(PressureCategory, value.Identifier) then + LowPressureReadout = LowPressureReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + end + + afflictionsdisplayed = afflictionsdisplayed + 1 + end + end + + -- add a message in case there is nothing to display + if afflictionsdisplayed <= 0 then + LowStrengthReadout = LowStrengthReadout .. "\nNo afflictions! Good work!" + end + + Timer.Wait(function() + HF.DMClient( + HF.CharacterToClient(usingCharacter), + + startReadout + .. "‖color:" + .. LowColor + .. "‖" + .. LowPressureReadout + .. "‖color:end‖" + .. "‖color:" + .. HighColor + .. "‖" + .. HighPressureReadout + .. "‖color:end‖" + .. "‖color:" + .. LowColor + .. "‖" + .. LowStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. MedColor + .. "‖" + .. MediumStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. HighColor + .. "‖" + .. HighStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. VitalColor + .. "‖" + .. VitalReadout + .. "‖color:end‖" + .. "‖color:" + .. RemovalColor + .. "‖" + .. RemovalReadout + .. "‖color:end‖" + .. "‖color:" + .. CustomColor + .. "‖" + .. CustomReadout + .. "‖color:end‖" + ) + end, 2000) + end +end +NT.HematologyDetectable = { + "sepsis", + "immunity", + "acidosis", + "alkalosis", + "bloodloss", + "bloodpressure", + "afimmunosuppressant", + "afthiamine", + "afadrenaline", + "afstreptokinase", + "afantibiotics", + "afsaline", + "afringerssolution", + "afpressuredrug", +} +NT.ItemMethods.bloodanalyzer = function(item, usingCharacter, targetCharacter, limb) + -- only work if no cooldown + if item.Condition < 50 then + return + end + + local limbtype = limb.type + + local success = HF.GetSkillRequirementMet(usingCharacter, "medical", 30) + local bloodlossinduced = 1 + if not success then + bloodlossinduced = 3 + end + HF.AddAffliction(targetCharacter, "bloodloss", bloodlossinduced, usingCharacter) + + -- spawn donor card + local containedItem = item.OwnInventory.GetItemAt(0) + local hasCartridge = containedItem ~= nil + and (containedItem.Prefab.Identifier.Value == "bloodcollector" or containedItem.HasTag("donorCard")) + if hasCartridge then + HF.RemoveItem(containedItem) + local bloodtype = NT.GetBloodtype(targetCharacter) + local targetIDCard = targetCharacter.Inventory.GetItemAt(0) + if targetIDCard ~= nil and targetIDCard.OwnInventory.GetItemAt(0) == nil then + -- put the donor card into the id card + HF.PutItemInsideItem(targetIDCard, bloodtype .. "card") + else + -- put it in the analyzer instead + HF.PutItemInsideItem(item, bloodtype .. "card") + end + end + + local LowPressureReadout = "" + local HighPressureReadout = "" + local LowStrengthReadout = "" + local MediumStrengthReadout = "" + local HighStrengthReadout = "" + local VitalReadout = "" + local RemovalReadout = "" + local CustomReadout = "" + + --set base color values + local BaseColor = "127,255,255" + local NameColor = "127,255,255" + local LowColor = "127,255,255" + local MedColor = "127,255,255" + local HighColor = "127,255,255" + local VitalColor = "127,255,255" + local RemovalColor = "127,255,255" + local CustomColor = "127,255,255" + + if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then + BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",") + NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",") + LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",") + MedColor = table.concat(NTConfig.Get("NTSCAN_medcolor", 1), ",") + HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",") + VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",") + RemovalColor = table.concat(NTConfig.Get("NTSCAN_removalcolor", 1), ",") + CustomColor = table.concat(NTConfig.Get("NTSCAN_customcolor", 1), ",") + end + + local LowMedThreshold = NTConfig.Get("NTSCAN_lowmedThreshold", 1) + local MedHighThreshold = NTConfig.Get("NT_medhighThreshold", 1) + + local VitalCategory = NTConfig.Get("NTSCAN_VitalCategory", 1) + local RemovalCategory = NTConfig.Get("NTSCAN_RemovalCategory", 1) + local CustomCategory = NTConfig.Get("NTSCAN_CustomCategory", 1) + local PressureCategory = { "bloodpressure" } + local IgnoredCategory = NTConfig.Get("NTSCAN_IgnoredCategory", 1) + + -- print readout of afflictions + local bloodtype = AfflictionPrefab.Prefabs[NT.GetBloodtype(targetCharacter)].Name.Value + local startReadout = "‖color:" + .. NameColor + .. "‖" + .. "Bloodtype: " + .. bloodtype + .. "‖color:end‖" + .. "‖color:" + .. BaseColor + .. "‖" + .. "\nAffliction readout for the blood of " + .. "‖color:end‖" + .. "‖color:" + .. NameColor + .. "‖" + .. targetCharacter.Name + .. ":\n" + .. "‖color:end‖" + local afflictionlist = targetCharacter.CharacterHealth.GetAllAfflictions() + local afflictionsdisplayed = 0 + for value in afflictionlist do + local strength = HF.Round(value.Strength) + local prefab = value.Prefab + + if strength > 2 and HF.TableContains(NT.HematologyDetectable, prefab.Identifier.Value) then + -- add the affliction to the readout + if --low readout + (strength < LowMedThreshold) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + LowStrengthReadout = LowStrengthReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --medium readout + (strength >= LowMedThreshold) + and (strength < MedHighThreshold) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + MediumStrengthReadout = MediumStrengthReadout + .. "\n" + .. value.Prefab.Name.Value + .. ": " + .. strength + .. "%" + end + + if --high readout + (strength >= MedHighThreshold) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + HighStrengthReadout = HighStrengthReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --vital readout + HF.TableContains(VitalCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + VitalReadout = VitalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --removed readout + HF.TableContains(RemovalCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + RemovalReadout = RemovalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --custom readout + HF.TableContains(CustomCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + and not HF.TableContains(PressureCategory, value.Identifier) + then + CustomReadout = CustomReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + if --bloodpressure readout + HF.TableContains(PressureCategory, value.Identifier) + and ((strength > 130) or (strength < 70)) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + HighPressureReadout = HighPressureReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + elseif + HF.TableContains(PressureCategory, value.Identifier) + and not HF.TableContains(IgnoredCategory, value.Identifier) + then + LowPressureReadout = LowPressureReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%" + end + + afflictionsdisplayed = afflictionsdisplayed + 1 + end + end + + -- add a message in case there is nothing to display + if afflictionsdisplayed <= 0 then + LowStrengthReadout = LowStrengthReadout .. "\nNo blood pressure detected..." + end + + HF.DMClient( + HF.CharacterToClient(usingCharacter), + startReadout + .. "‖color:" + .. LowColor + .. "‖" + .. LowPressureReadout + .. "‖color:end‖" + .. "‖color:" + .. HighColor + .. "‖" + .. HighPressureReadout + .. "‖color:end‖" + .. "‖color:" + .. LowColor + .. "‖" + .. LowStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. MedColor + .. "‖" + .. MediumStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. HighColor + .. "‖" + .. HighStrengthReadout + .. "‖color:end‖" + .. "‖color:" + .. VitalColor + .. "‖" + .. VitalReadout + .. "‖color:end‖" + .. "‖color:" + .. RemovalColor + .. "‖" + .. RemovalReadout + .. "‖color:end‖" + .. "‖color:" + .. CustomColor + .. "‖" + .. CustomReadout + .. "‖color:end‖" + ) +end + +-- trauma shears and diving knife +NT.CuttableAfflictions = { "bandaged", "dirtybandage" } +NT.TraumashearsAfflictions = { "gypsumcast" } +NT.ItemMethods.traumashears = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + -- does the target have any cuttable afflictions? + local cuttables = HF.CombineArrays(NT.CuttableAfflictions, NT.TraumashearsAfflictions) + local canCut = false + for val in cuttables do + local prefab = AfflictionPrefab.Prefabs[val] + if prefab ~= nil then + if prefab.LimbSpecific then + if HF.HasAfflictionLimb(targetCharacter, val, limbtype, 0.1) then + canCut = true + break + end + elseif limbtype == prefab.IndicatorLimb then + if HF.HasAffliction(targetCharacter, val, 0.1) then + canCut = true + break + end + end + end + end + + if canCut then + if HF.GetSkillRequirementMet(usingCharacter, "medical", 10) then + HF.GiveItem(targetCharacter, "ntsfx_scissors") + + -- remove 8% fracture so that they dont scream again + if + NT.LimbIsBroken(targetCharacter, limbtype) + and HF.HasAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0.1) + then + NT.BreakLimb(targetCharacter, limbtype, -8) + end + + -- remove cuttables + for val in cuttables do + local prefab = AfflictionPrefab.Prefabs[val] + if prefab ~= nil then + if prefab.LimbSpecific then + HF.SetAfflictionLimb(targetCharacter, val, limbtype, 0, usingCharacter) + elseif limbtype == prefab.IndicatorLimb then + HF.SetAffliction(targetCharacter, val, 0, usingCharacter) + end + end + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter) + end + end +end +NT.ItemStartsWithMethods.divingknife = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + -- does the target have any cuttable afflictions? + local canCut = false + for val in NT.CuttableAfflictions do + local prefab = AfflictionPrefab.Prefabs[val] + if prefab ~= nil then + if prefab.LimbSpecific then + if HF.HasAfflictionLimb(targetCharacter, val, limbtype, 0.1) then + canCut = true + break + end + elseif HF.NormalizeLimbType(limbtype) == prefab.IndicatorLimb then + if HF.HasAffliction(targetCharacter, val, 0.1) then + canCut = true + break + end + end + end + end + + if canCut then + if HF.GetSkillRequirementMet(usingCharacter, "medical", 30) then + HF.GiveItem(targetCharacter, "ntsfx_bandage") + -- remove cuttables + for val in NT.CuttableAfflictions do + local prefab = AfflictionPrefab.Prefabs[val] + if prefab ~= nil then + if prefab.LimbSpecific then + HF.SetAfflictionLimb(targetCharacter, val, limbtype, 0, usingCharacter) + elseif HF.NormalizeLimbType(limbtype) == prefab.IndicatorLimb then + HF.SetAffliction(targetCharacter, val, 0, usingCharacter) + end + end + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter) + end + end +end + +NT.ItemMethods.gypsum = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.HasAfflictionLimb(targetCharacter, "bandaged", limbtype, 0.1) + and not HF.HasAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0.1) + and not HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1) + and HF.LimbIsExtremity(limbtype) + then + if HF.GetSkillRequirementMet(usingCharacter, "medical", 40) then + HF.SetAfflictionLimb(targetCharacter, "bandaged", limbtype, 0, usingCharacter) + HF.SetAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 100, usingCharacter) + NT.BreakLimb(targetCharacter, limbtype, -20) + HF.GiveSkillScaled(usingCharacter, "medical", 6000) + HF.RemoveItem(item) + else + HF.RemoveItem(item) + end + end +end + +-- treatment items + +NT.SutureAfflictions = { + bonecut = { xpgain = 0, case = "surgeryincision" }, + drilledbones = { xpgain = 0, case = "surgeryincision" }, + + ll_arterialcut = { xpgain = 3, case = "retractedskin" }, + rl_arterialcut = { xpgain = 3, case = "retractedskin" }, + la_arterialcut = { xpgain = 3, case = "retractedskin" }, + ra_arterialcut = { xpgain = 3, case = "retractedskin" }, + h_arterialcut = { xpgain = 3, case = "retractedskin" }, + t_arterialcut = { xpgain = 6, case = "retractedskin" }, + arteriesclamp = { xpgain = 0, case = "retractedskin" }, + tamponade = { xpgain = 3, case = "retractedskin" }, + internalbleeding = { xpgain = 3, case = "retractedskin" }, + stroke = { xpgain = 6, case = "retractedskin" }, + + clampedbleeders = {}, + surgeryincision = {}, + retractedskin = {}, +} +NT.ItemMethods.suture = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + if HF.GetSkillRequirementMet(usingCharacter, "medical", 30) then + -- in field use + local healeddamage = 0 + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "lacerations", 0), 0, 20) + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bitewounds", 0), 0, 20) + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "explosiondamage", 0), 0, 20) + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "gunshotwound", 0), 0, 20) + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bleeding", 0) / 10, 0, 40) + healeddamage = healeddamage + + HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bleedingnonstop", 0) / 10, 0, 40) + + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, -20, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bitewounds", limbtype, -20, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "explosiondamage", limbtype, -20, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "gunshotwound", limbtype, -20, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -40, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "suturedw", limbtype, healeddamage) + + HF.GiveSkillScaled(usingCharacter, "medical", healeddamage * 100) + + -- terminating surgeries + -- amputations + if HF.HasAfflictionLimb(targetCharacter, "bonecut", limbtype, 1) then + local droplimb = not NT.LimbIsAmputated(targetCharacter, limbtype) + and not HF.HasAfflictionLimb(targetCharacter, "gangrene", limbtype, 15) + -- drop previously held item + local previtem = HF.GetHeadWear(targetCharacter) + if previtem ~= nil and limbtype == LimbType.Head then + previtem.Drop(character, true) + end + NT.SurgicallyAmputateLimb(targetCharacter, limbtype) + if droplimb then + local limbtoitem = {} + limbtoitem[LimbType.RightLeg] = "rleg" + limbtoitem[LimbType.LeftLeg] = "lleg" + limbtoitem[LimbType.RightArm] = "rarm" + limbtoitem[LimbType.LeftArm] = "larm" + if limbtoitem[limbtype] ~= nil then + HF.GiveItem(usingCharacter, limbtoitem[limbtype]) + HF.GiveSurgerySkill(usingCharacter, 0.5) + end + end + end + + -- the other stuff + local function removeAfflictionPlusGainSkill(affidentifier, skillgain) + if HF.HasAfflictionLimb(targetCharacter, affidentifier, limbtype) then + HF.SetAfflictionLimb(targetCharacter, affidentifier, limbtype, 0, usingCharacter) + + HF.GiveSurgerySkill(usingCharacter, skillgain) + end + end + local function removeAfflictionNonLimbSpecificPlusGainSkill(affidentifier, skillgain) + if HF.HasAffliction(targetCharacter, affidentifier) then + HF.SetAffliction(targetCharacter, affidentifier, 0, usingCharacter) + + HF.GiveSurgerySkill(usingCharacter, skillgain) + end + end + + for key, value in pairs(NT.SutureAfflictions) do + local prefab = AfflictionPrefab.Prefabs[key] + if prefab ~= nil and (value.case == nil or HF.HasAfflictionLimb(targetCharacter, value.case, limbtype)) then + if value.func ~= nil then + value.func(item, usingCharacter, targetCharacter, limb) + else + local skillgain = value.xpgain or 0 + if prefab.LimbSpecific then + removeAfflictionPlusGainSkill(key, skillgain) + elseif prefab.IndicatorLimb == limbtype then + removeAfflictionNonLimbSpecificPlusGainSkill(key, skillgain) + end + end + end + end + else + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6) + end +end +NT.ItemMethods.tourniquet = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + if + HF.GetSkillRequirementMet(usingCharacter, "medical", 30) + and not HF.HasAfflictionLimb(targetCharacter, "arteriesclamp", limbtype, 1) + then + if NT.LimbIsArterialCut(targetCharacter, limbtype) then + if HF.LimbIsExtremity(limbtype) then + HF.SetAfflictionLimb(targetCharacter, "arteriesclamp", limbtype, 100, usingCharacter) + HF.GiveSkillScaled(usingCharacter, "medical", 6000) + elseif limbtype == LimbType.Head then + HF.SetAffliction(targetCharacter, "oxygenlow", 200, usingCharacter) + HF.AddAffliction(targetCharacter, "cerebralhypoxia", 15, usingCharacter) + end + HF.RemoveItem(item) + end + else + HF.AddAfflictionLimb(targetCharacter, "blunttrauma", limbtype, 6, usingCharacter) + end +end +NT.ItemMethods.emptybloodpack = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 0 then + return + end + + if targetCharacter.Bloodloss <= 31 then + local success = HF.GetSkillRequirementMet(usingCharacter, "medical", 30) + local bloodlossinduced = 30 + if not success then + bloodlossinduced = 40 + end + + local bloodtype = NT.GetBloodtype(targetCharacter) + + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 0 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + } + + -- move towards isotonic + HF.SetAffliction(targetCharacter, "acidosis", HF.GetAfflictionStrength(targetCharacter, "acidosis", 0) * 0.9) + HF.SetAffliction(targetCharacter, "alkalosis", HF.GetAfflictionStrength(targetCharacter, "alkalosis", 0) * 0.9) + + HF.AddAffliction(targetCharacter, "bloodloss", bloodlossinduced, usingCharacter) + + local bloodpackIdentifier = "bloodpack" .. bloodtype + if bloodtype == "ominus" then + bloodpackIdentifier = "antibloodloss2" + end + + HF.GiveItemPlusFunction(bloodpackIdentifier, postSpawnFunc, params, usingCharacter) + item.Condition = 0 + --HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_syringe") + end +end +NT.ItemMethods.propofol = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local anesthesiastrength = HF.GetAfflictionStrength(targetCharacter, "anesthesia", 0) + local anesthesiaGained = 1 + + if HF.HasTalent(usingCharacter, "ntsp_properfol") then + anesthesiaGained = 15 + end + + if anesthesiastrength < 15 then + HF.AddAffliction(targetCharacter, "anesthesia", anesthesiaGained, usingCharacter) + else + anesthesiaGained = 15 - anesthesiastrength + HF.AddAffliction(targetCharacter, "anesthesia", anesthesiaGained, usingCharacter) + end + + HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_syringe") +end +NT.ItemMethods.streptokinase = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + HF.AddAffliction(targetCharacter, "heartattack", -100, usingCharacter) + HF.AddAffliction(targetCharacter, "hemotransfusionshock", -100, usingCharacter) + HF.AddAffliction(targetCharacter, "afstreptokinase", 50, usingCharacter) + + -- make stroke worse if present + local hasStroke = HF.HasAffliction(targetCharacter, "stroke") + if hasStroke then + HF.AddAffliction(targetCharacter, "stroke", 5, usingCharacter) + HF.AddAffliction(targetCharacter, "cerebralhypoxia", 10, usingCharacter) + end + + HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_syringe") +end +NT.ItemMethods.adrenaline = function(item, usingCharacter, targetCharacter, limb) + HF.AddAffliction(targetCharacter, "afadrenaline", 55, usingCharacter) + HF.AddAffliction(targetCharacter, "adrenalinerush", 8, usingCharacter) + if HF.HasAffliction(targetCharacter, "cardiacarrest", 0.1) then + HF.AddAffliction(targetCharacter, "cardiacarrest", -100, usingCharacter) + HF.AddAffliction(targetCharacter, "fibrillation", 20, usingCharacter) + end + HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_syringe") +end +local function limbHasThirdDegreeBurns(char, limbtype) + return HF.GetAfflictionStrengthLimb(char, limbtype, "burn", 0) > 50 +end +NT.ItemMethods.ointment = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 10), 1) + + HF.AddAfflictionLimb(targetCharacter, "ointmented", limbtype, 60 * (success + 1), usingCharacter) + if not limbHasThirdDegreeBurns(targetCharacter, limbtype) then + HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -7.2 - success * 4.8, usingCharacter) + end + HF.AddAfflictionLimb(targetCharacter, "infectedwound", limbtype, -24 - success * 48, usingCharacter) + + -- HF.RemoveItem(item) + item.Condition = item.Condition - 12.5 + HF.GiveItem(targetCharacter, "ntsfx_ointment") +end +NT.ItemMethods.antibleeding1 = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 10), 1) + local hasmedexp = HF.BoolToNum(HF.HasTalent(usingCharacter, "medicalexpertise")) + HF.AddAfflictionLimb(targetCharacter, "dirtybandage", limbtype, -100, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bandaged", limbtype, 36 + success * 12 + hasmedexp * 12, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -18 - success * 6 - hasmedexp * 6, usingCharacter) + HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_bandage") +end +NT.ItemMethods.antibleeding2 = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 22), 1) + HF.AddAfflictionLimb(targetCharacter, "dirtybandage", limbtype, -100, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bandaged", limbtype, 50 + success * 50, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -24 - success * 24, usingCharacter) + if HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) then + -- remove all burn if applied during surgery + local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "burn") + local healedamount = math.min(affAmount, 200) + HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -healedamount, usingCharacter) + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", healedamount * 300) + else + HF.GiveSkillScaled(usingCharacter, "medical", healedamount * 150) + end + elseif not limbHasThirdDegreeBurns(targetCharacter, limbtype) then + -- remove normal amount of burn if not third degree + HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -12 - success * 12, usingCharacter) + end + HF.RemoveItem(item) + HF.GiveItem(targetCharacter, "ntsfx_bandage") +end + +NT.ItemMethods.defibrillator = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 0 then + return + end + + local containedItem = item.OwnInventory.GetItemAt(0) + if containedItem == nil then + return + end + local hasVoltage = containedItem.Condition > 0 + -- if defib user in water = shock the user with 93 strength electricshock aff (3 second stun) + electrocution vanilla sound effect + if not hasVoltage then + return + end + HF.GiveItem(targetCharacter, "ntsfx_manualdefib") + -- about to get deepfried if underwater (TODO) + --local unsafe = HF.GetOuterWearIdentifier(targetCharacter) ~= "emergencysuit" and targetCharacter.InWater + --local unsafeArrestRoll = unsafe + -- and HF.Chance(HF.Clamp(0.3, (1 - (HF.GetSkillLevel(usingCharacter, "medical") / 100)) ^ 2 * 8.5, 1)) + --if unsafe then + -- shock therapy the surrounding characters + -- containedItem.Condition = containedItem.Condition - 10 + -- if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then + -- containedItem.Condition = containedItem.Condition - 10 + -- end + -- Timer.Wait(function() + -- for _, character in pairs(Character.CharacterList) do + -- local distance = HF.DistanceBetween(item.worldPosition, character.worldPosition) + -- if + -- distance <= 300 and character.CanSeeTarget(usingCharacter) and HF.Chance(0.3) + -- or character == targetCharacter + -- then + -- local limbtypes = { + -- LimbType.Torso, + -- LimbType.Head, + -- LimbType.LeftArm, + -- LimbType.RightArm, + -- LimbType.LeftLeg, + -- LimbType.RightLeg, + -- } + -- for type in limbtypes do + -- if math.random() < 0.5 then + -- HF.AddAfflictionLimb(character, "burn", type, math.random(15, 20), usingCharacter) + -- HF.AddAfflictionLimb(character, "spasm", type, 10) + -- end + -- end + -- HF.SetAffliction(character, "electricshock", 100, usingCharacter) + -- HF.AddAffliction(character, "traumaticshock", 25, usingCharacter) + -- end + -- end + -- end, 2000) + --end + containedItem.Condition = containedItem.Condition - 10 + if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then + containedItem.Condition = containedItem.Condition - 10 + end + + local successChance = (HF.GetSkillLevel(usingCharacter, "medical") / 100) ^ 2 + local arrestSuccessChance = (HF.GetSkillLevel(usingCharacter, "medical") / 100) ^ 4 + local arrestFailChance = (1 - (HF.GetSkillLevel(usingCharacter, "medical") / 100)) ^ 2 * 0.3 + + Timer.Wait(function() + HF.AddAffliction(targetCharacter, "stun", 2, usingCharacter) + if HF.Chance(successChance) then + HF.SetAffliction(targetCharacter, "tachycardia", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "fibrillation", 0, usingCharacter) + end + if HF.Chance(arrestSuccessChance) then + HF.SetAffliction(targetCharacter, "cardiacarrest", 0, usingCharacter) + end + end, 2000) +end +NT.ItemMethods.aed = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 0 then + return + end + + local containedItem = item.OwnInventory.GetItemAt(0) + if containedItem == nil then + return + end + local hasVoltage = containedItem.Condition > 0 + + if hasVoltage then + local actionRequired = HF.HasAffliction(targetCharacter, "tachycardia", 5) + or HF.HasAffliction(targetCharacter, "fibrillation", 1) + or HF.HasAffliction(targetCharacter, "cardiacarrest") + + if not actionRequired then + HF.GiveItem(targetCharacter, "ntsfx_defib2") + else + HF.GiveItem(targetCharacter, "ntsfx_defib1") + + containedItem.Condition = containedItem.Condition - 10 + if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then + containedItem.Condition = containedItem.Condition - 10 + end + -- about to get deepfried if underwater (TODO) + --local unsafe = HF.GetOuterWearIdentifier(targetCharacter) ~= "emergencysuit" and targetCharacter.InWater + --local unsafeArrestRoll = unsafe and HF.Chance(0.3) + --if unsafe then + -- -- shock therapy the surrounding characters + -- containedItem.Condition = containedItem.Condition - 10 + -- if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then + -- containedItem.Condition = containedItem.Condition - 10 + -- end + -- Timer.Wait(function() + -- for _, character in pairs(Character.CharacterList) do + -- local distance = HF.DistanceBetween(item.worldPosition, character.worldPosition) + -- if + -- distance <= 300 and character.CanSeeTarget(usingCharacter) and HF.Chance(0.3) + -- or character == targetCharacter + -- then + -- local limbtypes = { + -- LimbType.Torso, + -- LimbType.Head, + -- LimbType.LeftArm, + -- LimbType.RightArm, + -- LimbType.LeftLeg, + -- LimbType.RightLeg, + -- } + -- for type in limbtypes do + -- if math.random() < 0.5 then + -- HF.AddAfflictionLimb(character, "burn", type, math.random(15, 20), usingCharacter) + -- HF.AddAfflictionLimb(character, "spasm", type, 10) + -- end + -- end + -- HF.SetAffliction(character, "electricshock", 100, usingCharacter) + -- HF.AddAffliction(character, "traumaticshock", 25, usingCharacter) + -- end + -- end + -- end, 2000) + --end + local arrestSuccessChance = HF.Clamp((HF.GetSkillLevel(usingCharacter, "medical") / 200), 0.2, 0.4) + + Timer.Wait(function() + HF.AddAffliction(targetCharacter, "stun", 2, usingCharacter) + HF.SetAffliction(targetCharacter, "tachycardia", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "fibrillation", 0, usingCharacter) + if HF.Chance(arrestSuccessChance) then + HF.SetAffliction(targetCharacter, "cardiacarrest", 0, usingCharacter) + end + end, 3200) + end + end +end +NT.ItemMethods.blahaj = function(item, usingCharacter, targetCharacter, limb) + -- HF.GiveItem(targetCharacter,"ntsfx_squeak") -- this seems to be unnecessary due to the sound effect already being triggered by the xml side of things + HF.AddAffliction(targetCharacter, "psychosis", -2, usingCharacter) +end + +-- surgery + +NT.ItemMethods.advscalpel = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.CanPerformSurgeryOn(targetCharacter) + and not HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then + HF.AddAfflictionLimb( + targetCharacter, + "surgeryincision", + limbtype, + 1 + HF.GetSurgerySkill(usingCharacter) / 2, + usingCharacter + ) + HF.SetAfflictionLimb(targetCharacter, "suturedi", limbtype, 0, usingCharacter) + HF.SetAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0, usingCharacter) + HF.SetAfflictionLimb(targetCharacter, "bandaged", limbtype, 0, usingCharacter) + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end +end +NT.ItemMethods.advhemostat = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 99) + and not HF.HasAfflictionLimb(targetCharacter, "clampedbleeders", limbtype, 1) + then + HF.AddAfflictionLimb( + targetCharacter, + "clampedbleeders", + limbtype, + 1 + HF.GetSurgerySkill(usingCharacter) / 2, + usingCharacter + ) + end +end +NT.ItemMethods.advretractors = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "clampedbleeders", limbtype, 99) + and not HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then + HF.AddAfflictionLimb( + targetCharacter, + "retractedskin", + limbtype, + 1 + HF.GetSurgerySkill(usingCharacter) / 2, + usingCharacter + ) + else + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 10, usingCharacter) + end + end +end +NT.ItemMethods.surgicaldrill = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + and not HF.HasAfflictionLimb(targetCharacter, "drilledbones", limbtype, 1) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then + HF.AddAfflictionLimb( + targetCharacter, + "drilledbones", + limbtype, + 1 + HF.GetSurgerySkill(usingCharacter) / 2, + usingCharacter + ) + else + HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, 12, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 10, usingCharacter) + end + end +end +NT.ItemMethods.surgerysaw = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + and not HF.HasAfflictionLimb(targetCharacter, "bonecut", limbtype, 1) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 50) then + if limbtype ~= LimbType.Torso then + HF.AddAfflictionLimb( + targetCharacter, + "bonecut", + limbtype, + 1 + HF.GetSurgerySkill(usingCharacter) / 2, + usingCharacter + ) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 4, usingCharacter) + end + end +end +NT.ItemMethods.tweezers = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + local usecase = "" + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + then + usecase = "surgery" + elseif + HF.HasAfflictionLimb(targetCharacter, "gunshotwound", limbtype, 1) + or HF.HasAfflictionLimb(targetCharacter, "explosiondamage", limbtype, 1) + then + usecase = "ghetto" + end + + if usecase ~= "" then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 5, usingCharacter) + + if usecase == "ghetto" then + HF.AddAffliction(targetCharacter, "traumaticshock", 5, usingCharacter) + end + + local function healAfflictionGiveSkill(identifier, healamount, skillgain) + local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, identifier) + local healedamount = math.min(affAmount, healamount) + HF.AddAfflictionLimb(targetCharacter, identifier, limbtype, -healamount, usingCharacter) + + if NTSP ~= nil and usecase == "surgery" and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", healedamount * skillgain) + else + HF.GiveSkillScaled(usingCharacter, "medical", healedamount * skillgain / 2) + end + end + + local foreignbody = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "foreignbody", 0) + local scrapdropchance = math.min(foreignbody, 5) / 5 * 0.05 -- 5% chance to drop scrap + if HF.Chance(scrapdropchance) then + HF.GiveItem(usingCharacter, "scrap") + end + + local tohealamount = math.random(3, 10) + healAfflictionGiveSkill("foreignbody", tohealamount, 600) + + if usecase == "surgery" then + healAfflictionGiveSkill("internaldamage", tohealamount, 3) + healAfflictionGiveSkill("blunttrauma", tohealamount, 3) + end + else + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6, usingCharacter) + end + else + local sedated = HF.CanPerformSurgeryOn(targetCharacter) + + -- pinchy pinchy! + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 1, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 0.5, usingCharacter) + if not sedated then + HF.AddAfflictionLimb(targetCharacter, "pain_extremity", limbtype, 5, usingCharacter) + HF.AddAffliction(targetCharacter, "stun", 0.1, usingCharacter) + end + + -- don't rip off peoples faces + if limbtype == LimbType.Head then + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 3, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 2, usingCharacter) + if not sedated then + HF.AddAfflictionLimb(targetCharacter, "pain_extremity", limbtype, 5, usingCharacter) + end + end + end +end + +NT.ItemMethods.organscalpel_liver = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then + local damage = HF.GetAfflictionStrength(targetCharacter, "liverdamage", 0) + local removed = HF.GetAfflictionStrength(targetCharacter, "liverremoved", 0) + if removed <= 0 then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then + HF.SetAffliction(targetCharacter, "liverremoved", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "liverdamage", 100, usingCharacter) + + HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter) + local transplantidentifier = "livertransplant_q1" + if NTC.HasTag(usingCharacter, "organssellforfull") then + transplantidentifier = "livertransplant" + end + if damage < 90 then + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 10 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + args.item.Condition = args.condition + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + condition = 100 - damage, + } + + HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter) + HF.AddAffliction(targetCharacter, "liverdamage", 20, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end +end +NT.ItemMethods.organscalpel_lungs = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then + local damage = HF.GetAfflictionStrength(targetCharacter, "lungdamage", 0) + local removed = HF.GetAfflictionStrength(targetCharacter, "lungremoved", 0) + if removed <= 0 then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 50) then + HF.SetAffliction(targetCharacter, "lungremoved", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "lungdamage", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "respiratoryarrest", 100, usingCharacter) + + HF.SetAffliction(targetCharacter, "pneumothorax", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "needlec", 0, usingCharacter) + + HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter) + local transplantidentifier = "lungtransplant_q1" + if NTC.HasTag(usingCharacter, "organssellforfull") then + transplantidentifier = "lungtransplant" + end + if damage < 90 then + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 10 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + args.item.Condition = args.condition + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + condition = 100 - damage, + } + + HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter) + HF.AddAffliction(targetCharacter, "lungdamage", 20, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end +end +NT.ItemMethods.organscalpel_heart = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then + local damage = HF.GetAfflictionStrength(targetCharacter, "heartdamage", 0) + local removed = HF.GetAfflictionStrength(targetCharacter, "heartremoved", 0) + if removed <= 0 then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 60) then + HF.SetAffliction(targetCharacter, "heartremoved", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "heartdamage", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "cardiacarrest", 100, usingCharacter) + + HF.SetAffliction(targetCharacter, "tamponade", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "heartattack", 0, usingCharacter) + + HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter) + local transplantidentifier = "hearttransplant_q1" + if NTC.HasTag(usingCharacter, "organssellforfull") then + transplantidentifier = "hearttransplant" + end + if damage < 90 then + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 10 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + args.item.Condition = args.condition + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + condition = 100 - damage, + } + + HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter) + HF.AddAffliction(targetCharacter, "heartdamage", 20, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end +end +NT.ItemMethods.organscalpel_kidneys = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then + local damage = HF.GetAfflictionStrength(targetCharacter, "kidneydamage", 0) + local removed = HF.GetAfflictionStrength(targetCharacter, "kidneyremoved", 0) + if removed <= 0 then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then + HF.SetAffliction(targetCharacter, "kidneyremoved", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "kidneydamage", 100, usingCharacter) + HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter) + local transplantidentifier = "kidneytransplant_q1" + if NTC.HasTag(usingCharacter, "organssellforfull") then + transplantidentifier = "kidneytransplant" + end + if damage < 50 then + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 10 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + args.item.Condition = args.condition + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + condition = 100, + } + + HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter) + damage = damage + 50 + end + if damage < 95 then + -- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them + local function postSpawnFunc(args) + local tags = {} + + if args.acidosis > 0 then + table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis))) + elseif args.alkalosis > 0 then + table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis))) + end + if args.sepsis > 10 then + table.insert(tags, "sepsis") + end + + local tagstring = "" + for index, value in ipairs(tags) do + tagstring = tagstring .. value + if index < #tags then + tagstring = tagstring .. "," + end + end + + args.item.Tags = tagstring + args.item.Condition = args.condition + end + local params = { + acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"), + alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"), + sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"), + condition = 100 - (damage - 50) * 2, + } + + HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter) + HF.AddAffliction(targetCharacter, "kidneydamage", 20, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end +end +NT.ItemMethods.organscalpel_brain = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if limbtype == LimbType.Head and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then + local damage = HF.GetAfflictionStrength(targetCharacter, "cerebralhypoxia", 0) + local removed = HF.GetAfflictionStrength(targetCharacter, "brainremoved", 0) + if removed <= 0 then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 100) then + HF.SetAffliction(targetCharacter, "brainremoved", 100, usingCharacter) + HF.AddAffliction(targetCharacter, "cerebralhypoxia", 100, usingCharacter) + + if NTSP ~= nil then + if HF.HasAffliction(targetCharacter, "artificialbrain") then + HF.SetAffliction(targetCharacter, "artificialbrain", 0, usingCharacter) + damage = 100 + end + end + + if damage < 90 then + local postSpawnFunction = function(item, donor, client) + item.Condition = 100 - damage + if client ~= nil then + item.Description = client.Name + end + end + + if SERVER then + -- use server spawn method + local prefab = ItemPrefab.GetItemPrefab("braintransplant") + local client = HF.CharacterToClient(targetCharacter) + Entity.Spawner.AddItemToSpawnQueue( + prefab, + usingCharacter.WorldPosition, + nil, + nil, + function(item) + usingCharacter.Inventory.TryPutItem(item, nil, { InvSlotType.Any }) + postSpawnFunction(item, targetCharacter, client) + end + ) + + if client ~= nil then + client.SetClientCharacter(nil) + end + else + -- use client spawn method + local item = Item(ItemPrefab.GetItemPrefab("braintransplant"), usingCharacter.WorldPosition) + usingCharacter.Inventory.TryPutItem(item, nil, { InvSlotType.Any }) + postSpawnFunction(item, targetCharacter, nil) + end + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter) + HF.AddAffliction(targetCharacter, "cerebralhypoxia", 50, usingCharacter) + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end +end + +NT.ItemMethods.osteosynthesisimplants = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + if + HF.CanPerformSurgeryOn(targetCharacter) and HF.HasAfflictionLimb(targetCharacter, "drilledbones", limbtype, 99) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then + -- the other stuff + local function removeAfflictionPlusGainSkill(affidentifier, skillgain) + if HF.HasAfflictionLimb(targetCharacter, affidentifier, limbtype) then + HF.SetAfflictionLimb(targetCharacter, affidentifier, limbtype, 0, usingCharacter) + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", skillgain) + else + HF.GiveSkillScaled(usingCharacter, "medical", skillgain / 4) + end + end + end + local function removeAfflictionNonLimbSpecificPlusGainSkill(affidentifier, skillgain) + if HF.HasAffliction(targetCharacter, affidentifier) then + HF.SetAffliction(targetCharacter, affidentifier, 0, usingCharacter) + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", skillgain) + else + HF.GiveSkillScaled(usingCharacter, "medical", skillgain / 4) + end + end + end + + local implantafflictions = { + ll_fracture = { xpgain = 10000 }, + rl_fracture = { xpgain = 10000 }, + la_fracture = { xpgain = 10000 }, + ra_fracture = { xpgain = 10000 }, + h_fracture = { xpgain = 10000 }, + n_fracture = { xpgain = 10000 }, + t_fracture = { xpgain = 10000 }, + boneclamp = { xpgain = 0 }, + drilledbones = { xpgain = 0 }, + } + + for key, value in pairs(implantafflictions) do + local prefab = AfflictionPrefab.Prefabs[key] + if + prefab ~= nil + and (value.case == nil or HF.HasAfflictionLimb(targetCharacter, value.case, limbtype)) + then + local skillgain = value.xpgain or 0 + if prefab.LimbSpecific then + removeAfflictionPlusGainSkill(key, skillgain) + elseif prefab.IndicatorLimb == limbtype then + removeAfflictionNonLimbSpecificPlusGainSkill(key, skillgain) + end + end + end + + HF.SetAfflictionLimb(targetCharacter, "bonegrowth", limbtype, 100, usingCharacter) + item.Condition = item.Condition - 25 + if item.Condition <= 0 then + HF.RemoveItem(item) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 5, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 5, usingCharacter) + end + end +end +NT.ItemMethods.spinalimplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + if + HF.CanPerformSurgeryOn(targetCharacter) + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 50) + and HF.HasAffliction(targetCharacter, "t_paralysis", 0.1) + then + if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then + HF.SetAffliction(targetCharacter, "t_paralysis", 0, usingCharacter) + HF.RemoveItem(item) + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", 12000) + else + HF.GiveSkillScaled(usingCharacter, "medical", 6000) + end + else + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 5, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 5, usingCharacter) + end + end +end + +NT.ItemMethods.endovascballoon = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1) + and HF.HasAffliction(targetCharacter, "t_arterialcut", 1) + then + HF.AddAffliction(targetCharacter, "balloonedaorta", 100, usingCharacter) + HF.SetAffliction(targetCharacter, "internalbleeding", 0, usingCharacter) + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", 10000) + else + HF.GiveSkillScaled(usingCharacter, "medical", 5000) + end + + if HF.Chance(NTC.GetMultiplier(usingCharacter, "balloonconsumechance")) then + HF.RemoveItem(item) + end + end +end +NT.ItemMethods.medstent = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if limbtype == LimbType.Torso and HF.HasAffliction(targetCharacter, "balloonedaorta", 1) then + HF.SetAffliction(targetCharacter, "balloonedaorta", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "t_arterialcut", 0, usingCharacter) + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", 20000) + else + HF.GiveSkillScaled(usingCharacter, "medical", 10000) + end + end +end +NT.ItemMethods.drainage = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if + limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) + and HF.HasAffliction(targetCharacter, "pneumothorax") + then + HF.SetAffliction(targetCharacter, "pneumothorax", 0, usingCharacter) + HF.SetAffliction(targetCharacter, "needlec", 0, usingCharacter) + + if HF.Chance(NTC.GetMultiplier(usingCharacter, "drainageconsumechance")) then + HF.RemoveItem(item) + end + + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", 12000) + else + HF.GiveSkillScaled(usingCharacter, "medical", 6000) + end + end +end +NT.ItemMethods.needle = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + + -- don't work on stasis + if HF.HasAffliction(targetCharacter, "stasis", 0.1) then + return + end + + if limbtype == LimbType.Torso and not HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) then + if HF.GetSkillRequirementMet(usingCharacter, "medical", 20) then + if + HF.HasAffliction(targetCharacter, "pneumothorax") + and not HF.HasAffliction(targetCharacter, "needlec", 0.1) + then + HF.GiveSkillScaled(usingCharacter, "medical", 4000) + end + HF.SetAffliction(targetCharacter, "needlec", 100, usingCharacter) + HF.AddAffliction(targetCharacter, "pneumothorax", 1, usingCharacter) + + if HF.Chance(NTC.GetMultiplier(usingCharacter, "needleconsumechance")) then + HF.RemoveItem(item) + end + else + HF.AddAffliction(targetCharacter, "organdamage", 10, usingCharacter) + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 10, usingCharacter) + end + end +end + +NT.ItemMethods.braintransplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local conditionmodifier = 0 + if not HF.GetSurgerySkillRequirementMet(usingCharacter, 100) then + conditionmodifier = -40 + end + local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100) + if + HF.HasAffliction(targetCharacter, "brainremoved", 1) + and limbtype == LimbType.Head + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) + then + HF.AddAffliction(targetCharacter, "cerebralhypoxia", -workcondition, usingCharacter) + HF.SetAffliction(targetCharacter, "brainremoved", 0, usingCharacter) + + -- give character control to the donor + if SERVER then + local donorclient = item.Description + local client = HF.ClientFromName(donorclient) + if client ~= nil then + client.SetClientCharacter(targetCharacter) + end + end + + HF.RemoveItem(item) + end +end + +local function reattachLimb(item, user, target, limb, itemlimbtype) + local limbtype = HF.NormalizeLimbType(limb.type) + if limbtype ~= itemlimbtype then + return + end + + if NT.LimbIsAmputated(target, limbtype) and HF.HasAfflictionLimb(target, "bonecut", limbtype, 99) then + HF.SetAfflictionLimb(target, "bonecut", limbtype, 0, user) + NT.SurgicallyAmputateLimb(target, limbtype, 0, 0) + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkillScaled(usingCharacter, "surgery", 8000) + else + HF.GiveSkillScaled(usingCharacter, "medical", 4000) + end + HF.RemoveItem(item) + end +end +NT.ItemMethods.rarm = function(item, usingCharacter, targetCharacter, limb) + reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.RightArm) +end +NT.ItemMethods.larm = function(item, usingCharacter, targetCharacter, limb) + reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.LeftArm) +end +NT.ItemMethods.rleg = function(item, usingCharacter, targetCharacter, limb) + reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.RightLeg) +end +NT.ItemMethods.lleg = function(item, usingCharacter, targetCharacter, limb) + reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.LeftLeg) +end + +-- bionic prosthetics +NT.ItemMethods.rarmp = NT.ItemMethods.rarm +NT.ItemMethods.larmp = NT.ItemMethods.larm +NT.ItemMethods.rlegp = NT.ItemMethods.rleg +NT.ItemMethods.llegp = NT.ItemMethods.lleg + +local function InfuseBloodpack(item, packtype, usingCharacter, targetCharacter, limb) + -- determine compatibility + local packhasantibodyA = string.find(packtype, "a") + local packhasantibodyB = string.find(packtype, "b") + local packhasantibodyC = string.find(packtype, "c") -- NT Cybernetics cyberblood + local packhasantibodyRh = string.find(packtype, "plus") + + local targettype = NT.GetBloodtype(targetCharacter) + + local targethasantibodyA = string.find(targettype, "a") + local targethasantibodyB = string.find(targettype, "b") + local targethasantibodyC = string.find(targettype, "c") + local targethasantibodyRh = string.find(targettype, "plus") + + local compatible = (targethasantibodyRh or not packhasantibodyRh) + and (targethasantibodyA or not packhasantibodyA) + and (targethasantibodyB or not packhasantibodyB) + and (targethasantibodyC or not packhasantibodyC) + -- TODO: give always true to team of bots on enemy submarines for future medic AI logic + + local bloodloss = HF.GetAfflictionStrength(targetCharacter, "bloodloss", 0) + local usefulFraction = HF.Clamp(bloodloss / 30, 0, 1) + + if compatible then + HF.AddAffliction(targetCharacter, "bloodloss", -30, usingCharacter) + HF.AddAffliction(targetCharacter, "bloodpressure", 30, usingCharacter) + HF.GiveSkillScaled(usingCharacter, "medical", 4000 * HF.BoolToNum(bloodloss > 100)) + else + HF.AddAffliction(targetCharacter, "bloodloss", -20, usingCharacter) + HF.AddAffliction(targetCharacter, "bloodpressure", 30, usingCharacter) + HF.GiveSkillScaled(usingCharacter, "medical", 4000 * HF.BoolToNum(bloodloss > 100)) + local immunity = HF.GetAfflictionStrength(targetCharacter, "immunity", 100) + HF.AddAffliction(targetCharacter, "hemotransfusionshock", math.max(immunity - 6, 0), usingCharacter) + end + + -- move towards isotonic + HF.SetAffliction( + targetCharacter, + "acidosis", + HF.GetAfflictionStrength(targetCharacter, "acidosis", 0) * HF.Lerp(1, 0.9, usefulFraction) + ) + HF.SetAffliction( + targetCharacter, + "alkalosis", + HF.GetAfflictionStrength(targetCharacter, "alkalosis", 0) * HF.Lerp(1, 0.9, usefulFraction) + ) + + -- check if acidosis, alkalosis or sepsis + local tags = HF.SplitString(item.Tags, ",") + for tag in tags do + if tag == "sepsis" then + HF.AddAffliction(targetCharacter, "sepsis", 1, usingCharacter) + end + + if HF.StartsWith(tag, "acid") then + local split = HF.SplitString(tag, ":") + if split[2] ~= nil then + HF.AddAffliction(targetCharacter, "acidosis", tonumber(split[2]) / 5 * usefulFraction, usingCharacter) + end + elseif HF.StartsWith(tag, "alkal") then + local split = HF.SplitString(tag, ":") + if split[2] ~= nil then + HF.AddAffliction(targetCharacter, "alkalosis", tonumber(split[2]) / 5 * usefulFraction, usingCharacter) + end + end + end + + item.Condition = 0 + --HF.RemoveItem(item) + HF.GiveItem(usingCharacter, "emptybloodpack") + HF.GiveItem(targetCharacter, "ntsfx_syringe") +end +NT.ItemMethods.antibloodloss2 = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 0 then + return + end + + InfuseBloodpack(item, "ominus", usingCharacter, targetCharacter, limb) +end +NT.ItemMethods.stasisbag = function(item, usingCharacter, targetCharacter, limb) + local condition = item.Condition + if condition <= 0 or usingCharacter == targetCharacter then + return + end + + local targetInventory = targetCharacter.Inventory + if targetInventory ~= nil then + if targetInventory.TryPutItem(item, 4, false, true, usingCharacter, true, true) then + HF.GiveItem(targetCharacter, "ntsfx_zipper") + else + local userInventory = usingCharacter.Inventory + local targetItem = HF.GetOuterWear(targetCharacter) + local lhand = HF.GetItemInLeftHand(usingCharacter) + local rhand = HF.GetItemInRightHand(usingCharacter) + if rhand ~= nil then + userInventory.TryPutItem(rhand, nil, { InvSlotType.Any }) + end + if lhand ~= nil then + userInventory.TryPutItem(lhand, nil, { InvSlotType.Any }) + end + userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true) + if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then + HF.GiveItem(targetCharacter, "ntsfx_zipper") + end + end + end +end +--NT.ItemMethods.emergencysuit = function(item, usingCharacter, targetCharacter, limb) +-- local condition = item.Condition +-- if condition <= 0 or usingCharacter == targetCharacter then +-- return +-- end +-- +-- local targetInventory = targetCharacter.Inventory +-- if targetInventory ~= nil then +-- if targetInventory.TryPutItem(item, 4, false, true, usingCharacter, true, true) then +-- HF.GiveItem(targetCharacter, "ntsfx_zipper") +-- else +-- local userInventory = usingCharacter.Inventory +-- local targetItem = HF.GetOuterWear(targetCharacter) +-- local lhand = HF.GetItemInLeftHand(usingCharacter) +-- local rhand = HF.GetItemInRightHand(usingCharacter) +-- if rhand ~= nil then +-- userInventory.TryPutItem(rhand, nil, { InvSlotType.Any }) +-- end +-- if lhand ~= nil then +-- userInventory.TryPutItem(lhand, nil, { InvSlotType.Any }) +-- end +-- userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true) +-- if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then +-- HF.GiveItem(targetCharacter, "ntsfx_zipper") +-- end +-- end +-- end +--end +NT.ItemMethods.autocpr = function(item, usingCharacter, targetCharacter, limb) + local condition = item.Condition + if targetCharacter.InWater then + return + end + + local targetInventory = targetCharacter.Inventory + if targetInventory ~= nil then + if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then + HF.GiveItem(targetCharacter, "ntsfx_zipper") + else + local userInventory = usingCharacter.Inventory + local targetItem = HF.GetOuterWear(targetCharacter) + local lhand = HF.GetItemInLeftHand(usingCharacter) + local rhand = HF.GetItemInRightHand(usingCharacter) + if rhand ~= nil then + userInventory.TryPutItem(rhand, nil, { InvSlotType.Any }) + end + if lhand ~= nil then + userInventory.TryPutItem(lhand, nil, { InvSlotType.Any }) + end + userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true) + if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then + HF.GiveItem(targetCharacter, "ntsfx_zipper") + end + end + end +end +NT.ItemMethods.gelipack = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 25 then + return + end + local limbtype = limb.type + local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 40), 1) + HF.AddAfflictionLimb(targetCharacter, "iced", limbtype, 75 + success * 25, usingCharacter) + + if success and limbtype == LimbType.Torso and HF.HasAffliction(targetCharacter, "internalbleeding", 1) then + local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "internalbleeding") + local healedamount = math.min(affAmount, 100) + HF.AddAfflictionLimb(targetCharacter, "internalbleeding", limbtype, -healedamount, usingCharacter) + HF.GiveSkillScaled(usingCharacter, "medical", healedamount * 1000) + end + HF.GiveItem(targetCharacter, "ntsfx_bandage") + + item.Condition = item.Condition - 35 +end + +-- startswith region begins + +-- transplants + +NT.ItemStartsWithMethods.livertransplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local conditionmodifier = 0 + if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then + conditionmodifier = -40 + end + local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100) + if + HF.HasAffliction(targetCharacter, "liverremoved", 1) + and limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + then + HF.AddAffliction(targetCharacter, "liverdamage", -workcondition, usingCharacter) + HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter) + HF.SetAffliction(targetCharacter, "liverremoved", 0, usingCharacter) + HF.RemoveItem(item) + + local rejectionchance = HF.Clamp( + (HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10) + / 150 + * NTC.GetMultiplier(usingCharacter, "organrejectionchance"), + 0, + 1 + ) + if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then + HF.SetAffliction(targetCharacter, "liverdamage", 100) + end + end +end +NT.ItemStartsWithMethods.hearttransplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local conditionmodifier = 0 + if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then + conditionmodifier = -40 + end + local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100) + if + HF.HasAffliction(targetCharacter, "heartremoved", 1) + and limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + then + HF.AddAffliction(targetCharacter, "heartdamage", -workcondition, usingCharacter) + HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter) + HF.SetAffliction(targetCharacter, "heartremoved", 0, usingCharacter) + HF.RemoveItem(item) + + local rejectionchance = HF.Clamp( + (HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10) + / 150 + * NTC.GetMultiplier(usingCharacter, "organrejectionchance"), + 0, + 1 + ) + if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then + HF.SetAffliction(targetCharacter, "heartdamage", 100) + end + end +end +NT.ItemStartsWithMethods.lungtransplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local conditionmodifier = 0 + if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then + conditionmodifier = -40 + end + local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100) + if + HF.HasAffliction(targetCharacter, "lungremoved", 1) + and limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + then + HF.AddAffliction(targetCharacter, "lungdamage", -workcondition, usingCharacter) + HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter) + HF.SetAffliction(targetCharacter, "lungremoved", 0, usingCharacter) + HF.RemoveItem(item) + + local rejectionchance = HF.Clamp( + (HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10) + / 150 + * NTC.GetMultiplier(usingCharacter, "organrejectionchance"), + 0, + 1 + ) + if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then + HF.SetAffliction(targetCharacter, "lungdamage", 100) + end + end +end +NT.ItemStartsWithMethods.kidneytransplant = function(item, usingCharacter, targetCharacter, limb) + local limbtype = limb.type + local conditionmodifier = 0 + if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then + conditionmodifier = -40 + end + local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100) + if + HF.HasAffliction(targetCharacter, "kidneyremoved", 1) + and limbtype == LimbType.Torso + and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99) + then + Timer.Wait(function() + HF.SetAffliction(targetCharacter, "kidneyremoved", 0, usingCharacter) + end, 5000) + + local rejectionchance = HF.Clamp( + (HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10) + / 150 + * NTC.GetMultiplier(usingCharacter, "organrejectionchance"), + 0, + 1 + ) + if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then + HF.RemoveItem(item) + return + end + + HF.AddAffliction(targetCharacter, "kidneydamage", -workcondition / 2, usingCharacter) + HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 10, usingCharacter) + HF.RemoveItem(item) + end +end + +-- misc + +NT.ItemStartsWithMethods.wrench = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + if NT.LimbIsDislocated(targetCharacter, limbtype) then + local skillrequired = 60 + if + HF.HasAffliction(targetCharacter, "analgesia", 0.5) + or HF.HasAffliction(targetCharacter, "afadrenaline", 0.5) + then + skillrequired = skillrequired - 30 + end + + if HF.GetSkillRequirementMet(usingCharacter, "medical", skillrequired) then + NT.DislocateLimb(targetCharacter, limbtype, -1000) + HF.GiveSkillScaled(usingCharacter, "medical", 4000) + else + NT.BreakLimb(targetCharacter, limbtype, 1) + end + + if not HF.HasAffliction(targetCharacter, "analgesia", 0.5) then + HF.AddAffliction(targetCharacter, "severepain", 5, usingCharacter) + end + elseif not HF.HasAffliction(targetCharacter, "sym_unconsciousness", 0.1) then + local outerWearId = HF.GetOuterWearIdentifier(targetCharacter) + if outerWearId == "stasisbag" or outerWearId == "bodybag" or outerWearId == "autocpr" then + local usingInventory = usingCharacter.Inventory + local equippedOuterItem = HF.GetOuterWear(targetCharacter) + if usingInventory.TryPutItem(equippedOuterItem, nil, { InvSlotType.Any }) then + HF.GiveItem(targetCharacter, "ntsfx_velcro") + end + end + end +end +NT.ItemMethods.heavywrench = NT.ItemStartsWithMethods.wrench +NT.ItemMethods.repairpack = NT.ItemStartsWithMethods.wrench + +NT.ItemStartsWithMethods.bloodpack = function(item, usingCharacter, targetCharacter, limb) + if item.Condition <= 0 then + return + end + + local identifier = item.Prefab.Identifier.Value + local packtype = string.sub(identifier, string.len("bloodpack") + 1) + InfuseBloodpack(item, packtype, usingCharacter, targetCharacter, limb) +end + +-- make it so that the person dragging the wearer of a body bag can drag fast +-- fast dragging may start a little late +Hook.Add("bodybag.dragfast", "bodybag.dragfast", function(effect, deltaTime, item, targets, worldPosition) + local target = nil + + for key in targets do + target = key + end + + if target == nil then + return + end + + local dragger = target.SelectedBy + if dragger == nil then + return + end + HF.SetAffliction(dragger, "stretchers", 100) +end) + +-- this exists purely for NT metabolism +Hook.Add("NT.RotOrgan", "NT.RotOrgan", function(effect, deltaTime, item, targets, worldPosition) + if item then + NT.RotOrgan(item) + end +end) +function NT.RotOrgan(item) + HF.RemoveItem(item) +end +NT.FixCondition = { + "healthscanner", + "bloodanalyzer", + "defibrillator", + "antisepticspray", + "bvm", + "autocpr", +} +function NT.RefreshCondition() + for item in Item.ItemList do + if HF.TableContains(NT.FixCondition, item.Prefab.Identifier.Value) then + item.Condition = 100 + end + end +end +Timer.Wait(function() + NT.RefreshCondition() +end, 1000) +Hook.Add("roundStart", "NT.RoundStart.ConditionItems", function() + Timer.Wait(function() + NT.RefreshCondition() + end, 10000) +end) diff --git a/Neurotrauma/Lua/Scripts/Server/lootcrates.lua b/Neurotrauma/Lua/Scripts/Server/lootcrates.lua new file mode 100644 index 0000000..439caa8 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/lootcrates.lua @@ -0,0 +1,101 @@ +-- Spawns items inside medstartercrate +-- Hooks XML Lua event "NT.medstartercrate.spawn" to create medstartercrate items and put them inside it +Hook.Add( + "NT.medstartercrate.spawn", + "NT.medstartercrate.spawn", + function(effect, deltaTime, item, targets, worldPosition) + Timer.Wait(function() + if item == nil then + return + end + + -- check if the item already got populated before + -- got broken somehow and is no longer needed, handled with oneshot="true" for the StatusEffect inside the medstartercrate item that calls this hook on spawn + + -- local populated = item.HasTag("used") + -- if populated then return end + + -- add used tag + + -- local tags = HF.SplitString(item.Tags,",") + -- table.insert(tags,"used") + -- local tagstring = "" + -- for index, value in ipairs(tags) do + -- tagstring = tagstring..value + -- if index < #tags then tagstring=tagstring.."," end + -- end + -- item.Tags = tagstring + + -- populate with goodies!! + + if item.Scale == 0.5 then + return + end + item.Scale = 0.5 + HF.SpawnItemPlusFunction("medtoolbox", function(params) + HF.SpawnItemPlusFunction("defibrillator", nil, nil, params.item.OwnInventory, 0) + HF.SpawnItemPlusFunction("autocpr", nil, nil, params.item.OwnInventory, 1) + for i = 1, 2, 1 do + HF.SpawnItemPlusFunction("tourniquet", nil, nil, params.item.OwnInventory, 2) + end + for i = 1, 2, 1 do + HF.SpawnItemPlusFunction("ringerssolution", nil, nil, params.item.OwnInventory, 3) + end + HF.SpawnItemPlusFunction("surgicaldrill", nil, nil, params.item.OwnInventory, 4) + HF.SpawnItemPlusFunction("surgerysaw", nil, nil, params.item.OwnInventory, 5) + end, nil, item.OwnInventory, 0) + + HF.SpawnItemPlusFunction("medtoolbox", function(params) + HF.SpawnItemPlusFunction("antibleeding1", nil, nil, params.item.OwnInventory, 0) + HF.SpawnItemPlusFunction("gypsum", nil, nil, params.item.OwnInventory, 1) + HF.SpawnItemPlusFunction("opium", nil, nil, params.item.OwnInventory, 2) + HF.SpawnItemPlusFunction("antibiotics", nil, nil, params.item.OwnInventory, 3) + HF.SpawnItemPlusFunction("ointment", nil, nil, params.item.OwnInventory, 4) + HF.SpawnItemPlusFunction("antisepticspray", function(params2) + HF.SpawnItemPlusFunction("antiseptic", nil, nil, params2.item.OwnInventory, 0) + end, nil, params.item.OwnInventory, 5) + end, nil, item.OwnInventory, 1) + + HF.SpawnItemPlusFunction("surgerytoolbox", function(params) + HF.SpawnItemPlusFunction("advscalpel", nil, nil, params.item.OwnInventory, 0) + HF.SpawnItemPlusFunction("advhemostat", nil, nil, params.item.OwnInventory, 1) + HF.SpawnItemPlusFunction("advretractors", nil, nil, params.item.OwnInventory, 2) + for i = 1, 16, 1 do + HF.SpawnItemPlusFunction("suture", nil, nil, params.item.OwnInventory, 3) + end + HF.SpawnItemPlusFunction("tweezers", nil, nil, params.item.OwnInventory, 4) + HF.SpawnItemPlusFunction("traumashears", nil, nil, params.item.OwnInventory, 5) + HF.SpawnItemPlusFunction("drainage", nil, nil, params.item.OwnInventory, 6) + HF.SpawnItemPlusFunction("needle", nil, nil, params.item.OwnInventory, 7) + HF.SpawnItemPlusFunction("organscalpel_kidneys", nil, nil, params.item.OwnInventory, 8) + HF.SpawnItemPlusFunction("organscalpel_liver", nil, nil, params.item.OwnInventory, 9) + HF.SpawnItemPlusFunction("organscalpel_lungs", nil, nil, params.item.OwnInventory, 10) + HF.SpawnItemPlusFunction("organscalpel_heart", nil, nil, params.item.OwnInventory, 11) + end, nil, item.OwnInventory, 3) + + HF.SpawnItemPlusFunction("bloodanalyzer", nil, nil, item.OwnInventory, 6) + HF.SpawnItemPlusFunction("healthscanner", function(params) + local prefab = ItemPrefab.GetItemPrefab("batterycell") + Entity.Spawner.AddItemToSpawnQueue(prefab, params["item"].WorldPosition, nil, nil, function(batteryItem) + params["item"].OwnInventory.TryPutItem(batteryItem) + end) + end, nil, item.OwnInventory, 7) + end, 35) + end +) + +Hook.Add("character.giveJobItems", "NT.giveHealthScannersBatteries", function(character) + Timer.Wait(function() + for item in character.Inventory.AllItems do + local thisIdentifier = item.Prefab.Identifier.Value + if thisIdentifier == "healthscanner" then + if item.OwnInventory ~= nil and item.OwnInventory.GetItemAt(0) == nil then + local prefab = ItemPrefab.GetItemPrefab("batterycell") + Entity.Spawner.AddItemToSpawnQueue(prefab, character.WorldPosition, nil, nil, function(batteryItem) + item.OwnInventory.TryPutItem(batteryItem, character) + end) + end + end + end + end, 1000) +end) diff --git a/Neurotrauma/Lua/Scripts/Server/modconflict.lua b/Neurotrauma/Lua/Scripts/Server/modconflict.lua new file mode 100644 index 0000000..a95efd7 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/modconflict.lua @@ -0,0 +1,36 @@ +-- Modders, please use ModDir:Neurotrauma when taking dependencies, and +-- name your patches with the word "neurotrauma" (letter case doesnt matter) + +-- sets NT.modconflict to true if incompatible mod detected +-- this applies meta affliction "modconflict" every round +-- prints out the warning and incompatible mod on server startup +-- Hooks Lua event "roundStart" to do the above each round +NT.modconflict = false +function NT.CheckModConflicts() + NT.modconflict = false + if NTConfig.Get("NT_ignoreModConflicts", false) then + return + end + + local itemsToCheck = { "antidama2", "opdeco_hospitalbed" } + + for prefab in ItemPrefab.Prefabs do + if HF.TableContains(itemsToCheck, prefab.Identifier.Value) then + local mod = prefab.ConfigElement.ContentPackage.Name + if not string.find(string.lower(mod), "neurotrauma") then + NT.modconflict = true + print("Found Neurotrauma incompatibility with mod: ", mod) + print("WARNING! mod conflict detected! Neurotrauma may not function correctly and requires a patch!") + return + end + end + end +end +Timer.Wait(function() + NT.CheckModConflicts() +end, 1000) +Hook.Add("roundStart", "NT.RoundStart.modconflicts", function() + Timer.Wait(function() + NT.CheckModConflicts() + end, 10000) +end) diff --git a/Neurotrauma/Lua/Scripts/Server/multiscalpel.lua b/Neurotrauma/Lua/Scripts/Server/multiscalpel.lua new file mode 100644 index 0000000..4f0d1d8 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/multiscalpel.lua @@ -0,0 +1,302 @@ +-- NT functions for multiscalpel mode setting +-- Hooks XML Lua events defined in the multiscalpel item.xml +-- Hooks Lua event "roundStart" to RefreshAllMultiscalpels descriptions +function NT.SetMultiscalpelFunction(item, func) + if func ~= "" then + item.Tags = "multiscalpel_" .. func + else + item.Tags = "" + end + NT.RefreshScalpelDescription(item) +end + +local function GetMultiscalpelMode(item) + local functiontag = "" + local tags = HF.SplitString(item.Tags, ",") + for tag in tags do + if HF.StartsWith(tag, "multiscalpel_") then + functiontag = HF.SplitString(tag, "_")[2] + break + end + end + + return functiontag +end + +function NT.RefreshScalpelDescription(item) + -- if not HF.ItemHasTag(item,"init") then return end + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + NT.RefreshScalpelDescription(item) + end, 35) + return + end + + local functiontag = GetMultiscalpelMode(item) + + local description = "" + if functiontag ~= "" then + description = HF.GetText("multiscalpel." .. functiontag) + end + + if description == "" then + return + end + + local targetinventory = item.ParentInventory + local targetslot = 0 + if targetinventory ~= nil then + targetslot = targetinventory.FindIndex(item) + end + + local function SpawnFunc(newscalpelitem, targetinventory) + if targetinventory ~= nil then + targetinventory.TryPutItem(newscalpelitem, targetslot, true, true, nil) + end + newscalpelitem.Description = description + newscalpelitem.Tags = "multiscalpel_" .. functiontag + end + HF.RemoveItem(item) + Timer.Wait(function() + local prefab = item.Prefab + Entity.Spawner.AddItemToSpawnQueue(prefab, item.WorldPosition, nil, nil, function(newscalpelitem) + SpawnFunc(newscalpelitem, targetinventory) + end) + end, 35) +end + +Hook.Add("roundStart", "NT.RoundStart.Multiscalpels", function() + Timer.Wait(function() + NT.RefreshAllMultiscalpels() + end, 10000) -- maybe 10 seconds is enough? +end) + +function NT.RefreshAllMultiscalpels() + -- descriptions dont get serialized, so i have to respawn + -- every scalpel every round to keep their descriptions (big oof) + + -- fetch scalpel items + local scalpelItems = {} + for item in Item.ItemList do + if item.Prefab.Identifier.Value == "multiscalpel" then + table.insert(scalpelItems, item) + end + end + -- refresh items + for scalpel in scalpelItems do + NT.RefreshScalpelDescription(scalpel) + end +end +Timer.Wait(function() + NT.RefreshAllMultiscalpels() +end, 50) + +Hook.Add( + "NT.multiscalpel.incision", + "NT.multiscalpel.incision", + function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "incision") + end +) +Hook.Add("NT.multiscalpel.kidneys", "NT.multiscalpel.kidneys", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "kidneys") +end) +Hook.Add("NT.multiscalpel.liver", "NT.multiscalpel.liver", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "liver") +end) +Hook.Add("NT.multiscalpel.lungs", "NT.multiscalpel.lungs", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "lungs") +end) +Hook.Add("NT.multiscalpel.heart", "NT.multiscalpel.heart", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "heart") +end) +Hook.Add("NT.multiscalpel.brain", "NT.multiscalpel.brain", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "brain") +end) +Hook.Add("NT.multiscalpel.bandage", "NT.multiscalpel.bandage", function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "bandage") +end) +Hook.Add( + "NT.multiscalpel.speedflex", + "NT.multiscalpel.speedflex", + function(effect, deltaTime, item, targets, worldPosition) + NT.SetMultiscalpelFunction(item, "speedflex") + end +) + +NT.ItemMethods.multiscalpel = function(item, usingCharacter, targetCharacter, limb) + local limbtype = HF.NormalizeLimbType(limb.type) + + local mode = GetMultiscalpelMode(item) + if mode == "" then + mode = "none" + end + + local modeFunctions = { + none = function(item, usingCharacter, targetCharacter, limb) end, + incision = NT.ItemMethods.advscalpel, + kidneys = NT.ItemMethods.organscalpel_kidneys, + liver = NT.ItemMethods.organscalpel_liver, + lungs = NT.ItemMethods.organscalpel_lungs, + heart = NT.ItemMethods.organscalpel_heart, + brain = NT.ItemMethods.organscalpel_brain, + bandage = function(item, usingCharacter, targetCharacter, limb) + -- remove casts, bandages, and if none of those apply, cause some damage + + -- code snippet taken from NT.ItemMethods.traumashears + -- does the target have any cuttable afflictions? + local cuttables = HF.CombineArrays(NT.CuttableAfflictions, NT.TraumashearsAfflictions) + local canCut = false + for val in cuttables do + local prefab = AfflictionPrefab.Prefabs[val] + if prefab ~= nil then + if prefab.LimbSpecific then + if HF.HasAfflictionLimb(targetCharacter, val, limbtype, 0.1) then + canCut = true + break + end + elseif limbtype == prefab.IndicatorLimb then + if HF.HasAffliction(targetCharacter, val, 0.1) then + canCut = true + break + end + end + end + end + + if canCut then + NT.ItemMethods.traumashears(item, usingCharacter, targetCharacter, limb) + else + -- malpractice time!!!! + local open = HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) + local istorso = limbtype == LimbType.Torso + local ishead = limbtype == LimbType.Head + + if not open then + HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 6 + math.random() * 4, usingCharacter) + HF.AddAfflictionLimb( + targetCharacter, + "lacerations", + limbtype, + 2.5 + math.random() * 5, + usingCharacter + ) + HF.GiveItem(targetCharacter, "ntsfx_slash") + else + if istorso then + -- stabbing an open torso (not good for the organs therein!) + + HF.AddAffliction(targetCharacter, "internalbleeding", 6 + math.random() * 12, usingCharacter) + HF.AddAfflictionLimb( + targetCharacter, + "lacerations", + limbtype, + 4 + math.random() * 6, + usingCharacter + ) + HF.AddAfflictionLimb( + targetCharacter, + "internaldamage", + limbtype, + 4 + math.random() * 6, + usingCharacter + ) + + local case = math.random() + local casecount = 4 + if case < 1 / casecount then + HF.AddAffliction(targetCharacter, "kidneydamage", 10 + math.random() * 10, usingCharacter) + elseif case < 2 / casecount then + HF.AddAffliction(targetCharacter, "liverdamage", 10 + math.random() * 10, usingCharacter) + elseif case < 3 / casecount then + HF.AddAffliction(targetCharacter, "lungdamage", 10 + math.random() * 10, usingCharacter) + elseif case < 4 / casecount then + HF.AddAffliction(targetCharacter, "heartdamage", 10 + math.random() * 10, usingCharacter) + end + elseif ishead then + -- stabbing an open head (brain surgery done right!) + + HF.AddAffliction(targetCharacter, "cerebralhypoxia", 15 + math.random() * 15, usingCharacter) + HF.AddAfflictionLimb( + targetCharacter, + "internaldamage", + limbtype, + 10 + math.random() * 10, + usingCharacter + ) + HF.AddAfflictionLimb( + targetCharacter, + "bleeding", + limbtype, + 6 + math.random() * 12, + usingCharacter + ) + else + -- stabbing an open arm or leg (how to cause fractures) + + HF.AddAfflictionLimb( + targetCharacter, + "bleeding", + limbtype, + 6 + math.random() * 6, + usingCharacter + ) + HF.AddAfflictionLimb( + targetCharacter, + "lacerations", + limbtype, + 4 + math.random() * 6, + usingCharacter + ) + HF.AddAfflictionLimb( + targetCharacter, + "internaldamage", + limbtype, + 4 + math.random() * 6, + usingCharacter + ) + if HF.Chance(0.1) then + NT.BreakLimb(targetCharacter, limbtype) + end + end + + HF.GiveItem(targetCharacter, "ntsfx_slash") + end + end + end, + speedflex = function(item, usingCharacter, targetCharacter, limb) + local animcontroller = targetCharacter.AnimController + local torsoLimb = limb + if animcontroller ~= nil then + torsoLimb = animcontroller.MainLimb + end + + if limbtype == LimbType.Head then + NT.ItemMethods.organscalpel_brain(item, usingCharacter, targetCharacter, limb) + elseif limbtype == LimbType.LeftArm then + NT.ItemMethods.organscalpel_kidneys(item, usingCharacter, targetCharacter, torsoLimb) + elseif limbtype == LimbType.Torso then + NT.ItemMethods.organscalpel_liver(item, usingCharacter, targetCharacter, torsoLimb) + elseif limbtype == LimbType.RightArm then + NT.ItemMethods.organscalpel_heart(item, usingCharacter, targetCharacter, torsoLimb) + elseif limbtype == LimbType.LeftLeg then + NT.ItemMethods.organscalpel_lungs(item, usingCharacter, targetCharacter, torsoLimb) + end + end, + } + + if modeFunctions[mode] ~= nil then + modeFunctions[mode](item, usingCharacter, targetCharacter, limb) + end + + if mode ~= "none" then + Timer.Wait(function() + item.Tags = "multiscalpel_" .. mode + end, 50) + end +end diff --git a/Neurotrauma/Lua/Scripts/Server/ntcompat.lua b/Neurotrauma/Lua/Scripts/Server/ntcompat.lua new file mode 100644 index 0000000..1f29bd8 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/ntcompat.lua @@ -0,0 +1,311 @@ +NTC = {} -- a class containing compatibility functions for other mods to make use of neurotraumas symptom system + +-- use this function to register your expansion mod to be displayed by the +-- console lua startup readout of neurotrauma expansions + +-- check surgery plus or cybernetics for an example +-- example of code for registering your expansion in init.lua: + +-- MyExp = {} -- Example Expansions +-- MyExp.Name="My Expansion" +-- MyExp.Version = "A1.0" +-- MyExp.VersionNum = 01000000 -- split into two digits (01->1.; 00->0.; 00->0h; 00->0) -> 1.0.0h0 +-- MyExp.MinNTVersion = "A1.7.1" +-- MyExp.MinNTVersionNum = 01070100 -- 01.07.01.00 -> A1.7.1h0 +-- Timer.Wait(function() if NT ~= nil then NTC.RegisterExpansion(MyExp) end end,1) + +NTC.RegisteredExpansions = {} +function NTC.RegisterExpansion(expansionMainObject) + table.insert(NTC.RegisteredExpansions, expansionMainObject) +end + +-- a table of tables, each character that has some custom data has an entry +NTC.CharacterData = {} + +-- use this function to induce symptoms temporarily +-- duration is in humanupdates (~2 seconds), should at least be 2 to prevent symptom flickering +function NTC.SetSymptomTrue(character, symptomidentifer, duration) + if duration == nil then + duration = 2 + end + + NTC.AddEmptyCharacterData(character) + local data = NTC.GetCharacterData(character) + data[symptomidentifer] = duration + + NTC.CharacterData[character.ID] = data +end + +-- use this function to suppress symptoms temporarily. this takes precedence over NTC.SetSymptomTrue. +-- duration is in humanupdates (~2 seconds), should at least be 2 to prevent symptom flickering +function NTC.SetSymptomFalse(character, symptomidentifer, duration) + if duration == nil then + duration = 2 + end + + NTC.AddEmptyCharacterData(character) + local data = NTC.GetCharacterData(character) + data["!" .. symptomidentifer] = duration + + NTC.CharacterData[character.ID] = data +end + +-- usage example: anywhere in your lua code, cause 4 seconds (2 humanupdates) of pale skin with this: +-- NTC.SetSymptomTrue(targetCharacter,"sym_paleskin",2) + +-- a list of possible symptom identifiers: + +-- sym_unconsciousness +-- tachycardia +-- hyperventilation +-- hypoventilation +-- dyspnea +-- sym_cough +-- sym_paleskin +-- sym_lightheadedness +-- sym_blurredvision +-- sym_confusion +-- sym_headache +-- sym_legswelling +-- sym_weakness +-- sym_wheezing +-- sym_vomiting +-- sym_nausea +-- sym_hematemesis +-- sym_fever +-- sym_abdomdiscomfort +-- sym_bloating +-- sym_jaundice +-- sym_sweating +-- sym_palpitations +-- sym_craving +-- pain_abdominal +-- pain_chest +-- lockleftarm +-- lockrightarm +-- lockleftleg +-- lockrightleg + +-- with the following identifiers you can either cause things or prevent them. +-- i recommend setting the duration when using these to cause things to 1. + +-- triggersym_seizure +-- triggersym_coma +-- triggersym_stroke +-- triggersym_heartattack +-- triggersym_cardiacarrest +-- triggersym_respiratoryarrest + +-- prints all of the current compatibility data in the chat +-- might be useful for debugging +function NTC.DebugPrintAllData() + local res = "neurotrauma compatibility data:\n" + for key, value in pairs(NTC.CharacterData) do + res = res .. "\n" .. value["character"].Name + for key2, value2 in pairs(value) do + res = res .. "\n " .. tostring(key2) .. " : " .. tostring(value2) + end + end + + PrintChat(res) +end + +NTC.PreHumanUpdateHooks = {} +-- use this function to add a function to be executed before humanupdate with a character parameter +function NTC.AddPreHumanUpdateHook(func) + NTC.PreHumanUpdateHooks[#NTC.PreHumanUpdateHooks + 1] = func +end + +NTC.HumanUpdateHooks = {} +-- use this function to add a function to be executed after humanupdate with a character parameter +function NTC.AddHumanUpdateHook(func) + NTC.HumanUpdateHooks[#NTC.HumanUpdateHooks + 1] = func +end + +NTC.OnDamagedHooks = {} +-- use this function to add a function to be executed after ondamaged +-- with a characterhealth, attack result and limb parameter +function NTC.AddOnDamagedHook(func) + NTC.OnDamagedHooks[#NTC.OnDamagedHooks + 1] = func +end + +NTC.ModifyingOnDamagedHooks = {} +-- use this function to add a function to be executed before ondamaged +-- with a characterhealth, afflictions and limb parameter, and afflictions return type +function NTC.AddModifyingOnDamagedHook(func) + NTC.ModifyingOnDamagedHooks[#NTC.ModifyingOnDamagedHooks + 1] = func +end + +NTC.CharacterSpeedMultipliers = {} +-- use this function to multiply a characters speed for one human update. +-- should always be called from within a prehumanupdate hook +function NTC.MultiplySpeed(character, multiplier) + if NTC.CharacterSpeedMultipliers[character] == nil then + NTC.CharacterSpeedMultipliers[character] = multiplier + else + NTC.CharacterSpeedMultipliers[character] = NTC.CharacterSpeedMultipliers[character] * multiplier + end +end + +-- use this function to register an affliction to be detected by the hematology analyzer +function NTC.AddHematologyAffliction(identifier) + Timer.Wait(function() + if not HF.TableContains(NT.HematologyDetectable, identifier) then + table.insert(NT.HematologyDetectable, identifier) + end + end, 1) +end + +-- use this function to register an affliction to be healed by sutures +-- identifier: the identifier of the affliction to be healed +-- surgeryskillgain: how much surgery skill is gained by healing this affliction (optional, default: 0) +-- requiredaffliction: what affliction has to be present alongside the healed affliction for it to get healed (optional, default: none) +-- func: a function that gets run if the affliction is present. if provided, doesnt heal the affliction automatically (optional, default: none) +-- func(item, usingCharacter, targetCharacter, limb) +function NTC.AddSuturedAffliction(identifier, surgeryskillgain, requiredaffliction, func) + Timer.Wait(function() + if not HF.TableContains(NT.SutureAfflictions, identifier) then + NT.SutureAfflictions[identifier] = { + xpgain = surgeryskillgain, + case = requiredaffliction, + func = func, + } + end + end, 1) +end + +NTC.AfflictionsAffectingVitality = { + bleeding = true, + bleedingnonstop = true, + burn = true, + acidburn = true, + lacerations = true, + gunshotwound = true, + bitewounds = true, + explosiondamage = true, + blunttrauma = true, + internaldamage = true, + organdamage = true, + cerebralhypoxia = true, + gangrene = true, + th_amputation = true, + sh_amputation = true, + suturedw = true, + alcoholaddiction = true, + opiateaddiction = true, +} +function NTC.AddAfflictionAffectingVitality(identifier) + NTC.AfflictionsAffectingVitality[identifier] = true +end + +-- these functions are used by neurotrauma to check for symptom overrides +function NTC.GetSymptom(character, symptomidentifer) + local chardata = NTC.GetCharacterData(character) + if chardata == nil then + return false + end + + local durationleft = chardata[symptomidentifer] + + if durationleft == nil then + return false + end + + return true +end +function NTC.GetSymptomFalse(character, symptomidentifer) + local chardata = NTC.GetCharacterData(character) + if chardata == nil then + return false + end + + local durationleft = chardata["!" .. symptomidentifer] + + if durationleft == nil then + return false + end + + return true +end + +-- sets multiplier data for one humanupdate, should be called from within a humanupdate hook +function NTC.SetMultiplier(character, multiplieridentifier, multiplier) + NTC.AddEmptyCharacterData(character) + local data = NTC.GetCharacterData(character) + data["mult_" .. multiplieridentifier] = NTC.GetMultiplier(character, multiplieridentifier) * multiplier + NTC.CharacterData[character.ID] = data +end +function NTC.GetMultiplier(character, multiplieridentifier) + local data = NTC.GetCharacterData(character) + if data == nil or data["mult_" .. multiplieridentifier] == nil then + return 1 + end + return data["mult_" .. multiplieridentifier] +end + +-- sets tag data for one humanupdate, should be called from within a humanupdate hook +function NTC.SetTag(character, tagidentifier) + NTC.AddEmptyCharacterData(character) + local data = NTC.GetCharacterData(character) + data["tag_" .. tagidentifier] = 1 +end +function NTC.HasTag(character, tagidentifier) + local data = NTC.GetCharacterData(character) + if data == nil or data["tag_" .. tagidentifier] == nil then + return false + end + return true +end + +-- don't concern yourself with these +function NTC.AddEmptyCharacterData(character) + if NTC.GetCharacterData(character) ~= nil then + return + end + local newdat = {} + newdat["character"] = character + NTC.CharacterData[character.ID] = newdat +end +function NTC.CheckChardataEmpty(character) + local chardat = NTC.GetCharacterData(character) + if chardat == nil or HF.TableSize(chardat) > 1 then + return + end + + -- remove entry from data + NTC.CharacterData[character.ID] = nil +end +function NTC.GetCharacterData(character) + return NTC.CharacterData[character.ID] +end +function NTC.TickCharacter(character) + local chardata = NTC.GetCharacterData(character) + if chardata == nil then + return + end + + for key, value in pairs(chardata) do + if key ~= "character" then + if HF.StartsWith(key, "mult_") then -- multipliers + chardata[key] = nil + NTC.CheckChardataEmpty(character) + else -- symptoms + local durationleft = value + if durationleft ~= nil and durationleft > 1 then + chardata[key] = durationleft - 1 + else + chardata[key] = nil + NTC.CheckChardataEmpty(character) + end + end + end + end + + NTC.CharacterData[character.ID] = chardata +end +function NTC.GetSpeedMultiplier(character) + if NTC.CharacterSpeedMultipliers[character] ~= nil then + return NTC.CharacterSpeedMultipliers[character] + end + return 1 +end diff --git a/Neurotrauma/Lua/Scripts/Server/ondamaged.lua b/Neurotrauma/Lua/Scripts/Server/ondamaged.lua new file mode 100644 index 0000000..cce67eb --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/ondamaged.lua @@ -0,0 +1,671 @@ +-- Hooks Lua event "character.applyDamage" to cause NT afflictions after attacks depending on the damaging affliction defined here in NT.OnDamagedMethods +local function getCalculatedConcussionReduction(armor, strength) + if armor == nil then + return 0 + end + local reduction = 0 + + if armor.HasTag("deepdiving") or armor.HasTag("deepdivinglarge") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + elseif armor.HasTag("smallitem") then + local modifiers = armor.GetComponentString("Wearable").DamageModifiers + for modifier in modifiers do + if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then + reduction = strength - strength * modifier.DamageMultiplier + end + end + end + return reduction +end +Hook.Add("character.applyDamage", "NT.ondamaged", function(characterHealth, attackResult, hitLimb) + --print(hitLimb.HealthIndex or hitLimb ~= nil) + + if -- invalid attack data, don't do anything + characterHealth == nil + or characterHealth.Character == nil + or characterHealth.Character.IsDead + or not characterHealth.Character.IsHuman + or attackResult == nil + or attackResult.Afflictions == nil + or #attackResult.Afflictions <= 0 + or hitLimb == nil + or hitLimb.IsSevered + then + return + end + + local afflictions = attackResult.Afflictions + + -- ntc + -- modifying ondamaged hooks + for key, val in pairs(NTC.ModifyingOnDamagedHooks) do + afflictions = val(characterHealth, afflictions, hitLimb) + end + + local identifier = "" + local methodtorun = nil + for value in afflictions do + -- execute fitting method, if available + identifier = value.Prefab.Identifier.Value + methodtorun = NT.OnDamagedMethods[identifier] + if methodtorun ~= nil then + -- make resistance from afflictions apply + local resistance = HF.GetResistance(characterHealth.Character, identifier, hitLimb.type) + local strength = value.Strength * (1 - resistance) + + methodtorun(characterHealth.Character, strength, hitLimb.type) + end + end + + -- ntc + -- ondamaged hooks + for key, val in pairs(NTC.OnDamagedHooks) do + val(characterHealth, attackResult, hitLimb) + end +end) + +NT.OnDamagedMethods = {} + +local function HasLungs(c) + return not HF.HasAffliction(c, "lungremoved") +end +local function HasHeart(c) + return not HF.HasAffliction(c, "heartremoved") +end + +-- cause foreign bodies, rib fractures, pneumothorax, tamponade, internal bleeding, fractures, neurotrauma +NT.OnDamagedMethods.gunshotwound = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + local causeFullForeignBody = false + + -- torso specific + if strength >= 1 and limbtype == LimbType.Torso then + local hitOrgan = false + if + HF.Chance( + HF.Clamp(strength * 0.02, 0, 0.3) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + causeFullForeignBody = true + end + if + HasLungs(character) + and HF.Chance( + 0.3 * NTC.GetMultiplier(character, "pneumothoraxchance") * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + HF.AddAffliction(character, "lungdamage", strength) + HF.AddAffliction(character, "organdamage", strength / 4) + hitOrgan = true + end + if + HasHeart(character) + and hitOrgan == false + and strength >= 5 + and HF.Chance( + strength / 50 * NTC.GetMultiplier(character, "tamponadechance") * NTConfig.Get("NT_tamponadeChance", 1) + ) + then + HF.AddAffliction(character, "tamponade", 5) + HF.AddAffliction(character, "heartdamage", strength) + HF.AddAffliction(character, "organdamage", strength / 4) + hitOrgan = true + end + if strength >= 5 then + HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.3, 0.6)) + end + + -- liver and kidney damage + if hitOrgan == false and strength >= 2 and HF.Chance(0.5) then + HF.AddAfflictionLimb(character, "organdamage", limbtype, strength / 4) + if HF.Chance(0.5) then + HF.AddAffliction(character, "liverdamage", strength) + else + HF.AddAffliction(character, "kidneydamage", strength) + end + end + end + + -- head + if strength >= 1 and limbtype == LimbType.Head then + if + HF.Chance( + strength / 90 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + causeFullForeignBody = true + end + if strength >= 5 and HF.Chance(0.7) then + HF.AddAffliction(character, "cerebralhypoxia", strength * HF.RandomRange(0.1, 0.4)) + end + end + + -- extremities + if strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + strength / 60 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + causeFullForeignBody = true + end + end + + -- foreign bodies + if causeFullForeignBody then + HF.AddAfflictionLimb( + character, + "foreignbody", + limbtype, + HF.Clamp(strength, 0, 30) * NTC.GetMultiplier(character, "foreignbodymultiplier") + ) + else + if HF.Chance(0.75) then + HF.AddAfflictionLimb( + character, + "foreignbody", + limbtype, + HF.Clamp(strength / 4, 0, 20) * NTC.GetMultiplier(character, "foreignbodymultiplier") + ) + end + end +end + +-- cause foreign bodies, rib fractures, pneumothorax, internal bleeding, concussion, fractures +NT.OnDamagedMethods.explosiondamage = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + if HF.Chance(0.75) then + HF.AddAfflictionLimb( + character, + "foreignbody", + limbtype, + strength / 2 * NTC.GetMultiplier(character, "foreignbodymultiplier") + ) + end + + -- torso specific + if strength >= 1 and limbtype == LimbType.Torso then + if + strength >= 10 + and HF.Chance( + strength / 50 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + strength + / 50 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + if strength >= 5 then + HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5)) + end + end + + -- head + if strength >= 1 and limbtype == LimbType.Head then + local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + local reduceddmg = math.max( + 10 + - getCalculatedConcussionReduction(armor1, 10, limbtype) + - getCalculatedConcussionReduction(armor2, 10, limbtype), + 0 + ) + if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then + HF.AddAfflictionResisted(character, "concussion", reduceddmg) + end + if + strength >= 15 + and HF.Chance( + math.min(strength / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + strength >= 15 + and HF.Chance( + math.min(strength / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + HF.AddAffliction(character, "n_fracture", 5) + end + if strength >= 25 and HF.Chance(0.25) then + -- drop previously held item + local previtem = HF.GetHeadWear(character) + if previtem ~= nil then + previtem.Drop(character, true) + end + HF.AddAfflictionLimb(character, "gate_ta_h", limbtype, 5) + end + end + + -- extremities + if strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + strength / 60 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HF.Chance( + 0.35 * NTC.GetMultiplier(character, "dislocationchance") * NTConfig.Get("NT_dislocationChance", 1) + ) and not NT.LimbIsAmputated(character, limbtype) + then + NT.DislocateLimb(character, limbtype) + end + end +end + +-- cause rib fractures, pneumothorax, internal bleeding, concussion, fractures +NT.OnDamagedMethods.bitewounds = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + -- torso specific + if strength >= 1 and limbtype == LimbType.Torso then + if + strength >= 10 + and HF.Chance( + (strength - 10) + / 50 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + (strength - 5) + / 50 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + if strength >= 5 then + HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5)) + end + end + + -- head + if strength >= 1 and limbtype == LimbType.Head then + local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + local reduceddmg = math.max( + 10 + - getCalculatedConcussionReduction(armor1, 10, limbtype) + - getCalculatedConcussionReduction(armor2, 10, limbtype), + 0 + ) + if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then + HF.AddAfflictionResisted(character, "concussion", reduceddmg) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 10) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + end + + -- extremities + if strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance((strength - 5) / 60 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + (strength - 5) + / 60 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + end +end + +-- cause rib fractures, pneumothorax, tamponade, internal bleeding, fractures +NT.OnDamagedMethods.lacerations = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + -- torso specific + if strength >= 1 and limbtype == LimbType.Torso then + if + strength >= 10 + and HF.Chance( + (strength - 10) + / 50 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + (strength - 5) + / 50 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + if + HasHeart(character) + and strength >= 5 + and HF.Chance( + (strength - 5) + / 50 + * NTC.GetMultiplier(character, "tamponadechance") + * NTConfig.Get("NT_tamponadeChance", 1) + ) + then + HF.AddAffliction(character, "tamponade", 5) + end + if strength >= 5 then + HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5)) + end + end + + -- head + if strength >= 1 and limbtype == LimbType.Head then + if + strength >= 15 + and HF.Chance( + math.min((strength - 15) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + end + + -- extremities + if strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + (strength - 5) + / 60 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + end +end + +-- cause rib fractures, organ damage, pneumothorax, concussion, fractures, neurotrauma +NT.OnDamagedMethods.blunttrauma = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + local fractureImmune = HF.HasAffliction(character, "cpr_fracturebuff") + + -- torso + if not fractureImmune and strength >= 1 and limbtype == LimbType.Torso then + if + HF.Chance( + strength / 50 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + + HF.AddAffliction(character, "lungdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "heartdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "liverdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "kidneydamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "organdamage", strength * HF.RandomRange(0, 1)) + + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + strength + / 50 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + end + + -- head + if not fractureImmune and strength >= 1 and limbtype == LimbType.Head then + local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + local reduceddmg = math.max( + 10 + - getCalculatedConcussionReduction(armor1, 10, limbtype) + - getCalculatedConcussionReduction(armor2, 10, limbtype), + 0 + ) + if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then + HF.AddAfflictionResisted(character, "concussion", reduceddmg) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 10) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 10) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + HF.AddAffliction(character, "n_fracture", 5) + end + if strength >= 5 and HF.Chance(0.7) then + HF.AddAffliction(character, "cerebralhypoxia", strength * HF.RandomRange(0.1, 0.4)) + end + end + + -- extremities + if not fractureImmune and strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + strength > 15 + and NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance(strength / 100 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + (strength - 2) + / 60 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HF.Chance( + HF.Clamp((strength - 2) / 80, 0, 0.5) + * NTC.GetMultiplier(character, "dislocationchance") + * NTConfig.Get("NT_dislocationChance", 1) + ) and not NT.LimbIsAmputated(character, limbtype) + then + NT.DislocateLimb(character, limbtype) + end + end +end + +-- cause rib fractures, organ damage, pneumothorax, concussion, fractures +NT.OnDamagedMethods.internaldamage = function(character, strength, limbtype) + limbtype = HF.NormalizeLimbType(limbtype) + + -- torso + if strength >= 1 and limbtype == LimbType.Torso then + if + HF.Chance( + (strength - 5) + / 50 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + + HF.AddAffliction(character, "lungdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "heartdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "liverdamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "kidneydamage", strength * HF.RandomRange(0, 1)) + HF.AddAffliction(character, "organdamage", strength * HF.RandomRange(0, 1)) + + if + HasLungs(character) + and strength >= 5 + and HF.Chance( + (strength - 5) + / 50 + * NTC.GetMultiplier(character, "pneumothoraxchance") + * NTConfig.Get("NT_pneumothoraxChance", 1) + ) + then + HF.AddAffliction(character, "pneumothorax", 5) + end + end + + -- head + if strength >= 1 and limbtype == LimbType.Head then + local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + local reduceddmg = math.max( + 10 + - getCalculatedConcussionReduction(armor1, 10, limbtype) + - getCalculatedConcussionReduction(armor2, 10, limbtype), + 0 + ) + if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then + HF.AddAfflictionResisted(character, "concussion", reduceddmg) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 5) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + strength >= 15 + and HF.Chance( + math.min((strength - 5) / 60, 0.7) + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + HF.AddAffliction(character, "n_fracture", 5) + end + end + + -- extremities + if strength >= 1 and HF.LimbIsExtremity(limbtype) then + if + strength > 10 + and NT.LimbIsBroken(character, limbtype) + and not NT.LimbIsAmputated(character, limbtype) + and HF.Chance((strength - 10) / 60 * NTC.GetMultiplier(character, "traumamputatechance")) + then + NT.TraumamputateLimb(character, limbtype) + end + if + HF.Chance( + (strength - 5) + / 60 + * NTC.GetMultiplier(character, "anyfracturechance") + * NTConfig.Get("NT_fractureChance", 1) + ) + then + NT.BreakLimb(character, limbtype) + end + if + HF.Chance( + 0.25 * NTC.GetMultiplier(character, "dislocationchance") * NTConfig.Get("NT_dislocationChance", 1) + ) and not NT.LimbIsAmputated(character, limbtype) + then + NT.DislocateLimb(character, limbtype) + end + end +end diff --git a/Neurotrauma/Lua/Scripts/Server/onfire.lua b/Neurotrauma/Lua/Scripts/Server/onfire.lua new file mode 100644 index 0000000..c3c5126 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/onfire.lua @@ -0,0 +1,19 @@ +-- Hooks Lua event "Barotrauma.Character" to apply vanilla burning (formerly NT onfire) affliction and set a human on fire +Hook.HookMethod("Barotrauma.Character", "ApplyStatusEffects", function(instance, ptable) + if ptable.actionType == ActionType.OnFire then + local function ApplyBurn(character, limbtype) + HF.AddAfflictionLimb(character, "burning", limbtype, ptable.deltaTime * 3) + end + + if instance.IsHuman then + ApplyBurn(instance, LimbType.Torso) + ApplyBurn(instance, LimbType.Head) + ApplyBurn(instance, LimbType.LeftArm) + ApplyBurn(instance, LimbType.RightArm) + ApplyBurn(instance, LimbType.LeftLeg) + ApplyBurn(instance, LimbType.RightLeg) + else + HF.AddAfflictionLimb(instance, "burning", instance.AnimController.MainLimb.type, ptable.deltaTime * 5) + end + end +end, Hook.HookMethodType.After) diff --git a/Neurotrauma/Lua/Scripts/Server/screams.lua b/Neurotrauma/Lua/Scripts/Server/screams.lua new file mode 100644 index 0000000..c0d172d --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Server/screams.lua @@ -0,0 +1,9 @@ +-- Hooks XML Lua event "NT.causeScreams" to cause character to scream if config has enabled screaming +Hook.Add("NT.causeScreams", "NT.causeScreams", function(...) + if not NTConfig.Get("NT_screams", true) then + return + end + + local character = table.pack(...)[3] + HF.SetAffliction(character, "screaming", 10) +end) diff --git a/Neurotrauma/Lua/Scripts/Shared/pronecolliderfix.lua b/Neurotrauma/Lua/Scripts/Shared/pronecolliderfix.lua new file mode 100644 index 0000000..f5ac5db --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Shared/pronecolliderfix.lua @@ -0,0 +1,13 @@ +Hook.Patch("Barotrauma.Character", "Control", function(instance) + if instance.CharacterHealth.GetAfflictionStrengthByIdentifier("forceprone") > 1 then + instance.SetInput(InputType.Crouch, false, true) + end +end) + +Hook.Patch("Barotrauma.Ragdoll", "get_ColliderHeightFromFloor", function(instance, ptable) + if instance.Character and instance.Character.CharacterHealth then + if instance.Character.CharacterHealth.GetAfflictionStrengthByIdentifier("forceprone") > 1 then + return Single(0.1) + end + end +end, Hook.HookMethodType.After) diff --git a/Neurotrauma/Lua/Scripts/Shared/surgerytable.lua b/Neurotrauma/Lua/Scripts/Shared/surgerytable.lua new file mode 100644 index 0000000..8423ad6 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/Shared/surgerytable.lua @@ -0,0 +1,142 @@ +-- Hooks a XML Lua event "surgerytable.update" to use for getting +-- Neurotrauma and vanilla character data with the surgical table or hospital bed +-- lifted and translated from betterhealthui +local NormalHeartrate = 60 +local MaxTachycardiaHeartrate = 180 +local MaxFibrillationHeartrate = 300 +local function GetHeartrate(character) + if character == nil or character.CharacterHealth == nil or character.IsDead then + return 0 + end + + local rate = NormalHeartrate + + local cardiacarrest = character.CharacterHealth.GetAffliction("cardiacarrest") + + -- return 0 rate if in cardiac arrest + if cardiacarrest ~= nil and cardiacarrest.Strength >= 0.5 then + return 0 + end + + local tachycardia = character.CharacterHealth.GetAffliction("tachycardia") + local fibrillation = character.CharacterHealth.GetAffliction("fibrillation") + + if fibrillation ~= nil then + rate = HF.Lerp( + MaxTachycardiaHeartrate, + MaxFibrillationHeartrate, + fibrillation.Strength / 100 * (1 + math.random() * 0.5) + ) + elseif tachycardia ~= nil then + rate = HF.Lerp(NormalHeartrate, MaxTachycardiaHeartrate, tachycardia.Strength / 100) + end + + return rate +end + +local function GetPH(character) + if character == nil or character.CharacterHealth == nil then + return 0 + end + + local acidosis = HF.GetAfflictionStrength(character, "acidosis", 0) + local alkalosis = HF.GetAfflictionStrength(character, "alkalosis", 0) + + return alkalosis - acidosis +end + +Hook.Add("surgerytable.update", "surgerytable.update", function(effect, deltaTime, item, targets, worldPosition) + -- fetch controller component + local controllerComponent = item.GetComponentString("Controller") + if controllerComponent == nil then + item.SendSignal("0", "state_out") + return + end + + -- check if targets present + -- laying on the table + local target = controllerComponent.User + -- noone one the table? check the targets array for the one with the least vitality + if target == nil or not target.IsHuman then + local minVitality = 999 + for index, value in ipairs(targets) do + if value.Name ~= nil and value.IsHuman and (value.Vitality < minVitality) then + minVitality = value.Vitality + target = value + end + end + end + -- no target found + if target == nil or not target.IsHuman then + item.SendSignal("0", "state_out") + return + end + + -- send signals + item.SendSignal("1", "state_out") + if target.IsDead then + item.SendSignal("0", "alive_out") + else + item.SendSignal("1", "alive_out") + end + if target.IsDead or HF.HasAffliction(target, "sym_unconsciousness", 0.1) then + item.SendSignal("0", "conscious_out") + else + item.SendSignal("1", "conscious_out") + end + item.SendSignal(target.Name, "name_out") + item.SendSignal(tostring(HF.Round(target.Vitality)), "vitality_out") + if target.IsDead then + item.SendSignal("0", "bloodpressure_out") + else + item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "bloodpressure", 100))), "bloodpressure_out") + end + item.SendSignal(tostring(HF.Round(100 - HF.GetAfflictionStrength(target, "hypoxemia", 0))), "bloodoxygen_out") + item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "cerebralhypoxia", 0))), "neurotrauma_out") + item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "organdamage", 0))), "organdamage_out") + + local heartrate = HF.Round(GetHeartrate(target)) + item.SendSignal(tostring(heartrate), "heartrate_out") + + local breathingrate = math.random(15, 18) + if HF.HasAffliction(target, "respiratoryarrest") or target.IsDead then + breathingrate = 0 + elseif HF.HasAffliction(target, "hyperventilation") then + breathingrate = breathingrate + math.random(6, 8) + elseif HF.HasAffliction(target, "hypoventilation") then + breathingrate = breathingrate - math.random(6, 8) + end + item.SendSignal(tostring(breathingrate), "breathingrate_out") + + item.SendSignal(tostring(HF.BoolToNum(HF.HasAffliction(target, "surgeryincision"), 1)), "insurgery_out") + + if target.IsDead and target.causeOfDeath ~= nil then + item.SendSignal(HF.CauseOfDeathToString(target.causeOfDeath), "causeofdeath_out") + end + + local bloodph = HF.Round(GetPH(target)) + item.SendSignal(tostring(bloodph), "bloodph_out") +end) + +--Hook.Add("surgerytable.forceon", "surgerytable.forceon", function (effect, deltaTime, item, targets, worldPosition) +-- -- fetch controller component +-- local controllerComponent = item.GetComponentString("Controller") +-- if controllerComponent == nil or controllerComponent.IsActive then return end +-- +-- -- check if targets present +-- if targets == nil or #targets <= 0 then return end +-- local target = nil +-- for index, value in ipairs(targets) do +-- target=value +-- if target ~=nil then break end +-- end +-- if target == nil then return end +-- +-- -- was experimenting with forcing the patient into laying down here, sort of worked... until 0 vitality. +-- -- it's too janky to be released. +-- +-- -- target.Stun = 0 +-- -- HF.SetAffliction(target,"givein",0) +-- -- controllerComponent.Select(target) +-- -- target.SelectedConstruction = item +--end) diff --git a/Neurotrauma/Lua/Scripts/configdata.lua b/Neurotrauma/Lua/Scripts/configdata.lua new file mode 100644 index 0000000..a1a12e4 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/configdata.lua @@ -0,0 +1,408 @@ +NTConfig = { Entries = {}, Expansions = {} } -- contains all config options, their default, type, valid ranges, difficulty influence + +local configDirectoryPath = Game.SaveFolder .. "/ModConfigs" +local configFilePath = configDirectoryPath .. "/Neurotrauma.json" + +-- this is the function that gets used in other mods to add their own settings to the config +function NTConfig.AddConfigOptions(expansion) + table.insert(NTConfig.Expansions, expansion) + + for key, entry in pairs(expansion.ConfigData) do + NTConfig.Entries[key] = entry + NTConfig.Entries[key].value = entry.default + end +end + +function NTConfig.SaveConfig() + --prevent both owner client and server saving config at the same time and potentially erroring from file access + if Game.IsMultiplayer and CLIENT and Game.Client.MyClient.IsOwner then + return + end + + local tableToSave = {} + for key, entry in pairs(NTConfig.Entries) do + tableToSave[key] = entry.value + end + + File.CreateDirectory(configDirectoryPath) + File.Write(configFilePath, json.serialize(tableToSave)) +end + +function NTConfig.ResetConfig() + local tableToSave = {} + for key, entry in pairs(NTConfig.Entries) do + tableToSave[key] = entry.default + NTConfig.Entries[key] = entry + NTConfig.Entries[key].value = entry.default + end + + -- File.CreateDirectory(configDirectoryPath) + -- File.Write(configFilePath, json.serialize(tableToSave)) +end + +function NTConfig.LoadConfig() + if not File.Exists(configFilePath) then + return + end + + local readConfig = json.parse(File.Read(configFilePath)) + + for key, value in pairs(readConfig) do + if NTConfig.Entries[key] then + NTConfig.Entries[key].value = value + end + end +end + +function NTConfig.Get(key, default) + if NTConfig.Entries[key] then + return NTConfig.Entries[key].value + end + return default +end + +function NTConfig.Set(key, value) + if NTConfig.Entries[key] then + NTConfig.Entries[key].value = value + end +end + +function NTConfig.SendConfig(reciverClient) + local tableToSend = {} + for key, entry in pairs(NTConfig.Entries) do + tableToSend[key] = entry.value + end + + local msg = Networking.Start("NT.ConfigUpdate") + msg.WriteString(json.serialize(tableToSend)) + if SERVER then + Networking.Send(msg, reciverClient and reciverClient.Connection or nil) + else + Networking.Send(msg) + end +end + +function NTConfig.ReceiveConfig(msg) + local RecivedTable = {} + RecivedTable = json.parse(msg.ReadString()) + for key, value in pairs(RecivedTable) do + NTConfig.Set(key, value) + end +end + +NT.ConfigData = { + NT_header1 = { name = "Neurotrauma", type = "category" }, + + NT_dislocationChance = { + name = "Dislocation chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { max = 5 }, + }, + NT_fractureChance = { + name = "Fracture chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 2, max = 5 }, + }, + NT_pneumothoraxChance = { + name = "Pneumothorax chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { max = 5 }, + }, + NT_tamponadeChance = { + name = "Tamponade chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { max = 3 }, + }, + NT_heartattackChance = { + name = "Heart attack chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 1 }, + }, + NT_strokeChance = { + name = "Stroke chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 1 }, + }, + NT_infectionRate = { + name = "Infection rate", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 1.5, max = 5 }, + }, + NT_CPRFractureChance = { + name = "CPR fracture chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 1 }, + }, + NT_traumaticAmputationChance = { + name = "Traumatic amputation chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { max = 3 }, + }, + NT_neurotraumaGain = { + name = "Neurotrauma gain", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 3, max = 10 }, + }, + NT_organDamageGain = { + name = "Organ damage gain", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 2, max = 8 }, + }, + NT_fibrillationSpeed = { + name = "Fibrillation rate", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 1.5, max = 8 }, + }, + NT_gangrenespeed = { + name = "Gangrene rate", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 5 }, + }, + NT_falldamage = { + name = "Falldamage", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 5 }, + }, + NT_falldamageSeriousInjuryChance = { + name = "Falldamage serious injury chance", + default = 1, + range = { 0, 100 }, + type = "float", + difficultyCharacteristics = { multiplier = 0.5, max = 5 }, + }, + NT_vanillaSkillCheck = { + name = "Vanilla skill check formula", + default = false, + type = "bool", + description = "Changes the chance to succeed a lua skillcheck from skill/requiredskill to 100-(requiredskill-skill))/100", + }, + NT_disableBotAlgorithms = { + name = "Disable bot treatment algorithms", + default = true, + type = "bool", + description = "Prevents bots from attempting to treat afflictions.\nThis is desireable, because bots suck at treating things, and their bad attempts lag out the game immensely.", + }, + NT_screams = { name = "Screams", default = true, type = "bool", description = "Characters scream when in pain." }, + NT_ignoreModConflicts = { + name = "Ignore mod conflicts", + default = false, + type = "bool", + description = "Prevent the mod conflict affliction from showing up.", + }, + NT_organRejection = { + name = "Organ rejection", + default = false, + type = "bool", + difficultyCharacteristics = { multiplier = 0.5 }, + description = "When transplanting an organ, there is a chance that the organ gets rejected.\nThe higher the patients immunity at the time of the transplant, the higher the chance.", + }, + NT_fracturesRemoveCasts = { + name = "Fractures remove casts", + default = true, + type = "bool", + difficultyCharacteristics = { multiplier = 0.5 }, + description = "When receiving damage that would cause a fracture, remove plaster casts on the limb", + }, + + NTCRE_header1 = { name = "Consent Required", type = "category" }, + NTCRE_ConsentRequired = { + name = "Enable Consent Required", + default = true, + type = "bool", + description = "Integrated consent required mod.\nIf disabled, none of NPCs will get aggravated by medical interactions.", + }, + + NTSCAN_header1 = { name = "Scanner Settings", type = "category" }, + + NTSCAN_enablecoloredscanner = { + name = "Enable Colored Scanner", + default = true, + type = "bool", + description = "Enable colored health scanner text messages.", + }, + + NTSCAN_lowmedThreshold = { + name = "Low-Medium Text Threshold", + default = 25, + range = { 0, 100 }, + type = "float", + description = "Where the Low progress color ends and Medium progress color begins.", + }, + + NT_medhighThreshold = { + name = "Medium-High Text Threshold", + default = 65, + range = { 0, 100 }, + type = "float", + description = "Where the Medium progress color ends and High progress color begins.", + }, + + NTSCAN_basecolor = { + name = "Base Text Color", + default = { "100,100,200" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color.", + }, + + NTSCAN_namecolor = { + name = "Name Text Color", + default = { "125,125,225" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for player names.", + }, + + NTSCAN_lowcolor = { + name = "Low Priority Color", + default = { "100,200,100" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for afflictions that have low progress.", + }, + + NTSCAN_medcolor = { + name = "Medium Priority Color", + default = { "200,200,100" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for afflictions that have medium progress.", + }, + + NTSCAN_highcolor = { + name = "High Priority Color", + default = { "250,100,100" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for afflictions that have high progress.", + }, + NTSCAN_vitalcolor = { + name = "Vital Priority Color", + default = { "255,0,0" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for vital afflictions (Arterial bleed, Traumatic amputation).", + }, + NTSCAN_removalcolor = { + name = "Removed Organ Color", + default = { "0,255,255" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for removed organs (Heart removed, leg amputation).", + }, + NTSCAN_customcolor = { + name = "Custom Category Color", + default = { "180,50,200" }, + style = "R,G,B", + type = "string", + boxsize = 0.05, + description = "Scanner text color for the custom category.", + }, + + NTSCAN_VitalCategory = { + name = "Included Vital Afflictions", + default = { + "cardiacarrest", + "ll_arterialcut", + "rl_arterialcut", + "la_arterialcut", + "ra_arterialcut", + "t_arterialcut", + "h_arterialcut", + "tra_amputation", + "tla_amputation", + "trl_amputation", + "tll_amputation", + "th_amputation", + }, + style = "identifier,identifier", + type = "string", + boxsize = 0.1, + description = "You can add or remove afflictions to customize this list to your liking.", + }, + + NTSCAN_RemovalCategory = { + name = "Included Removal Affictions", + default = { + "heartremoved", + "brainremoved", + "lungremoved", + "kidneyremoved", + "liverremoved", + "sra_amputation", + "sla_amputation", + "srl_amputation", + "sll_amputation", + "sh_amputation", + }, + style = "identifier, identifier", + type = "string", + boxsize = 0.1, + description = "You can add or remove afflictions to customize this list to your liking.", + }, + + NTSCAN_CustomCategory = { + name = "Custom Affliction Category", + default = {""}, + style = "identifier,identifier", + type = "string", + boxsize = 0.1, + description = "You can add or remove afflictions to customize this list to your liking.", + }, + + NTSCAN_IgnoredCategory = { + name = "Ignored Afflictions", + default = { "" }, + style = "identifier,identifier", + type = "string", + boxsize = 0.1, + description = "Afflictions added to this category will be ignored by the health scanner.", + }, +} +NTConfig.AddConfigOptions(NT) + +-- wait a bit before loading the config so all options have had time to be added +-- do note that this unintentionally causes a couple ticks time on load during which the config is always the default +-- remember to put default values in your NTConfig.Get calls! +Timer.Wait(function() + NTConfig.LoadConfig() + + Timer.Wait(function() + NTConfig.SaveConfig() + end, 1000) +end, 50) diff --git a/Neurotrauma/Lua/Scripts/helperfunctions.lua b/Neurotrauma/Lua/Scripts/helperfunctions.lua new file mode 100644 index 0000000..e58827a --- /dev/null +++ b/Neurotrauma/Lua/Scripts/helperfunctions.lua @@ -0,0 +1,1252 @@ +-- This file contains a bunch of useful functions that see heavy use in the other scripts. + +-- Neurotrauma functions + +function NT.DislocateLimb(character, limbtype, strength) + strength = strength or 1 + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "dislocation1" + limbtoaffliction[LimbType.LeftLeg] = "dislocation2" + limbtoaffliction[LimbType.RightArm] = "dislocation3" + limbtoaffliction[LimbType.LeftArm] = "dislocation4" + if limbtoaffliction[limbtype] == nil then + return + end + HF.AddAffliction(character, limbtoaffliction[limbtype], strength) +end +function NT.BreakLimb(character, limbtype, strength) + strength = strength or 5 + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "rl_fracture" + limbtoaffliction[LimbType.LeftLeg] = "ll_fracture" + limbtoaffliction[LimbType.RightArm] = "ra_fracture" + limbtoaffliction[LimbType.LeftArm] = "la_fracture" + limbtoaffliction[LimbType.Head] = "h_fracture" + limbtoaffliction[LimbType.Torso] = "t_fracture" + if limbtoaffliction[limbtype] == nil then + return + end + HF.AddAffliction(character, limbtoaffliction[limbtype], strength) + + if strength > 0 and NTConfig.Get("NT_fracturesRemoveCasts", true) then + HF.SetAfflictionLimb(character, "gypsumcast", limbtype, 0) + end +end +function NT.SurgicallyAmputateLimb(character, limbtype, strength, traumampstrength) + strength = strength or 100 + traumampstrength = traumampstrength or 0 + + limbtype = HF.NormalizeLimbType(limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "srl_amputation" + limbtoaffliction[LimbType.LeftLeg] = "sll_amputation" + limbtoaffliction[LimbType.RightArm] = "sra_amputation" + limbtoaffliction[LimbType.LeftArm] = "sla_amputation" + limbtoaffliction[LimbType.Head] = "sh_amputation" + if limbtoaffliction[limbtype] == nil then + return + end + HF.SetAffliction(character, limbtoaffliction[limbtype], strength) + + limbtoaffliction[LimbType.RightLeg] = "trl_amputation" + limbtoaffliction[LimbType.LeftLeg] = "tll_amputation" + limbtoaffliction[LimbType.RightArm] = "tra_amputation" + limbtoaffliction[LimbType.LeftArm] = "tla_amputation" + limbtoaffliction[LimbType.Head] = "th_amputation" + HF.SetAffliction(character, limbtoaffliction[limbtype], traumampstrength) +end +function NT.TraumamputateLimb(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "gate_ta_rl" + limbtoaffliction[LimbType.LeftLeg] = "gate_ta_ll" + limbtoaffliction[LimbType.RightArm] = "gate_ta_ra" + limbtoaffliction[LimbType.LeftArm] = "gate_ta_la" + limbtoaffliction[LimbType.Head] = "gate_ta_h" + if limbtoaffliction[limbtype] == nil then + return + end + HF.AddAfflictionLimb(character, limbtoaffliction[limbtype], limbtype, 10) +end +function NT.TraumamputateLimbMinusItem(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "gate_ta_rl_2" + limbtoaffliction[LimbType.LeftLeg] = "gate_ta_ll_2" + limbtoaffliction[LimbType.RightArm] = "gate_ta_ra_2" + limbtoaffliction[LimbType.LeftArm] = "gate_ta_la_2" + limbtoaffliction[LimbType.Head] = "gate_ta_h" + if limbtoaffliction[limbtype] == nil then + return + end + HF.AddAfflictionLimb(character, limbtoaffliction[limbtype], limbtype, 10) +end +function NT.ArteryCutLimb(character, limbtype, strength) + strength = strength or 5 + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "rl_arterialcut" + limbtoaffliction[LimbType.LeftLeg] = "ll_arterialcut" + limbtoaffliction[LimbType.RightArm] = "ra_arterialcut" + limbtoaffliction[LimbType.LeftArm] = "la_arterialcut" + limbtoaffliction[LimbType.Head] = "h_arterialcut" + limbtoaffliction[LimbType.Torso] = "t_arterialcut" + if limbtoaffliction[limbtype] == nil then + return + end + HF.AddAffliction(character, limbtoaffliction[limbtype], strength) +end + +function NT.LimbIsDislocated(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "dislocation1" + limbtoaffliction[LimbType.LeftLeg] = "dislocation2" + limbtoaffliction[LimbType.RightArm] = "dislocation3" + limbtoaffliction[LimbType.LeftArm] = "dislocation4" + if limbtoaffliction[limbtype] == nil then + return false + end + return HF.HasAffliction(character, limbtoaffliction[limbtype], 1) +end +function NT.LimbIsBroken(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "rl_fracture" + limbtoaffliction[LimbType.LeftLeg] = "ll_fracture" + limbtoaffliction[LimbType.RightArm] = "ra_fracture" + limbtoaffliction[LimbType.LeftArm] = "la_fracture" + if limbtoaffliction[limbtype] == nil then + return false + end + return HF.HasAffliction(character, limbtoaffliction[limbtype], 1) +end +function NT.LimbIsArterialCut(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "rl_arterialcut" + limbtoaffliction[LimbType.LeftLeg] = "ll_arterialcut" + limbtoaffliction[LimbType.RightArm] = "ra_arterialcut" + limbtoaffliction[LimbType.LeftArm] = "la_arterialcut" + limbtoaffliction[LimbType.Head] = "h_arterialcut" + limbtoaffliction[LimbType.Torso] = "t_arterialcut" + if limbtoaffliction[limbtype] == nil then + return false + end + return HF.HasAffliction(character, limbtoaffliction[limbtype], 1) +end +function NT.LimbIsAmputated(character, limbtype) + return NT.LimbIsTraumaticallyAmputated(character, limbtype) or NT.LimbIsSurgicallyAmputated(character, limbtype) +end +function NT.LimbIsTraumaticallyAmputated(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "trl_amputation" + limbtoaffliction[LimbType.LeftLeg] = "tll_amputation" + limbtoaffliction[LimbType.RightArm] = "tra_amputation" + limbtoaffliction[LimbType.LeftArm] = "tla_amputation" + limbtoaffliction[LimbType.Head] = "th_amputation" + if limbtoaffliction[limbtype] == nil then + return false + end + return HF.HasAffliction(character, limbtoaffliction[limbtype], 0.1) +end +function NT.LimbIsSurgicallyAmputated(character, limbtype) + local limbtoaffliction = {} + limbtoaffliction[LimbType.RightLeg] = "srl_amputation" + limbtoaffliction[LimbType.LeftLeg] = "sll_amputation" + limbtoaffliction[LimbType.RightArm] = "sra_amputation" + limbtoaffliction[LimbType.LeftArm] = "sla_amputation" + limbtoaffliction[LimbType.Head] = "sh_amputation" + if limbtoaffliction[limbtype] == nil then + return false + end + return HF.HasAffliction(character, limbtoaffliction[limbtype], 0.1) +end + +function NT.Fibrillate(character, amount) + -- tachycardia (increased heartrate) -> + -- fibrillation (irregular heartbeat) -> + -- cardiacarrest + + -- fetch values + local tachycardia = HF.GetAfflictionStrength(character, "tachycardia", 0) + local fibrillation = HF.GetAfflictionStrength(character, "fibrillation", 0) + local cardiacarrest = HF.GetAfflictionStrength(character, "cardiacarrest", 0) + + -- already in cardiac arrest? don't do anything + if cardiacarrest > 0 then + return + end + + -- determine total amount of fibrillation, then determine afflictions from that + local previousAmount = tachycardia / 5 + if fibrillation > 0 then + previousAmount = 20 + fibrillation + end + local newAmount = previousAmount + amount + + -- 0-20: 0-100% tachycardia + -- 20-120: 0-100% fibrillation + -- >120: cardiac arrest + + if newAmount < 20 then + -- 0-20: 0-100% tachycardia + tachycardia = newAmount * 5 + fibrillation = 0 + elseif newAmount < 120 then + -- 20-120: 0-100% fibrillation + tachycardia = 0 + fibrillation = newAmount - 20 + else + -- >120: cardiac arrest + tachycardia = 0 + fibrillation = 0 + HF.SetAffliction(character, "cardiacarrest", 10) + end + + HF.SetAffliction(character, "tachycardia", tachycardia) + HF.SetAffliction(character, "fibrillation", fibrillation) +end + +HF = {} -- Helperfunctions + +function HF.Lerp(a, b, t) + return a + (b - a) * t +end + +function HF.Round(num, numDecimalPlaces) + local mult = 10 ^ (numDecimalPlaces or 0) + return math.floor(num * mult + 0.5) / mult +end + +function HF.Clamp(num, min, max) + if num < min then + num = min + elseif num > max then + num = max + end + return num +end + +-- returns num if num > min, else defaultvalue +function HF.Minimum(num, min, defaultvalue) + if num < min then + num = (defaultvalue or 0) + end + return num +end + +function HF.DistanceBetween(point1, point2) + local xd = point1.X - point2.X + local yd = point1.Y - point2.Y + return math.sqrt(xd * xd + yd * yd) +end + +function HF.FindDepth(item) + if SERVER then + return Level.Loaded.GetRealWorldDepth(item.WorldPosition.Y) + else + return item.WorldPosition.Y * Physics.DisplayToRealWorldRatio + end +end + +-- /// affliction magic /// +------------------------------ +function HF.GetAfflictionStrength(character, identifier, defaultvalue) + if character == nil or character.CharacterHealth == nil then + return defaultvalue + end + + local aff = character.CharacterHealth.GetAffliction(identifier) + local res = defaultvalue or 0 + if aff ~= nil then + res = aff.Strength + end + return res +end + +function HF.GetAfflictionStrengthLimb(character, limbtype, identifier, defaultvalue) + if character == nil or character.CharacterHealth == nil or character.AnimController == nil then + return defaultvalue + end + local limb = character.AnimController.GetLimb(limbtype) + if limb == nil then + return defaultvalue + end + + local aff = character.CharacterHealth.GetAffliction(identifier, limb) + local res = defaultvalue or 0 + if aff ~= nil then + res = aff.Strength + end + return res +end + +function HF.HasAffliction(character, identifier, minamount) + if character == nil or character.CharacterHealth == nil then + return false + end + + local aff = character.CharacterHealth.GetAffliction(identifier) + local res = false + if aff ~= nil then + res = aff.Strength >= (minamount or 0.5) + end + return res +end + +function HF.HasAfflictionLimb(character, identifier, limbtype, minamount) + local limb = character.AnimController.GetLimb(limbtype) + if limb == nil then + return false + end + local aff = character.CharacterHealth.GetAffliction(identifier, limb) + local res = false + if aff ~= nil then + res = aff.Strength >= (minamount or 0.5) + end + return res +end + +-- this might be overkill, but a lot of people have reported dislocation fixing issues +function HF.HasAfflictionExtremity(character, identifier, limbtype, minamount) + local aff = nil + + if limbtype == LimbType.LeftArm or limbtype == LimbType.LeftForearm or limbtype == LimbType.LeftHand then + aff = character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.LeftArm)) + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.LeftForearm) + ) + end + if aff == nil then + aff = + character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.LeftHand)) + end + elseif limbtype == LimbType.RightArm or limbtype == LimbType.RightForearm or limbtype == LimbType.RightHand then + aff = character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.RightArm)) + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.RightForearm) + ) + end + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.RightHand) + ) + end + elseif limbtype == LimbType.LeftLeg or limbtype == LimbType.LeftThigh or limbtype == LimbType.LeftFoot then + aff = character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.LeftLeg)) + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.LeftThigh) + ) + end + if aff == nil then + aff = + character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.LeftFoot)) + end + elseif limbtype == LimbType.RightLeg or limbtype == LimbType.RightThigh or limbtype == LimbType.RightFoot then + aff = character.CharacterHealth.GetAffliction(identifier, character.AnimController.GetLimb(LimbType.RightLeg)) + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.RightThigh) + ) + end + if aff == nil then + aff = character.CharacterHealth.GetAffliction( + identifier, + character.AnimController.GetLimb(LimbType.RightFoot) + ) + end + end + + local res = false + if aff ~= nil then + res = aff.Strength >= (minamount or 0.5) + end + return res +end + +function HF.SetAffliction(character, identifier, strength, aggressor, prevstrength) + HF.SetAfflictionLimb(character, identifier, LimbType.Torso, strength, aggressor, prevstrength) +end + +-- the main "mess with afflictions" function +function HF.SetAfflictionLimb(character, identifier, limbtype, strength, aggressor, prevstrength) + local prefab = AfflictionPrefab.Prefabs[identifier] + local resistance = character.CharacterHealth.GetResistance(prefab, limbtype) + if resistance >= 1 then + return + end + -- We need to reverse the resistance effect so that proper values are given in our CharacterHealth.ApplyAffliction, as we are using this command for our internal affliction updates and functions, that do not account for resistance in the first place. + local strength = strength * character.CharacterHealth.MaxVitality / 100 / (1 - resistance) + local affliction = prefab.Instantiate(strength, aggressor) + local recalculateVitality = NTC.AfflictionsAffectingVitality[identifier] ~= nil + + character.CharacterHealth.ApplyAffliction( + character.AnimController.GetLimb(limbtype), + affliction, + false, + recalculateVitality + ) + + -- turn target aggressive if damaging + -- if(aggressor ~= nil and character~=aggressor) then + -- if prevstrength == nil then prevstrength = 0 end + -- + -- local dmg = affliction.GetVitalityDecrease(character.CharacterHealth,strength-prevstrength) + -- + -- if (dmg ~= nil and dmg > 0) then + -- MakeAggressive(aggressor,character,dmg) + -- end + -- end +end + +function HF.ApplyAfflictionChange(character, identifier, strength, prevstrength, minstrength, maxstrength) + strength = HF.Clamp(strength, minstrength, maxstrength) + prevstrength = HF.Clamp(prevstrength, minstrength, maxstrength) + if prevstrength ~= strength then + HF.SetAffliction(character, identifier, strength) + end +end + +function HF.ApplyAfflictionChangeLimb(character, limbtype, identifier, strength, prevstrength, minstrength, maxstrength) + strength = HF.Clamp(strength, minstrength, maxstrength) + prevstrength = HF.Clamp(prevstrength, minstrength, maxstrength) + if prevstrength ~= strength then + HF.SetAfflictionLimb(character, identifier, limbtype, strength) + end +end + +function HF.ApplySymptom(character, identifier, hassymptom, removeifnot) + if not hassymptom and not removeifnot then + return + end + + local strength = 0 + if hassymptom then + strength = 100 + end + + if removeifnot or hassymptom then + HF.SetAffliction(character, identifier, strength) + end +end + +function HF.ApplySymptomLimb(character, limbtype, identifier, hassymptom, removeifnot) + if not hassymptom and not removeifnot then + return + end + + local strength = 0 + if hassymptom then + strength = 100 + end + + if removeifnot or hassymptom then + HF.SetAfflictionLimb(character, identifier, limbtype, strength) + end +end + +function HF.AddAfflictionLimb(character, identifier, limbtype, strength, aggressor) + if strength < 0 then + character.CharacterHealth.ReduceAfflictionOnLimb( + character.AnimController.GetLimb(limbtype), + identifier, + -strength, + nil, + aggressor + ) + return + end + local prevstrength = HF.GetAfflictionStrengthLimb(character, limbtype, identifier, 0) + HF.SetAfflictionLimb(character, identifier, limbtype, strength + prevstrength, aggressor, prevstrength) +end + +function HF.AddAffliction(character, identifier, strength, aggressor) + local prevstrength = HF.GetAfflictionStrength(character, identifier, 0) + HF.SetAffliction(character, identifier, strength + prevstrength, aggressor, prevstrength) +end + +function HF.AddAfflictionResisted(character, identifier, strength, aggressor) + local prevstrength = HF.GetAfflictionStrength(character, identifier, 0) + strength = strength * (1 - HF.GetResistance(character, identifier)) + HF.SetAffliction(character, identifier, strength + prevstrength, aggressor, prevstrength) +end + +function HF.GetResistance(character, identifier, limbtype) + local limbtype = limbtype or LimbType.None + local prefab = AfflictionPrefab.Prefabs[identifier] + if character == nil or character.CharacterHealth == nil or prefab == nil then + return 0 + end + return character.CharacterHealth.GetResistance(prefab, limbtype) +end + +-- /// misc /// + +function PrintChat(msg) + if SERVER then + -- use server method + Game.SendMessage(msg, ChatMessageType.Server) + else + -- use client method + Game.ChatBox.AddMessage(ChatMessage.Create("", msg, ChatMessageType.Server, nil)) + end +end + +function HF.DMClient(client, msg, color) + if SERVER then + if client == nil then + return + end + + local chatMessage = ChatMessage.Create("", msg, ChatMessageType.Server, nil) + if color ~= nil then + chatMessage.Color = color + end + Game.SendDirectChatMessage(chatMessage, client) + else + PrintChat(msg) + end +end + +function HF.Chance(chance) + return math.random() < chance +end + +function HF.BoolToNum(val, trueoutput) + if val then + return trueoutput or 1 + end + return 0 +end + +function HF.GetSkillLevel(character, skilltype) + return character.GetSkillLevel(Identifier(skilltype)) +end + +function HF.GetBaseSkillLevel(character, skilltype) + if character == nil or character.Info == nil or character.Info.Job == nil then + return 0 + end + return character.Info.Job.GetSkillLevel(Identifier(skilltype)) +end + +function HF.GetSkillRequirementMet(character, skilltype, requiredamount) + local skilllevel = HF.GetSkillLevel(character, skilltype) + if NTConfig.Get("NT_vanillaSkillCheck", false) then + return HF.Chance(HF.Clamp((100 - (requiredamount - skilllevel)) / 100, 0, 1)) + end + return HF.Chance(HF.Clamp(skilllevel / requiredamount, 0, 1)) +end + +function HF.GetSurgerySkillRequirementMet(character, requiredamount) + local skilllevel = HF.GetSurgerySkill(character) + if NTConfig.Get("NT_vanillaSkillCheck", false) then + return HF.Chance(HF.Clamp((100 - (requiredamount - skilllevel)) / 100, 0, 1)) + end + return HF.Chance(HF.Clamp(skilllevel / requiredamount, 0, 1)) +end + +function HF.GetSurgerySkill(character) + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", false) then + return math.max(5, HF.GetSkillLevel(character, "surgery"), HF.GetSkillLevel(character, "medical") / 4) + end + + return HF.GetSkillLevel(character, "medical") +end + +function HF.GiveSkill(character, skilltype, amount) + if character ~= nil and character.Info ~= nil then + character.Info.IncreaseSkillLevel(Identifier(skilltype), amount) + end +end + +function HF.GiveSurgerySkill(character, amount) + if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then + HF.GiveSkill(character, "surgery", amount) + else + HF.GiveSkill(character, "medical", amount / 4) + end +end + +-- amount = vitality healed +function HF.GiveSkillScaled(character, skilltype, amount) + if character ~= nil and character.Info ~= nil then + HF.GiveSkill(character, skilltype, amount * 0.001 / math.max(HF.GetSkillLevel(character, skilltype), 1)) + end +end + +function HF.GiveItem(character, identifier) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + -- XXX: this is a workaround for a race condition where `Entity.Spawner` is + -- initialized after Luatrauma invokes our ``s. + if not Entity.Spawner then + -- Reschedule it to run on the next frame... hopefully it will be initialized then + Timer.Wait(function() + HF.GiveItem(character, identifier) + end, 35) + return + end + -- This needs to be done on the next tick because Barotrauma processes + -- the spawn queue before the remove queue, which could result in the + -- item container overflowing. + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, character.WorldPosition, nil, nil, function(item) + character.Inventory.TryPutItem(item, nil, { InvSlotType.Any }) + end) + end, 35) +end + +function HF.GiveItemAtCondition(character, identifier, condition) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + if not Entity.Spawner then + Timer.Wait(function() + HF.GiveItemAtCondition(character, identifier, condition) + end, 35) + return + end + + -- use server spawn method + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, character.WorldPosition, nil, nil, function(item) + item.Condition = condition + character.Inventory.TryPutItem(item, nil, { InvSlotType.Any }) + end) + end, 35) +end + +-- for use with items +function HF.SpawnItemPlusFunction(identifier, func, params, inventory, targetslot, position) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + HF.SpawnItemPlusFunction(identifier, func, params, inventory, targetslot, position) + end, 35) + return + end + if params == nil then + params = {} + end + + -- use server spawn method + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue( + prefab, + position or inventory.Container.Item.WorldPosition, + nil, + nil, + function(newitem) + if inventory ~= nil then + inventory.TryPutItem(newitem, targetslot, true, true, nil) + end + params["item"] = newitem + if func ~= nil then + func(params) + end + end + ) + end, 35) +end + +-- for use with characters +function HF.GiveItemPlusFunction(identifier, func, params, character) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + HF.GiveItemPlusFunction(identifier, func, params, character) + end, 35) + return + end + + if params == nil then + params = {} + end + + -- use server spawn method + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, character.WorldPosition, nil, nil, function(newitem) + if character.Inventory ~= nil then + character.Inventory.TryPutItem(newitem, nil, { InvSlotType.Any }) + end + params["item"] = newitem + func(params) + end) + end, 35) +end + +function HF.SpawnItemAt(identifier, position) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + HF.SpawnItemAt(identifier, position) + end, 35) + return + end + + local prefab = ItemPrefab.GetItemPrefab(identifier) + + -- use server spawn method + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, position, nil, nil, nil) + end, 35) +end + +function HF.ForceArmLock(character, identifier) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + HF.ForceArmLock(character, identifier) + end, 35) + return + end + + local handindex = 6 + if identifier == "armlock2" then + handindex = 5 + end + + -- drop previously held item + local previtem = character.Inventory.GetItemAt(handindex) + if previtem ~= nil then + previtem.Drop(character, true) + end + + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, character.WorldPosition, nil, nil, function(newitem) + if character.Inventory ~= nil and identifier == "armlock1" then + character.Inventory.TryPutItem(newitem, nil, { InvSlotType.RightHand }) + elseif character.Inventory ~= nil and identifier == "armlock2" then + character.Inventory.TryPutItem(newitem, nil, { InvSlotType.LeftHand }) + end + end) + end, 35) +end + +function HF.RemoveItem(item) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if item == nil or item.Removed then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + HF.RemoveItem(item) + end, 35) + return + end + + -- use server remove method + Entity.Spawner.AddEntityToRemoveQueue(item) +end + +function HF.RemoveCharacter(character) + -- this is the entirely same function as RemoveItem right now + HF.RemoveItem(character) + + --[[ + if character == nil or character.Removed then return end + + if SERVER then + -- use server remove method + Entity.Spawner.AddEntityToRemoveQueue(character) + else + -- use client remove method + character.Remove() + end +]] +end + +function HF.StartsWith(String, Start) + return string.sub(String, 1, string.len(Start)) == Start +end + +function HF.SplitString(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t = {} + for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do + table.insert(t, str) + end + return t +end + +-- this function is dumb and you shouldn't use it +function HF.TableSize(table) + return #table +end + +function HF.HasAbilityFlag(character, flagtype) + return character.HasAbilityFlag(flagtype) +end + +function HF.MakeAggressive(aggressor, target, damage) + + -- this shit isnt working!!!! + -- why is this shit not working!?!?!?! + + -- if(aggressor==nil) then print("no aggressor") else print("aggressor: "..aggressor.Name) end + -- if(target==nil) then print("no target") else print("target: "..target.Name) end + -- if(damage==nil) then print("no damage") else print("damage: "..damage) end + -- + -- if ((damage ~= nil and damage <= 0.5) or target==nil or aggressor==nil or target.AIController==nil or aggressor==target) then return end + -- + -- if damage == nil then damage = 5 end + -- + -- local AttackResult = LuaUserData.CreateStatic("Barotrauma.AttackResult") + -- local res = AttackResult.__new(Round(damage),nil) + -- target.AIController.OnAttacked(aggressor,res) +end + +function HF.CharacterToClient(character) + if not SERVER then + return nil + end + + for key, client in pairs(Client.ClientList) do + if client.Character == character then + return client + end + end + + return nil +end + +function HF.ClientFromName(name) + if not SERVER then + return nil + end + + for key, client in pairs(Client.ClientList) do + if client.Name == name then + return client + end + end + + return nil +end + +function HF.LimbTypeToString(type) + if type == LimbType.Torso then + return "Torso" + end + if type == LimbType.Head then + return "Head" + end + if type == LimbType.LeftArm or type == LimbType.LeftForearm or type == LimbType.LeftHand then + return "Left Arm" + end + if type == LimbType.RightArm or type == LimbType.RightForearm or type == LimbType.RightHand then + return "Right Arm" + end + if type == LimbType.LeftLeg or type == LimbType.LeftThigh or type == LimbType.LeftFoot then + return "Left Leg" + end + if type == LimbType.RightLeg or type == LimbType.RightThigh or type == LimbType.RightFoot then + return "Right Leg" + end + return "???" +end + +function HF.GameIsPaused() + if SERVER then + return false + end + + return Game.Paused +end + +function HF.TableContains(table, value) + if not table then + return + end + for i, v in ipairs(table) do + if v == value then + return true + end + end + + return false +end + +function HF.PutItemInsideItem(container, identifier, index) + -- hostside only + if Game.IsMultiplayer and CLIENT then + return + end + + if not Entity.Spawner then + Timer.Wait(function() + HF.PutItemInsideItem(container, identifier, index) + end, 35) + return + end + + if index == nil then + index = 0 + end + + local inv = container.OwnInventory + if inv == nil then + return + end + + local previtem = inv.GetItemAt(index) + if previtem ~= nil then + inv.ForceRemoveFromSlot(previtem, index) + previtem.Drop() + end + -- use server spawn method + Timer.Wait(function() + local prefab = ItemPrefab.GetItemPrefab(identifier) + Entity.Spawner.AddItemToSpawnQueue(prefab, container.WorldPosition, nil, nil, function(item) + inv.TryPutItem(item, nil, { index }, true, true) + end) + end, 35) +end + +function HF.CanPerformSurgeryOn(character) + return HF.HasAffliction(character, "analgesia", 1) or HF.HasAffliction(character, "sym_unconsciousness", 0.1) +end + +-- converts thighs, feet, forearms and hands into legs and arms +function HF.NormalizeLimbType(limbtype) + if + limbtype == LimbType.Head + or limbtype == LimbType.Torso + or limbtype == LimbType.RightArm + or limbtype == LimbType.LeftArm + or limbtype == LimbType.RightLeg + or limbtype == LimbType.LeftLeg + then + return limbtype + end + + if limbtype == LimbType.LeftForearm or limbtype == LimbType.LeftHand then + return LimbType.LeftArm + end + if limbtype == LimbType.RightForearm or limbtype == LimbType.RightHand then + return LimbType.RightArm + end + + if limbtype == LimbType.LeftThigh or limbtype == LimbType.LeftFoot then + return LimbType.LeftLeg + end + if limbtype == LimbType.RightThigh or limbtype == LimbType.RightFoot then + return LimbType.RightLeg + end + + if limbtype == LimbType.Waist then + return LimbType.Torso + end + + return limbtype +end + +-- returns an unrounded random number +function HF.RandomRange(min, max) + return min + math.random() * (max - min) +end + +function HF.LimbIsExtremity(limbtype) + return limbtype ~= LimbType.Torso and limbtype ~= LimbType.Head +end + +function HF.HasTalent(character, talentidentifier) + local talents = character.Info.UnlockedTalents + + for value in talents do + if value.Value == talentidentifier then + return true + end + end + + return false +end + +function HF.CharacterDistance(char1, char2) + return HF.Distance(char1.WorldPosition, char2.WorldPosition) +end + +function HF.Distance(v1, v2) + return Vector2.Distance(v1, v2) +end + +function HF.GetOuterWearIdentifier(character) + return HF.GetCharacterInventorySlotIdentifer(character, 4) +end +function HF.GetInnerWearIdentifier(character) + return HF.GetCharacterInventorySlotIdentifer(character, 3) +end +function HF.GetHeadWearIdentifier(character) + return HF.GetCharacterInventorySlotIdentifer(character, 2) +end + +function HF.GetCharacterInventorySlotIdentifer(character, slot) + local item = character.Inventory.GetItemAt(slot) + if item == nil then + return nil + end + return item.Prefab.Identifier.Value +end + +function HF.GetItemInRightHand(character) + return HF.GetCharacterInventorySlot(character, 6) +end +function HF.GetItemInLeftHand(character) + return HF.GetCharacterInventorySlot(character, 5) +end +function HF.GetOuterWear(character) + return HF.GetCharacterInventorySlot(character, 4) +end +function HF.GetInnerWear(character) + return HF.GetCharacterInventorySlot(character, 3) +end +function HF.GetHeadWear(character) + return HF.GetCharacterInventorySlot(character, 2) +end + +function HF.GetCharacterInventorySlot(character, slot) + return character.Inventory.GetItemAt(slot) +end + +function HF.ItemHasTag(item, tag) + if item == nil then + return false + end + return item.HasTag(tag) +end + +function HF.CauseOfDeathToString(cod) + local res = nil + + if + cod.Affliction ~= nil -- from affliction + and cod.Affliction.CauseOfDeathDescription ~= nil + then + res = cod.Affliction.CauseOfDeathDescription + else -- from type + res = tostring(cod.Type) + end + + return res or "" +end + +function HF.CombineArrays(arr1, arr2) + local res = {} + for _, v in ipairs(arr1) do + table.insert(res, v) + end + for _, v in ipairs(arr2) do + table.insert(res, v) + end + return res +end + +HF.EndocrineTalents = { + "aggressiveengineering", + "crisismanagement", + "cannedheat", + "doubleduty", + "firemanscarry", + "fieldmedic", + "multitasker", + "aceofalltrades", + "stillkicking", + "drunkensailor", + "trustedcaptain", + "downwiththeship", + "physicalconditioning", + "beatcop", + "commando", + "justascratch", + "intheflow", + "collegeathletics", +} +function HF.ApplyEndocrineBoost(character, talentlist) + talentlist = talentlist or HF.EndocrineTalents + + -- gee i sure do love translating c# into lua + local targetCharacter = character + if targetCharacter.Info == nil then + return + end + local talentTree = TalentTree.JobTalentTrees[character.Info.Job.Prefab.Identifier.Value] + if talentTree == nil then + return + end + -- for the sake of technical simplicity, for now do not allow talents to be given if the character could unlock them in their talent tree as well + local disallowedTalents = {} + for subtree in talentTree.TalentSubTrees do + for stage in subtree.TalentOptionStages do + for talent in stage.Talents do + table.insert(disallowedTalents, talent.Identifier.Value) + end + end + end + + local characterTalents = {} + for talent in targetCharacter.Info.UnlockedTalents do + table.insert(characterTalents, talent.Value) + end + + local viableTalents = {} + for talent in talentlist do + if not HF.TableContains(disallowedTalents, talent) and not HF.TableContains(characterTalents, talent) then + table.insert(viableTalents, talent) + end + end + + if #viableTalents <= 0 then + return + end + + local talent = viableTalents[math.random(#viableTalents)] + + targetCharacter.GiveTalent(Identifier(talent), true) +end + +function HF.JobMemberCount(jobidentifier) + local res = 0 + for _, character in pairs(Character.CharacterList) do + if character.IsHuman and not character.IsDead and character.Info.Job ~= nil then + if character.Info.Job.Prefab.Identifier.Value == jobidentifier then + res = res + 1 + end + end + end + return res +end + +function HF.SendTextBox(header, msg, client) + if SERVER then + Game.SendDirectChatMessage(header, msg, nil, 7, client) + else + GUI.MessageBox(header, msg) + end +end + +function HF.ReplaceString(original, find, replace) + return string.gsub(original, find, replace) +end + +function HF.Explode(entity, range, force, damage, structureDamage, itemDamage, empStrength, ballastFloraStrength) + range = range or 0 + force = force or 0 + damage = damage or 0 + structureDamage = structureDamage or 0 + itemDamage = itemDamage or 0 + empStrength = empStrength or 0 + ballastFloraStrength = ballastFloraStrength or 0 + + Game.Explode( + entity.WorldPosition, + range, + force, + damage, + structureDamage, + itemDamage, + empStrength, + ballastFloraStrength + ) + + HF.SpawnItemAt("ntvfx_explosion", entity.WorldPosition) +end + +function HF.GetText(identifier) + local text = TextManager.Get(identifier) + if text ~= nil then + return text.Value + end + return identifier +end + +function HF.Magnitude(vector) + return ((vector.X ^ 2) + (vector.Y ^ 2)) ^ 0.5 +end + +function HF.Clone(object) + return json.parse(json.serialize(object)) +end + +function HF.ReplaceItemIdentifier(item, newIdentifier, keepCondition) + -- keep track of where to put the new item + local previousSpot = nil + local previousInventory = item.ParentInventory + if previousInventory then + previousSpot = previousInventory.FindIndex(item) + end + + -- make sure to transfer over contained items into the new item + local containedItems = {} + if item.OwnInventory ~= nil then + for containedItem in item.OwnInventory.AllItems do + table.insert(containedItems, { item = containedItem, slot = item.OwnInventory.FindIndex(containedItem) }) + end + end + + local funcParams = { containedItems = containedItems } + if keepCondition then + funcParams.condition = item.Condition + end + + Timer.Wait(function() + HF.SpawnItemPlusFunction(newIdentifier, function(params) + for containedItem in params.containedItems do + params.item.OwnInventory.TryPutItem(containedItem.item, containedItem.slot, true, false, nil) + end + if params.condition ~= nil then + params.item.Condition = params.condition + end + end, funcParams, previousInventory, previousSpot, item.WorldPosition) + HF.RemoveItem(item) + end, 1) +end + +function HF.GetVelocity(character) + if + not character + or not character.AnimController + or not character.AnimController.MainLimb + or not character.AnimController.MainLimb.body + then + return Vector2(0, 0) + end + + return character.AnimController.MainLimb.body.LinearVelocity +end diff --git a/Neurotrauma/Lua/Scripts/testing.lua b/Neurotrauma/Lua/Scripts/testing.lua new file mode 100644 index 0000000..87f1515 --- /dev/null +++ b/Neurotrauma/Lua/Scripts/testing.lua @@ -0,0 +1,76 @@ +-- set the below variable to true to enable debug and testing features +NT.TestingEnabled = false + +Hook.Add("chatMessage", "NT.testing", function(msg, client) + if msg == "nt test" then -- a glorified suicide button + if client.Character == nil then + return true + end + + HF.SetAfflictionLimb(client.Character, "gate_ta_ra", LimbType.RightArm, 100) + HF.SetAfflictionLimb(client.Character, "gate_ta_la", LimbType.LeftArm, 100) + HF.SetAfflictionLimb(client.Character, "gate_ta_rl", LimbType.RightLeg, 100) + HF.SetAfflictionLimb(client.Character, "gate_ta_ll", LimbType.LeftLeg, 100) + + return true -- hide message + elseif msg == "nt unfuck" then -- a command to remove non-sensical extremity amputations on the head and torso + if client.Character == nil then + return true + end + + HF.SetAfflictionLimb(client.Character, "tll_amputation", LimbType.Head, 0) + HF.SetAfflictionLimb(client.Character, "trl_amputation", LimbType.Head, 0) + HF.SetAfflictionLimb(client.Character, "tla_amputation", LimbType.Head, 0) + HF.SetAfflictionLimb(client.Character, "tra_amputation", LimbType.Head, 0) + + HF.SetAfflictionLimb(client.Character, "tll_amputation", LimbType.Torso, 0) + HF.SetAfflictionLimb(client.Character, "trl_amputation", LimbType.Torso, 0) + HF.SetAfflictionLimb(client.Character, "tla_amputation", LimbType.Torso, 0) + HF.SetAfflictionLimb(client.Character, "tra_amputation", LimbType.Torso, 0) + + return true -- hide message + elseif msg == "nt1" then + if not NT.TestingEnabled then + return + end + -- insert testing stuff here + + local test = { val = "true" } + + local function testfunc(param) + param.val = "false" + end + + print(test.val) + testfunc(test) + print(test.val) + + return true + elseif msg == "nt2" then + if not NT.TestingEnabled then + return + end + -- insert other testing stuff here + local crewenum = Character.GetFriendlyCrew(client.Character) + local targetchar = nil + local i = 0 + for char in crewenum do + print(char.Name) + targetchar = char + i = i + 1 + if i == 2 then + break + end + end + + client.SetClientCharacter(nil) + + print(targetchar) + + Timer.Wait(function() + client.SetClientCharacter(targetchar) + end, 50) + + return true + end +end) diff --git a/Neurotrauma/Lua/todo.md b/Neurotrauma/Lua/todo.md new file mode 100644 index 0000000..602bdb0 --- /dev/null +++ b/Neurotrauma/Lua/todo.md @@ -0,0 +1,4 @@ +# TODO: +- implement body temp +- rebalance skill gain amount from existing treatments +- rest are probably in .lua files themselves diff --git a/Neurotrauma/Sound/BHUI/ecg1.ogg b/Neurotrauma/Sound/BHUI/ecg1.ogg new file mode 100644 index 0000000..43f6363 --- /dev/null +++ b/Neurotrauma/Sound/BHUI/ecg1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:734a22f8fbf191117ed09ffaf568931bd3407079af4d233f7ba4fa05fa0e829f +size 7480 diff --git a/Neurotrauma/Sound/BHUI/ecg2.ogg b/Neurotrauma/Sound/BHUI/ecg2.ogg new file mode 100644 index 0000000..ab5a5bf --- /dev/null +++ b/Neurotrauma/Sound/BHUI/ecg2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:184ed5571accdc75c9a284e7e487621567aac01063f4f75fdcfd53640c4c1877 +size 7825 diff --git a/Neurotrauma/Sound/BHUI/flatline1.ogg b/Neurotrauma/Sound/BHUI/flatline1.ogg new file mode 100644 index 0000000..3a8d17b --- /dev/null +++ b/Neurotrauma/Sound/BHUI/flatline1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea0e56bacf77877a16f06d3e26eb0ed8182e7eb4ff75255805cf8c3f28075612 +size 42092 diff --git a/Neurotrauma/Sound/BHUI/flatline2.ogg b/Neurotrauma/Sound/BHUI/flatline2.ogg new file mode 100644 index 0000000..f8e0bf4 --- /dev/null +++ b/Neurotrauma/Sound/BHUI/flatline2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a77d8179b688613b08570f74138909cf2c6d4d980d0c21a2f5f5ae429d0c7d63 +size 81853 diff --git a/Neurotrauma/Sound/Defib1.ogg b/Neurotrauma/Sound/Defib1.ogg new file mode 100644 index 0000000..7e83b92 --- /dev/null +++ b/Neurotrauma/Sound/Defib1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c855c601b031ab32317aad7e219455895ab4ea44396a9c63158ecb3f8d73395 +size 88454 diff --git a/Neurotrauma/Sound/Defib2.ogg b/Neurotrauma/Sound/Defib2.ogg new file mode 100644 index 0000000..d575c66 --- /dev/null +++ b/Neurotrauma/Sound/Defib2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb41b54510bdd5eb9a6bbd17e1c7b4aa87215aa976d6da182aed6c42515aa9b6 +size 66436 diff --git a/Neurotrauma/Sound/Pageturn.ogg b/Neurotrauma/Sound/Pageturn.ogg new file mode 100644 index 0000000..75287c3 --- /dev/null +++ b/Neurotrauma/Sound/Pageturn.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f28ef2316e277fdb2a919064adfaf6bd3e21a0b7855d1ac91b9be08c5e841d87 +size 14500 diff --git a/Neurotrauma/Sound/Voice/fatigue1.ogg b/Neurotrauma/Sound/Voice/fatigue1.ogg new file mode 100644 index 0000000..2dc3033 --- /dev/null +++ b/Neurotrauma/Sound/Voice/fatigue1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a99705abcbdd1961b3e7ebdd83a21843228f6d80773ccd4b23858f8c0330503a +size 23706 diff --git a/Neurotrauma/Sound/Voice/fatigue2.ogg b/Neurotrauma/Sound/Voice/fatigue2.ogg new file mode 100644 index 0000000..438bf6e --- /dev/null +++ b/Neurotrauma/Sound/Voice/fatigue2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a582af3c6c26533dddefb4cfa7f7fb8c2c2a0c2fcc9a78d8e46b2fe7c9042a48 +size 32913 diff --git a/Neurotrauma/Sound/Voice/fatigue3.ogg b/Neurotrauma/Sound/Voice/fatigue3.ogg new file mode 100644 index 0000000..8d021b3 --- /dev/null +++ b/Neurotrauma/Sound/Voice/fatigue3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:131c7b67d77c8d19cbe0ca4105b5b1b625e8659e5fbff833485bff7536306b3f +size 27682 diff --git a/Neurotrauma/Sound/Voice/female_cough1.ogg b/Neurotrauma/Sound/Voice/female_cough1.ogg new file mode 100644 index 0000000..a939651 --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32cd7f3099d8f48c0a90baa0f1c805622e4eb3e5a0c67a235d63ce614edef049 +size 15904 diff --git a/Neurotrauma/Sound/Voice/female_cough2.ogg b/Neurotrauma/Sound/Voice/female_cough2.ogg new file mode 100644 index 0000000..2b9decd --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77c55f8230c2a54675206c9a2663844b19a135d2f2fd91af58128b3a6ceace06 +size 14211 diff --git a/Neurotrauma/Sound/Voice/female_cough3.ogg b/Neurotrauma/Sound/Voice/female_cough3.ogg new file mode 100644 index 0000000..df3458b --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12e5701e656da6eee30a7ea3b5a5aba3fe375695c4f2b6e6c33027780772ed49 +size 15264 diff --git a/Neurotrauma/Sound/Voice/female_cough4.ogg b/Neurotrauma/Sound/Voice/female_cough4.ogg new file mode 100644 index 0000000..dd94c51 --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c4f711e4fb18bea3b622f6a4c3a5e648e9c08d2b9fe993cc070a7e1cb0587f +size 10065 diff --git a/Neurotrauma/Sound/Voice/female_cough5.ogg b/Neurotrauma/Sound/Voice/female_cough5.ogg new file mode 100644 index 0000000..3018bda --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91b0c711417067fc977b22ce19a2bf6597bdfb891805282fc949b9dfd85a1c17 +size 14416 diff --git a/Neurotrauma/Sound/Voice/female_cough6.ogg b/Neurotrauma/Sound/Voice/female_cough6.ogg new file mode 100644 index 0000000..4f6c40d --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cough6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae760966b8c6f85e04c64967dca24d6dbddcd5b7cfd42a9794f22571391746e6 +size 12590 diff --git a/Neurotrauma/Sound/Voice/female_cry1.ogg b/Neurotrauma/Sound/Voice/female_cry1.ogg new file mode 100644 index 0000000..c634f33 --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cry1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6877022d2b027272dbd10b2a7f41afe39735d2166b3efdd12ab3c8ec2ce2ea9 +size 39731 diff --git a/Neurotrauma/Sound/Voice/female_cry2.ogg b/Neurotrauma/Sound/Voice/female_cry2.ogg new file mode 100644 index 0000000..b8f7701 --- /dev/null +++ b/Neurotrauma/Sound/Voice/female_cry2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c22ad1c37d54ee670bf840ab92f09c538e3977ae6b77fcfe429c5ba8643d4bf3 +size 24917 diff --git a/Neurotrauma/Sound/Voice/male_cough1.ogg b/Neurotrauma/Sound/Voice/male_cough1.ogg new file mode 100644 index 0000000..200a7da --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cough1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25d2cae7f4076609f504f40b5d45af891c7e073846de711bb7f94dbff14f00cd +size 7684 diff --git a/Neurotrauma/Sound/Voice/male_cough2.ogg b/Neurotrauma/Sound/Voice/male_cough2.ogg new file mode 100644 index 0000000..b13f9be --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cough2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bdcb64807174b5bb04ab847af27a9e5f8d7a4f18cdc8ad28fdc5daf0aeee617 +size 7827 diff --git a/Neurotrauma/Sound/Voice/male_cough3.ogg b/Neurotrauma/Sound/Voice/male_cough3.ogg new file mode 100644 index 0000000..1a01530 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cough3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:644ea3e58ae0c4ef4b2130d0158a03429ebe577355f5b9a00e9e24619209daa9 +size 11320 diff --git a/Neurotrauma/Sound/Voice/male_cough4.ogg b/Neurotrauma/Sound/Voice/male_cough4.ogg new file mode 100644 index 0000000..f1433d9 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cough4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c79e28d52a872bb40b2af925921c3de80568bdf250d723082a6807d44f30166b +size 15768 diff --git a/Neurotrauma/Sound/Voice/male_cry1.ogg b/Neurotrauma/Sound/Voice/male_cry1.ogg new file mode 100644 index 0000000..505595e --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cry1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b0524a37aaf7e1160e01aaa06cc75b41986b03286e92217d2e4afe1123fcd6 +size 13855 diff --git a/Neurotrauma/Sound/Voice/male_cry2.ogg b/Neurotrauma/Sound/Voice/male_cry2.ogg new file mode 100644 index 0000000..158a219 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_cry2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:781d24e16f4801d9808a9195f76f45431a20de6e64d0eabb17b29738ed314758 +size 15096 diff --git a/Neurotrauma/Sound/Voice/male_moan1.ogg b/Neurotrauma/Sound/Voice/male_moan1.ogg new file mode 100644 index 0000000..09eeb96 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_moan1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f1c72feb64b73ff08f2cb2bf51c21887ab922f222408901a4ae0020c64ad2c9 +size 18800 diff --git a/Neurotrauma/Sound/Voice/male_moan2.ogg b/Neurotrauma/Sound/Voice/male_moan2.ogg new file mode 100644 index 0000000..7441e06 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_moan2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:074295a623dc2536ca4aec9fc7caab3feff0edbc21b0e87cb86860c7a86e35ea +size 11280 diff --git a/Neurotrauma/Sound/Voice/male_moan3.ogg b/Neurotrauma/Sound/Voice/male_moan3.ogg new file mode 100644 index 0000000..87feffb --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_moan3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e177b150c46e7cb39227ea691486fcdab61b04b012905ab6217f4253c38553b5 +size 35953 diff --git a/Neurotrauma/Sound/Voice/male_onfire1.ogg b/Neurotrauma/Sound/Voice/male_onfire1.ogg new file mode 100644 index 0000000..bffecb2 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_onfire1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47b8b31ce57cbf28c6713584f57df35fd9c68754b7ab3a8b5b880381c2f82def +size 97028 diff --git a/Neurotrauma/Sound/Voice/male_onfire2.ogg b/Neurotrauma/Sound/Voice/male_onfire2.ogg new file mode 100644 index 0000000..7b745b5 --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_onfire2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e38ebeec3b53bfab9a42f03cbfcefa4a44cc521b9ea04f15ccc41040e1c043ec +size 128435 diff --git a/Neurotrauma/Sound/Voice/male_onfire3.ogg b/Neurotrauma/Sound/Voice/male_onfire3.ogg new file mode 100644 index 0000000..b26d75e --- /dev/null +++ b/Neurotrauma/Sound/Voice/male_onfire3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30fd4fa96d44a47dc4aa1b166fd000ec5def96fb9975f2411d203caa7219d6fb +size 120884 diff --git a/Neurotrauma/Sound/Voice/man_pain1.ogg b/Neurotrauma/Sound/Voice/man_pain1.ogg new file mode 100644 index 0000000..2e60e8b --- /dev/null +++ b/Neurotrauma/Sound/Voice/man_pain1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bea0609aeac4c726d4bb7bad7408e9e00f3216d5d962bfbcab0feb5caa4110d0 +size 25411 diff --git a/Neurotrauma/Sound/Voice/man_pain2.ogg b/Neurotrauma/Sound/Voice/man_pain2.ogg new file mode 100644 index 0000000..01ddc73 --- /dev/null +++ b/Neurotrauma/Sound/Voice/man_pain2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d8a719c5ab793b94e1ac80959fe27c2562a084d1929c8dd06d7b5a4ec750a61 +size 25685 diff --git a/Neurotrauma/Sound/Voice/man_pain3.ogg b/Neurotrauma/Sound/Voice/man_pain3.ogg new file mode 100644 index 0000000..5951b31 --- /dev/null +++ b/Neurotrauma/Sound/Voice/man_pain3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34df3505a72ef1de3d7de36718c0a5b35303a3a57fa3ff3c0685ee41e4213187 +size 16507 diff --git a/Neurotrauma/Sound/Voice/scream_male_1.ogg b/Neurotrauma/Sound/Voice/scream_male_1.ogg new file mode 100644 index 0000000..cea6bdb --- /dev/null +++ b/Neurotrauma/Sound/Voice/scream_male_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d69a62239b54159743694cbee2c9ab3821b7dfa3755c5b98410f76c9a1085559 +size 41172 diff --git a/Neurotrauma/Sound/Voice/scream_male_2.ogg b/Neurotrauma/Sound/Voice/scream_male_2.ogg new file mode 100644 index 0000000..d9d3219 --- /dev/null +++ b/Neurotrauma/Sound/Voice/scream_male_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:371a83037c803829895f852cdaa1c0524ce6a1f216f5254a39d0e4061adf681d +size 43290 diff --git a/Neurotrauma/Sound/Voice/scream_male_3.ogg b/Neurotrauma/Sound/Voice/scream_male_3.ogg new file mode 100644 index 0000000..c9e2730 --- /dev/null +++ b/Neurotrauma/Sound/Voice/scream_male_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:babab8ea45dec6da39f80c515e31ebb6bf5d7cb372d4fde74c85c35f3a60e483 +size 57119 diff --git a/Neurotrauma/Sound/Voice/scream_woman_1.ogg b/Neurotrauma/Sound/Voice/scream_woman_1.ogg new file mode 100644 index 0000000..680dbe9 --- /dev/null +++ b/Neurotrauma/Sound/Voice/scream_woman_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94e539337be05ff3f7845aa3bf299800c265598568c2f3f7b7ef575fb68ddcf9 +size 19649 diff --git a/Neurotrauma/Sound/Voice/screams_woman_2.ogg b/Neurotrauma/Sound/Voice/screams_woman_2.ogg new file mode 100644 index 0000000..8a86f98 --- /dev/null +++ b/Neurotrauma/Sound/Voice/screams_woman_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e6cb9f83710c5a7d113fe01bb13004cf6e8a1bfa0255c2fc3c89a84075137d8 +size 57285 diff --git a/Neurotrauma/Sound/Voice/woman_agony1.ogg b/Neurotrauma/Sound/Voice/woman_agony1.ogg new file mode 100644 index 0000000..e9e9f29 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_agony1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac184fc98a892ffd8fb374393a3926ed17e9ae648ce5472006703df506df9257 +size 16130 diff --git a/Neurotrauma/Sound/Voice/woman_agony2.ogg b/Neurotrauma/Sound/Voice/woman_agony2.ogg new file mode 100644 index 0000000..f45e0e7 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_agony2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ad1e93a0252e0c67045e0adc09110aa08f4f448b2158c55bd12b815a87ea490 +size 22172 diff --git a/Neurotrauma/Sound/Voice/woman_agony3.ogg b/Neurotrauma/Sound/Voice/woman_agony3.ogg new file mode 100644 index 0000000..ab9b39e --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_agony3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:869f2886ea5f0899cbe7a60a1b435d907af9e8f14f368fd18573143fc5a79aa7 +size 24662 diff --git a/Neurotrauma/Sound/Voice/woman_pain1.ogg b/Neurotrauma/Sound/Voice/woman_pain1.ogg new file mode 100644 index 0000000..d5e66d1 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_pain1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87d6438c6b00939ef8862e2769de10248bc275ca4e7de3585501719f2755fb9b +size 20474 diff --git a/Neurotrauma/Sound/Voice/woman_pain2.ogg b/Neurotrauma/Sound/Voice/woman_pain2.ogg new file mode 100644 index 0000000..19a8d30 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_pain2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5862ede60ea585742c34d9798cf0cb2f61c269b6652c934d2b85ed1a47e73c1 +size 29399 diff --git a/Neurotrauma/Sound/Voice/woman_pain3.ogg b/Neurotrauma/Sound/Voice/woman_pain3.ogg new file mode 100644 index 0000000..733c319 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_pain3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2aa5db97756b66b7c80f73b2005d582471ab847c60c0f52f823609d82f9026d +size 18185 diff --git a/Neurotrauma/Sound/Voice/woman_pain4.ogg b/Neurotrauma/Sound/Voice/woman_pain4.ogg new file mode 100644 index 0000000..4547675 --- /dev/null +++ b/Neurotrauma/Sound/Voice/woman_pain4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e5f5e566b9ac6378b9a293e04dedcb576f9ebb494a23f090a89b4025238e045 +size 18864 diff --git a/Neurotrauma/Sound/blood.ogg b/Neurotrauma/Sound/blood.ogg new file mode 100644 index 0000000..a502fdc --- /dev/null +++ b/Neurotrauma/Sound/blood.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cea4021bb8d58ff49585dfddaded39b39745cf860aabe0ed385e295357cbafe5 +size 18833 diff --git a/Neurotrauma/Sound/bonebreak1.ogg b/Neurotrauma/Sound/bonebreak1.ogg new file mode 100644 index 0000000..a086eb7 --- /dev/null +++ b/Neurotrauma/Sound/bonebreak1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e14bde38dd706a0547bc26918cf45110d1e098cc95c08d8d2382f0d00f1af2f +size 9721 diff --git a/Neurotrauma/Sound/bonebreak2.ogg b/Neurotrauma/Sound/bonebreak2.ogg new file mode 100644 index 0000000..2e8809d --- /dev/null +++ b/Neurotrauma/Sound/bonebreak2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:327a6ebe9408104ee253c6484a654ccfcc1073f8d9f0d7293baeede6ccd9c49a +size 8152 diff --git a/Neurotrauma/Sound/bonebreak3.ogg b/Neurotrauma/Sound/bonebreak3.ogg new file mode 100644 index 0000000..da97070 --- /dev/null +++ b/Neurotrauma/Sound/bonebreak3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adda1af88d1a71c3c5ff31ec22c0f095d408b514195d75f0cb2c1eafdfbf97f0 +size 9467 diff --git a/Neurotrauma/Sound/bonebreak4.ogg b/Neurotrauma/Sound/bonebreak4.ogg new file mode 100644 index 0000000..fd8c24f --- /dev/null +++ b/Neurotrauma/Sound/bonebreak4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1da7cb73b690225e77d1485dc971b15e0830f9f4222c9c26bf69783b58c1193 +size 10825 diff --git a/Neurotrauma/Sound/drill.ogg b/Neurotrauma/Sound/drill.ogg new file mode 100644 index 0000000..9ef8080 --- /dev/null +++ b/Neurotrauma/Sound/drill.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3647d6f60bd9e984b10063a75f109a2d1296d304a1557c868005c45c52c692c6 +size 19166 diff --git a/Neurotrauma/Sound/hypospray.ogg b/Neurotrauma/Sound/hypospray.ogg new file mode 100644 index 0000000..3820a35 --- /dev/null +++ b/Neurotrauma/Sound/hypospray.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4fdeea785bee33f81e6dc4186bc33e5c61955b50f5ed403695c86529d084c95 +size 5746 diff --git a/Neurotrauma/Sound/manualdefib.ogg b/Neurotrauma/Sound/manualdefib.ogg new file mode 100644 index 0000000..b1a9e16 --- /dev/null +++ b/Neurotrauma/Sound/manualdefib.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66f3cdd5b0b47587e146cdf421b85c5c7292705f2d871546ec0628cbe5e8d0e1 +size 59706 diff --git a/Neurotrauma/Sound/ointment.ogg b/Neurotrauma/Sound/ointment.ogg new file mode 100644 index 0000000..e6539a7 --- /dev/null +++ b/Neurotrauma/Sound/ointment.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d83f9711820050c87efa37fb108226c268b2e4ad08b8e951fa30d3ee2cdb386 +size 25276 diff --git a/Neurotrauma/Sound/pills1.ogg b/Neurotrauma/Sound/pills1.ogg new file mode 100644 index 0000000..b7c50f8 --- /dev/null +++ b/Neurotrauma/Sound/pills1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca50a6b2128ca81a31202c2537e2e3c7bd9454d8d023aafcc3ed1ba8a35d7908 +size 22968 diff --git a/Neurotrauma/Sound/pills2.ogg b/Neurotrauma/Sound/pills2.ogg new file mode 100644 index 0000000..52b6035 --- /dev/null +++ b/Neurotrauma/Sound/pills2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:591142f2a3d00f5e15cdf8b66376fda1c1c1428fcb961165f679b44fd627171e +size 33417 diff --git a/Neurotrauma/Sound/pills3.ogg b/Neurotrauma/Sound/pills3.ogg new file mode 100644 index 0000000..65cd36d --- /dev/null +++ b/Neurotrauma/Sound/pills3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37609446ee8a6ce47aebe414f106238718fb6b19282832f1db60a78d11d6e04f +size 31808 diff --git a/Neurotrauma/Sound/pump.ogg b/Neurotrauma/Sound/pump.ogg new file mode 100644 index 0000000..9523ecc --- /dev/null +++ b/Neurotrauma/Sound/pump.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bda5dc2780187c8f34ca7a1a82493b358a83abd002f4561adff3e66e4dc28e2 +size 13367 diff --git a/Neurotrauma/Sound/scissors1.ogg b/Neurotrauma/Sound/scissors1.ogg new file mode 100644 index 0000000..36a1cd7 --- /dev/null +++ b/Neurotrauma/Sound/scissors1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aa798ad28a9870784ff2998e4c22e8cc1ffc4e87b38581867f93446f066e5ea +size 44038 diff --git a/Neurotrauma/Sound/scissors2.ogg b/Neurotrauma/Sound/scissors2.ogg new file mode 100644 index 0000000..198a7b2 --- /dev/null +++ b/Neurotrauma/Sound/scissors2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99e0718f0d0730b52336c91e5b5ce66c360fbf63eaa335d702bb14070127dcc4 +size 31940 diff --git a/Neurotrauma/Sound/selfscan.ogg b/Neurotrauma/Sound/selfscan.ogg new file mode 100644 index 0000000..2cbe43d --- /dev/null +++ b/Neurotrauma/Sound/selfscan.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8fde1ecfcb24fe14d25c525124749e0c64f6a8ae97abdb6aed02bd8553cb860 +size 55739 diff --git a/Neurotrauma/Sound/severed.ogg b/Neurotrauma/Sound/severed.ogg new file mode 100644 index 0000000..344eae4 --- /dev/null +++ b/Neurotrauma/Sound/severed.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9e44603cb534fc98333ccc37c4420877fb1425de1b8173247771188c84f6252 +size 12599 diff --git a/Neurotrauma/Sound/silent.ogg b/Neurotrauma/Sound/silent.ogg new file mode 100644 index 0000000..2fae2ae --- /dev/null +++ b/Neurotrauma/Sound/silent.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16f72056ed89ce165361e8aa9148aedd1c4f2d4b85cc3ccdfe6176dae1c21a7f +size 3562 diff --git a/Neurotrauma/Sound/spray.ogg b/Neurotrauma/Sound/spray.ogg new file mode 100644 index 0000000..64b27d7 --- /dev/null +++ b/Neurotrauma/Sound/spray.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a45f75ef450b1122aa191f421e91998b6cbcbc21335534710e8664597ea40d0c +size 19037 diff --git a/Neurotrauma/Sound/squeak1.ogg b/Neurotrauma/Sound/squeak1.ogg new file mode 100644 index 0000000..3b422b9 --- /dev/null +++ b/Neurotrauma/Sound/squeak1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f8867d63264c50c8ea128cbedd3db6a0da009b2acd00a3cf7b211bbf9d2e128 +size 24137 diff --git a/Neurotrauma/Sound/squeak2.ogg b/Neurotrauma/Sound/squeak2.ogg new file mode 100644 index 0000000..c14cfa2 --- /dev/null +++ b/Neurotrauma/Sound/squeak2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aef7e5d08c4b1b8daf97f1634403e22cd3ba4f08e8acbac5ccd50cf2162b44c4 +size 27593 diff --git a/Neurotrauma/Sound/squeak3.ogg b/Neurotrauma/Sound/squeak3.ogg new file mode 100644 index 0000000..3da34ff --- /dev/null +++ b/Neurotrauma/Sound/squeak3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b4f8dbe559b7b7ce59e6d06ef68ed4d4e1088d361d28fdb070847a123e9d3b5 +size 28116 diff --git a/Neurotrauma/Sound/squeak4.ogg b/Neurotrauma/Sound/squeak4.ogg new file mode 100644 index 0000000..71b1873 --- /dev/null +++ b/Neurotrauma/Sound/squeak4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b9d01db68234ee0d2196c95f12a19de7093278d637e45d078dcbe7c69581b30 +size 16598 diff --git a/Neurotrauma/Sound/squeak5.ogg b/Neurotrauma/Sound/squeak5.ogg new file mode 100644 index 0000000..b849966 --- /dev/null +++ b/Neurotrauma/Sound/squeak5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:138c65375c7b69f8a69c8f877fa5ac297baf72a33b8753930c16587e46cf94b0 +size 17704 diff --git a/Neurotrauma/Sound/squelch1.ogg b/Neurotrauma/Sound/squelch1.ogg new file mode 100644 index 0000000..265e3f6 --- /dev/null +++ b/Neurotrauma/Sound/squelch1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d81233f9fe679b733f8c27f5548d35fe491c10804c1ff0f496dc0308a84c2400 +size 9661 diff --git a/Neurotrauma/Sound/suture.ogg b/Neurotrauma/Sound/suture.ogg new file mode 100644 index 0000000..7880e6f --- /dev/null +++ b/Neurotrauma/Sound/suture.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44ca0e2540e0affb15d7bf2d0481d0e2cd8266b3d98621f6b2dd189faea3b800 +size 122376 diff --git a/Neurotrauma/Sound/velcro_tape1.ogg b/Neurotrauma/Sound/velcro_tape1.ogg new file mode 100644 index 0000000..a5a0016 --- /dev/null +++ b/Neurotrauma/Sound/velcro_tape1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85f5b05d68787db7f135942ee8a3b18167a6daa630cea6ba12b2a1b33d09f305 +size 16964 diff --git a/Neurotrauma/Sound/velcro_tape2.ogg b/Neurotrauma/Sound/velcro_tape2.ogg new file mode 100644 index 0000000..04c4c31 --- /dev/null +++ b/Neurotrauma/Sound/velcro_tape2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:450fd95d3c72af73b8a0fcaa484a48719f65759afe28d3bb92d54b37c8d8b1e7 +size 11849 diff --git a/Neurotrauma/Sound/velcro_tape3.ogg b/Neurotrauma/Sound/velcro_tape3.ogg new file mode 100644 index 0000000..0f7996c --- /dev/null +++ b/Neurotrauma/Sound/velcro_tape3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dd2d2daac98873697be5a27c6b767877f166c1a3dedc70145677790783dc3fe +size 11629 diff --git a/Neurotrauma/Sound/zipper_1.ogg b/Neurotrauma/Sound/zipper_1.ogg new file mode 100644 index 0000000..f8e6043 --- /dev/null +++ b/Neurotrauma/Sound/zipper_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17359ba799053affc79c850c08370ccf75de077e541e62a3fa65a235b9dcc564 +size 21766 diff --git a/Neurotrauma/Sound/zipper_2.ogg b/Neurotrauma/Sound/zipper_2.ogg new file mode 100644 index 0000000..8d87498 --- /dev/null +++ b/Neurotrauma/Sound/zipper_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7b88d805b5ce5a72fdfe3a823ac01ef784a4c546a1a61a74d0ef59384b91dd6 +size 24591 diff --git a/Neurotrauma/Xml/Afflictions.xml b/Neurotrauma/Xml/Afflictions.xml new file mode 100644 index 0000000..55b65bd --- /dev/null +++ b/Neurotrauma/Xml/Afflictions.xml @@ -0,0 +1,2327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Blood/BloodPacks.xml b/Neurotrauma/Xml/Items/Blood/BloodPacks.xml new file mode 100644 index 0000000..acaebb6 --- /dev/null +++ b/Neurotrauma/Xml/Items/Blood/BloodPacks.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Blood/DonorCard.xml b/Neurotrauma/Xml/Items/Blood/DonorCard.xml new file mode 100644 index 0000000..b63b44f --- /dev/null +++ b/Neurotrauma/Xml/Items/Blood/DonorCard.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Blood/Gear.xml b/Neurotrauma/Xml/Items/Blood/Gear.xml new file mode 100644 index 0000000..5a8b4ed --- /dev/null +++ b/Neurotrauma/Xml/Items/Blood/Gear.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/BodyParts/Limbs.xml b/Neurotrauma/Xml/Items/BodyParts/Limbs.xml new file mode 100644 index 0000000..7dc7737 --- /dev/null +++ b/Neurotrauma/Xml/Items/BodyParts/Limbs.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/BodyParts/Locks.xml b/Neurotrauma/Xml/Items/BodyParts/Locks.xml new file mode 100644 index 0000000..f1fb9f9 --- /dev/null +++ b/Neurotrauma/Xml/Items/BodyParts/Locks.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/BodyParts/Organs.xml b/Neurotrauma/Xml/Items/BodyParts/Organs.xml new file mode 100644 index 0000000..767bb59 --- /dev/null +++ b/Neurotrauma/Xml/Items/BodyParts/Organs.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Chemicals.xml b/Neurotrauma/Xml/Items/Chemicals.xml new file mode 100644 index 0000000..b3dcabc --- /dev/null +++ b/Neurotrauma/Xml/Items/Chemicals.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Consumables.xml b/Neurotrauma/Xml/Items/Consumables.xml new file mode 100644 index 0000000..04d522d --- /dev/null +++ b/Neurotrauma/Xml/Items/Consumables.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Containers.xml b/Neurotrauma/Xml/Items/Containers.xml new file mode 100644 index 0000000..8a6c068 --- /dev/null +++ b/Neurotrauma/Xml/Items/Containers.xml @@ -0,0 +1,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Etc.xml b/Neurotrauma/Xml/Items/Etc.xml new file mode 100644 index 0000000..2fa4213 --- /dev/null +++ b/Neurotrauma/Xml/Items/Etc.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/FirstAID.xml b/Neurotrauma/Xml/Items/FirstAID.xml new file mode 100644 index 0000000..bd482be --- /dev/null +++ b/Neurotrauma/Xml/Items/FirstAID.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Gear/Defibrillators.xml b/Neurotrauma/Xml/Items/Gear/Defibrillators.xml new file mode 100644 index 0000000..a1b06c6 --- /dev/null +++ b/Neurotrauma/Xml/Items/Gear/Defibrillators.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Gear/Items.xml b/Neurotrauma/Xml/Items/Gear/Items.xml new file mode 100644 index 0000000..5b69e48 --- /dev/null +++ b/Neurotrauma/Xml/Items/Gear/Items.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Override.xml b/Neurotrauma/Xml/Items/Override.xml new file mode 100644 index 0000000..04ef1e9 --- /dev/null +++ b/Neurotrauma/Xml/Items/Override.xml @@ -0,0 +1,1590 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/SFX.xml b/Neurotrauma/Xml/Items/SFX.xml new file mode 100644 index 0000000..c11c251 --- /dev/null +++ b/Neurotrauma/Xml/Items/SFX.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Surgery/Implants.xml b/Neurotrauma/Xml/Items/Surgery/Implants.xml new file mode 100644 index 0000000..6da1a41 --- /dev/null +++ b/Neurotrauma/Xml/Items/Surgery/Implants.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Surgery/Instruments.xml b/Neurotrauma/Xml/Items/Surgery/Instruments.xml new file mode 100644 index 0000000..fbc3031 --- /dev/null +++ b/Neurotrauma/Xml/Items/Surgery/Instruments.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/Surgery/Scalpels.xml b/Neurotrauma/Xml/Items/Surgery/Scalpels.xml new file mode 100644 index 0000000..ab02058 --- /dev/null +++ b/Neurotrauma/Xml/Items/Surgery/Scalpels.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/Items/VFX.xml b/Neurotrauma/Xml/Items/VFX.xml new file mode 100644 index 0000000..b67f3ac --- /dev/null +++ b/Neurotrauma/Xml/Items/VFX.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/sounds.xml b/Neurotrauma/Xml/sounds.xml new file mode 100644 index 0000000..111f5e8 --- /dev/null +++ b/Neurotrauma/Xml/sounds.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/Xml/todo.md b/Neurotrauma/Xml/todo.md new file mode 100644 index 0000000..b73ce32 --- /dev/null +++ b/Neurotrauma/Xml/todo.md @@ -0,0 +1,13 @@ +# TODO: +- add "bundled" items for crafting to optimize medfab recipes count +- add Lua StatusEffects to syringes to handle by Consent Required code +- one manned stretcher with minor rest buffs and remove normal speed drag buffs from bags +- bloody murder meat skull / bagged head for traumatic/surgery amputations +- make all amputated limbs placeable +- increase the blood pack loot a little more +- add mobile stretchers that you lie down onto for surgeries / stabilizes fractures to avoid complications +- for defibrillator, aed: improvements: must aim it on the person to successfully apply the effect, remove code for application from health UI and might need use of a Lua XML hook +- autocpr: remove all of this when defibs get better (?) +- add some effect for adrenaline, sticktocharacters false until there is an effect. +- hyperzine: should this be any affliction of type damage? (for ) +- add bag container to the hotbar slots for bodybags and stasis bags \ No newline at end of file diff --git a/Neurotrauma/filelist.xml b/Neurotrauma/filelist.xml new file mode 100644 index 0000000..f864eca --- /dev/null +++ b/Neurotrauma/filelist.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Neurotrauma/metadata.xml b/Neurotrauma/metadata.xml new file mode 100644 index 0000000..ec367de --- /dev/null +++ b/Neurotrauma/metadata.xml @@ -0,0 +1,10 @@ + + + + guns + guns.Neurotrauma + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/ThalamusAI.xml b/New Wrecks For Barotrauma (With sellable wrecks)/ThalamusAI.xml new file mode 100644 index 0000000..f406e51 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/ThalamusAI.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/TurretsWrecked.png b/New Wrecks For Barotrauma (With sellable wrecks)/TurretsWrecked.png new file mode 100644 index 0000000..561f5cf --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/TurretsWrecked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdddeb11e63547efa0c88074f1d67eeef4cb5657fe47eec437785a2259e6b2b3 +size 2707674 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/50L1-TUD3_Wrecked.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/50L1-TUD3_Wrecked.sub new file mode 100644 index 0000000..a920b4d --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/50L1-TUD3_Wrecked.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32e4da7bfbca006321366e70165414ee11b954e55cf1105710d017fb3fdaba73 +size 101642 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Azimuth_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Azimuth_Wrecked2.sub new file mode 100644 index 0000000..496ad34 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Azimuth_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:695c3f0c04451f4ef964c4cebb667ff9189c254758ce4892d7dc4c8d38f482e4 +size 41371 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Barsuk_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Barsuk_Wrecked2.sub new file mode 100644 index 0000000..417eb04 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Barsuk_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:653af8bed5e0c849b9268ae35e47d274dca661c2ab88ad6aa6f3a98187acf4a0 +size 32290 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/BeaconRYR05_1.1.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/BeaconRYR05_1.1.sub new file mode 100644 index 0000000..93bb8f6 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/BeaconRYR05_1.1.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b47f6601531041adb697de8db2dd8f7b51c9d80fe888b7a16373003759e8f03c +size 29365 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Berilia_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Berilia_Wrecked2.sub new file mode 100644 index 0000000..d41328d --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Berilia_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d127c4071ecd54b3e21d7d75c9c88d75fe8a2f77c504fa0f2308727a6cefeaad +size 57456 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Camel_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Camel_Wrecked2.sub new file mode 100644 index 0000000..bfa4f84 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Camel_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65db964a75229948d69fc8c4d9099920a3ab572b4b5655e38c4302d41df6f2af +size 52982 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Dugong_Wrecked1.1.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Dugong_Wrecked1.1.sub new file mode 100644 index 0000000..429b7a9 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Dugong_Wrecked1.1.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83c7e4070fbd6c55a9c42049896cf979965ec0d11ed25a1b16d75a02cf6a0c9b +size 45047 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Herja_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Herja_Wrecked2.sub new file mode 100644 index 0000000..7586e45 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Herja_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16bee90a58c31efb2141e9ff68d3f467a7bbefd9e9b852bc0f244df66790acf5 +size 42766 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Humpback_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Humpback_Wrecked2.sub new file mode 100644 index 0000000..73f1b92 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Humpback_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bf0497c57e7a9fdcae0e36180e320fe9472a5b882553547e5c81a104787ccb4 +size 40235 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Luoti-S_Wrecked.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Luoti-S_Wrecked.sub new file mode 100644 index 0000000..0178e67 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Luoti-S_Wrecked.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6614d2805ec3c1d9d96b8b86863e9b87f304ba0f338aae59cb12512478bd13eb +size 47561 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/MinelayerPod_WreckedM.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/MinelayerPod_WreckedM.sub new file mode 100644 index 0000000..fbb8243 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/MinelayerPod_WreckedM.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ee8e0a55042ee99a271ef6c13b65911556eda7df0843a98f91b4d461e872fe3 +size 38065 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca2_WreckedM.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca2_WreckedM.sub new file mode 100644 index 0000000..2d7edbc --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca2_WreckedM.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76cadb3d60fccca4a6f326714e06d775d889300093ec76f27d658856eec9f7b0 +size 72596 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca_Wrecked1.1.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca_Wrecked1.1.sub new file mode 100644 index 0000000..2d3c04a --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Orca_Wrecked1.1.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e6573a91faf50fd6e6a62081dc1b8a185c98dbccd9db4a19ab1f6645810da73 +size 53022 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/R-29_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/R-29_Wrecked2.sub new file mode 100644 index 0000000..f169a5d --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/R-29_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6aad189e39a8ea868f33023853ca7015d8049d398851c8d717a6b1c04f58486 +size 82117 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Remora_WreckedM.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Remora_WreckedM.sub new file mode 100644 index 0000000..264f017 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Remora_WreckedM.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0566f24c0c086bdfbc682a291eaba3df9caf6730fd6bf938b82a85ae36fed83 +size 77751 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Structure_Wrecked.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Structure_Wrecked.sub new file mode 100644 index 0000000..6ec5e8d --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Structure_Wrecked.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd55ee27c031cce3c8e50e3b4afdc5055eed32e8aaf31f92baa6bad2c6ef98d0 +size 41300 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon2_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon2_Wrecked2.sub new file mode 100644 index 0000000..77aa00f --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon2_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:885b980a3f8fa65e701d08af166b9aea053a7b19b9d6afcfa939b8846878db33 +size 59380 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon_Wrecked1.1.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon_Wrecked1.1.sub new file mode 100644 index 0000000..060dd81 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Typhon_Wrecked1.1.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8ac6bfccfe019832802f3378ce7546da9aa2cf3aff7bcede3bba4b2f3b78884 +size 47754 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Venture_Wrecked2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Venture_Wrecked2.sub new file mode 100644 index 0000000..d7c375a --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Venture_Wrecked2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3661cc2f6bbc721a6032dc23f726a9a0806ce0ad2c0110f16b71a03481ac28f5 +size 18799 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Shuttle_Wrecked.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Shuttle_Wrecked.sub new file mode 100644 index 0000000..f7e11ca --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Shuttle_Wrecked.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afc13f97fe49d75b9781406c3c8baa0fb86d3db837ba8b6c057bf575c2c11fe3 +size 17453 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Wrecked.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Wrecked.sub new file mode 100644 index 0000000..f9c137e --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/Winterhalter_Wrecked.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb6331beca3d10398970f69a2416d371aae6fbdcd2487a43ca877efffe3d07c3 +size 55173 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/BeaconRYR05_1.2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/BeaconRYR05_1.2.sub new file mode 100644 index 0000000..93b9e4c --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/BeaconRYR05_1.2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed9b1b1bd6aefd4f7b6596a827e1cbece9ca5b30233de3445537968d82ce2c10 +size 13990 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Dugong_Wrecked1.2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Dugong_Wrecked1.2.sub new file mode 100644 index 0000000..ce019fc --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Dugong_Wrecked1.2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5915b699eca1b3e35af426262dc6fe9778d5e1c7975c2936e40d24e9be77c47 +size 7975 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Naval Mine.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Naval Mine.sub new file mode 100644 index 0000000..e9d82ce --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Naval Mine.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:633611cb9b6b94ac730727ee74174ecef47eb433ed93476e23384859189e9ea3 +size 6155 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Orca_Wrecked1.2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Orca_Wrecked1.2.sub new file mode 100644 index 0000000..dbfd851 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Orca_Wrecked1.2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8b45ce9ce1d72877a1ffb01ca55a3f865669128d3c5ec7f370b0cb3703b325 +size 9984 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/SpinelingBall.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/SpinelingBall.sub new file mode 100644 index 0000000..a2a2f38 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/SpinelingBall.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b7281d2ac7b77fab9c24a1a33d0ced767ac8f732f6ef85f04e35b8b12e6122a +size 3526 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Typhon_Wrecked1.2.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Typhon_Wrecked1.2.sub new file mode 100644 index 0000000..1ce9982 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Typhon_Wrecked1.2.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0a6cbd17ebf3175b445218b56e69e04098cf2f1a5ac4332fc02496f026216b0 +size 9779 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Wrecktraps.sub b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Wrecktraps.sub new file mode 100644 index 0000000..4c150a0 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/Wrecks/WreckShuttles/Wrecktraps.sub @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a95d10285338098094bff1289183ce8a26bbf78c96fc8d156185562e39d63fe +size 18154 diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/filelist.xml b/New Wrecks For Barotrauma (With sellable wrecks)/filelist.xml new file mode 100644 index 0000000..e84c236 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/filelist.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/specialitems.xml b/New Wrecks For Barotrauma (With sellable wrecks)/specialitems.xml new file mode 100644 index 0000000..7e96de3 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/specialitems.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/thalamusitems.xml b/New Wrecks For Barotrauma (With sellable wrecks)/thalamusitems.xml new file mode 100644 index 0000000..04c5951 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/thalamusitems.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/thalamusstructures.xml b/New Wrecks For Barotrauma (With sellable wrecks)/thalamusstructures.xml new file mode 100644 index 0000000..8d1fc14 --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/thalamusstructures.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/New Wrecks For Barotrauma (With sellable wrecks)/wreckeditems.xml b/New Wrecks For Barotrauma (With sellable wrecks)/wreckeditems.xml new file mode 100644 index 0000000..80d55dc --- /dev/null +++ b/New Wrecks For Barotrauma (With sellable wrecks)/wreckeditems.xml @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Performance Fix/Lua/Autorun/init.lua b/Performance Fix/Lua/Autorun/init.lua new file mode 100644 index 0000000..2b71258 --- /dev/null +++ b/Performance Fix/Lua/Autorun/init.lua @@ -0,0 +1,12 @@ +if SERVER then + PerformanceFix = {} + PerformanceFix.Path = ... + + if not File.Exists(PerformanceFix.Path .. "/config.json") then + File.Write(PerformanceFix.Path .. "/config.json", json.serialize(dofile(PerformanceFix.Path .. "/Lua/defaultconfig.lua"))) + end + + PerformanceFix.Config = json.parse(File.Read(PerformanceFix.Path .. "/config.json")) + + dofile(PerformanceFix.Path .. "/Lua/performancefix.lua") +end diff --git a/Performance Fix/Lua/ForcedAutorun/init.lua b/Performance Fix/Lua/ForcedAutorun/init.lua new file mode 100644 index 0000000..34a8947 --- /dev/null +++ b/Performance Fix/Lua/ForcedAutorun/init.lua @@ -0,0 +1,17 @@ +if CLIENT then + PerformanceFix = {} + PerformanceFix.Path = ... + + if not File.Exists(PerformanceFix.Path .. "/config.json") then + File.Write(PerformanceFix.Path .. "/config.json", json.serialize(dofile(PerformanceFix.Path .. "/Lua/defaultconfig.lua"))) + end + + PerformanceFix.Config = json.parse(File.Read(PerformanceFix.Path .. "/config.json")) + + Game.AddCommand("performancefix_reload", "reloads config", function () + dofile(PerformanceFix.Path .. "/Lua/performancefix.lua") + end) + + dofile(PerformanceFix.Path .. "/Lua/performancefix_gui.lua") + dofile(PerformanceFix.Path .. "/Lua/performancefix.lua") +end \ No newline at end of file diff --git a/Performance Fix/Lua/MultiLineTextBox.lua b/Performance Fix/Lua/MultiLineTextBox.lua new file mode 100644 index 0000000..b8d02c3 --- /dev/null +++ b/Performance Fix/Lua/MultiLineTextBox.lua @@ -0,0 +1,49 @@ +-- why barotrauma's GUI libraries don't have this implemented by default? this is stupid + +local function updateServerMessageScrollBasedOnCaret(textBox, listBox) + local caretY = textBox.CaretScreenPos.Y; + local bottomCaretExtent = textBox.Font.LineHeight * 1.5 + local topCaretExtent = -textBox.Font.LineHeight * 0.5 + + if caretY + bottomCaretExtent > listBox.Rect.Bottom then + listBox.ScrollBar.BarScroll + = (caretY - textBox.Rect.Top - listBox.Rect.Height + bottomCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + elseif (caretY + topCaretExtent < listBox.Rect.Top) then + listBox.ScrollBar.BarScroll + = (caretY - textBox.Rect.Top + topCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + end +end + +local function CreateMultiLineTextBox(rectransform, text, size) + local multineListBox = GUI.ListBox(GUI.RectTransform(Vector2(1, size or 0.2), rectransform)) + + local textBox = GUI.TextBox(GUI.RectTransform(Vector2(1, 1), multineListBox.Content.RectTransform), text, nil, nil, nil, true, "GUITextBoxNoBorder") + + textBox.add_OnSelected(function () + updateServerMessageScrollBasedOnCaret(textBox, multineListBox) + end) + + textBox.OnTextChangedDelegate = function () + local textSize = textBox.Font.MeasureString(textBox.WrappedText); + textBox.RectTransform.NonScaledSize = Point(textBox.RectTransform.NonScaledSize.X, math.max(multineListBox.Content.Rect.Height, textSize.Y + 10)) + multineListBox.UpdateScrollBarSize() + + return true; + end + + textBox.OnEnterPressed = function () + local str = textBox.Text + local caretIndex = textBox.CaretIndex + + textBox.Text = str:sub(1, caretIndex) .. "\n" .. str:sub(caretIndex + 1) + textBox.CaretIndex = caretIndex + 1 + + return true + end + + return textBox +end + +return CreateMultiLineTextBox \ No newline at end of file diff --git a/Performance Fix/Lua/defaultconfig.lua b/Performance Fix/Lua/defaultconfig.lua new file mode 100644 index 0000000..0b120b2 --- /dev/null +++ b/Performance Fix/Lua/defaultconfig.lua @@ -0,0 +1,43 @@ +-- DO NOT EDIT THIS CONFIG, THIS IS JUST A TEMPLATE + +local config = {} + +config.accumulatorMax = 150 + +config.clientMapEntityUpdateInterval = 4 +config.serverMapEntityUpdateInterval = 1 + +config.clientCharacterUpdateInterval = 1 +config.serverCharacterUpdateInterval = 1 + +config.poweredUpdateInterval = 1 + +config.clientItemHighPriority = { + "door", "doorwbuttons", "windoweddoorwbuttons", "windoweddoor", "hatchwbuttons", "sonartransducer", "divingsuit", + "combatdivingsuit", "abyssdivingsuit", "pucs", "slipsuit", + "battery", "delaycomponent", "acidmistemitter" +} + +config.serverItemHighPriority = { "battery", + "delaycomponent", "acidmistemitter" +} + +config.clientComponentPriority = { "Engine", "Pump", "Sonar", "Fabricator", "Deconstructor", "Reactor", "Turret", + "Controller" } +config.serverComponentPriority = { "Engine", "Pump", "Sonar", "Fabricator", "Deconstructor", "Reactor", "Turret", + "Controller" } + +config.highPriorityCharacters = { "Human" } + +config.serverHighPriorityHands = true +config.clientHighPriorityHands = true + + +config.allowSingleplayerPermanentConfigs = false + +config.disableShadowCastingLights = false +config.disableDrawBehindSubsLights = false +config.hideInGameWires = false +config.hideInGameComponents = false + +return config diff --git a/Performance Fix/Lua/easysettings.lua b/Performance Fix/Lua/easysettings.lua new file mode 100644 index 0000000..12b35ad --- /dev/null +++ b/Performance Fix/Lua/easysettings.lua @@ -0,0 +1,98 @@ +local easySettings = {} + +easySettings.Settings = {} + +local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent") + +local function GetChildren(comp) + local tbl = {} + for value in comp.GetAllChildren() do + table.insert(tbl, value) + end + return tbl +end + +Hook.Patch("Barotrauma.GUI", "TogglePauseMenu", {}, function () + if GUI.GUI.PauseMenuOpen then + local frame = GUI.GUI.PauseMenu + + local list = GetChildren(GetChildren(frame)[2])[1] + + for key, value in pairs(easySettings.Settings) do + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), list.RectTransform), value.Name, GUI.Alignment.Center, "GUIButtonSmall") + + button.OnClicked = function () + value.OnOpen(frame) + end + end + end +end, Hook.HookMethodType.After) + +easySettings.SaveTable = function (path, tbl) + File.Write(path, json.serialize(tbl)) +end +easySettings.LoadTable = function (path) + if not File.Exists(path) then + return {} + end + + return json.parse(File.Read(path)) +end + +easySettings.AddMenu = function (name, onOpen) + table.insert(easySettings.Settings, {Name = name, OnOpen = onOpen}) +end + +easySettings.BasicList = function (parent, size) + local menuContent = GUI.Frame(GUI.RectTransform(size or Vector2(0.6, 0.6), parent.RectTransform, GUI.Anchor.Center)) + local menuList = GUI.ListBox(GUI.RectTransform(Vector2(1, 0.95), menuContent.RectTransform, GUI.Anchor.TopCenter)) + + easySettings.CloseButton(menuContent) + + return menuList +end + +easySettings.TickBox = function (parent, text, onSelected, state) + if state == nil then state = true end + + local tickBox = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), parent.RectTransform), text) + tickBox.Selected = state + tickBox.OnSelected = function () + onSelected(tickBox.State == GUIComponent.ComponentState.Selected) + end + + return tickBox +end + +easySettings.Slider = function (parent, min, max, onSelected, value) + local scrollBar = GUI.ScrollBar(GUI.RectTransform(Vector2(1, 0.1), parent.RectTransform), 0.1, nil, "GUISlider") + scrollBar.Range = Vector2(min, max) + scrollBar.BarScrollValue = value or max / 2 + scrollBar.OnMoved = function () + onSelected(scrollBar.BarScrollValue) + end + + return scrollBar +end + +easySettings.CloseButton = function (parent) + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.05), parent.RectTransform, GUI.Anchor.BottomCenter), "Close", GUI.Alignment.Center, "GUIButton") + + button.OnClicked = function () + GUI.GUI.TogglePauseMenu() + end + + return button +end + +easySettings.Open = function (name) + for key, value in pairs(easySettings.Settings) do + if value.Name == name then + local frame = GUI.GUI.PauseMenu + + value.OnOpen(frame) + end + end +end + +return easySettings \ No newline at end of file diff --git a/Performance Fix/Lua/performancefix.lua b/Performance Fix/Lua/performancefix.lua new file mode 100644 index 0000000..508ace7 --- /dev/null +++ b/Performance Fix/Lua/performancefix.lua @@ -0,0 +1,166 @@ +local invertedHighPriorityItems = {} +local invertedHighPriorityCharacters = {} +local highPriorityComponents = {} + +local signalComponents = {} + +if SERVER then + Game.mapEntityUpdateInterval = PerformanceFix.Config.serverMapEntityUpdateInterval + Game.characterUpdateInterval = PerformanceFix.Config.serverCharacterUpdateInterval + + highPriorityComponents = PerformanceFix.Config.serverComponentPriority + + for key, value in pairs(PerformanceFix.Config.serverItemHighPriority) do + invertedHighPriorityItems[value] = key + end + + for key, value in pairs(PerformanceFix.Config.highPriorityCharacters) do + invertedHighPriorityCharacters[value] = key + end + + Hook.Add("item.equip", "highPriorityHands", function(item, char) + Game.RemovePriorityItem(item) + Game.AddPriorityItem(item) + end) +else + local result, error = pcall(function() + Game.mapEntityUpdateInterval = PerformanceFix.Config.clientMapEntityUpdateInterval + Game.characterUpdateInterval = PerformanceFix.Config.clientCharacterUpdateInterval + + if Game.IsMultiplayer then + Game.poweredUpdateInterval = PerformanceFix.Config.poweredUpdateInterval or 1 + end + + Timer.AccumulatorMax = (PerformanceFix.Config.accumulatorMax or 50) / 1000 + end) + + if error then + printerror("The below error most likely was thrown because of an outdated Lua client, please consider updating.") + printerror(error) + end + + highPriorityComponents = PerformanceFix.Config.clientComponentPriority + + for key, value in pairs(PerformanceFix.Config.clientItemHighPriority) do + invertedHighPriorityItems[value] = key + end + + for key, value in pairs(PerformanceFix.Config.highPriorityCharacters) do + invertedHighPriorityCharacters[value] = key + end + + Hook.Add("item.equip", "highPriorityHands", function(item, char) + Game.RemovePriorityItem(item) + Game.AddPriorityItem(item) + end) +end + + +Hook.Add("think", "signalUpdatePerformanceFix", function() + for key, value in pairs(signalComponents) do + value.SendSignal(tostring(Game.mapEntityUpdateInterval), "signal_out") + end +end) + +local function IsPriority(item) + if item.HasTag("highpriority") or invertedHighPriorityItems[item.Prefab.Identifier.Value] ~= nil then + return true + end + + for _, comp in pairs(highPriorityComponents) do + if item.GetComponentString(comp) ~= nil then + return true + end + end + + return false +end + +local function SetPriority() + if CLIENT then + for k, v in pairs(Item.ItemList) do + if PerformanceFix.Config.allowSingleplayerPermanentConfigs and Game.IsSingleplayer then + break + end + + if string.find(v.Tags, "performancefix") then + table.insert(signalComponents, v) + end + + local light = v.GetComponentString("LightComponent") + + if light ~= nil then + if PerformanceFix.Config.disableShadowCastingLights then + light.CastShadows = false + end + if PerformanceFix.Config.disableDrawBehindSubsLights then + light.DrawBehindSubs = false + end + end + + if PerformanceFix.Config.hideInGameWires then + local wire = v.GetComponentString("Wire") + + if wire and #wire.Connections ~= 0 then + wire.Item.HiddenInGame = true + end + end + + if PerformanceFix.Config.hideInGameComponents then + if v.HasTag("logic") then + v.HiddenInGame = true + end + end + end + end + + Game.ClearPriorityItem() + Game.ClearPriorityCharacter() + + for key, value in pairs(Item.ItemList) do + if IsPriority(value) then + Game.AddPriorityItem(value) + end + end + + for key, value in pairs(Character.CharacterList) do + if invertedHighPriorityCharacters[value.SpeciesName.Value] then + Game.AddPriorityCharacter(value) + end + + if value.Inventory ~= nil then + local rightItem = value.Inventory.GetItemInLimbSlot(InvSlotType.RightHand) + local leftItem = value.Inventory.GetItemInLimbSlot(InvSlotType.LeftHand) + + if rightItem ~= nil then + Game.AddPriorityItem(rightItem) + end + + if leftItem ~= nil then + Game.AddPriorityItem(leftItem) + end + end + end +end + +Hook.Add("roundStart", "initRoundStart", function() + Timer.Wait(function() + SetPriority() + end, 1000) +end) + + +Hook.Add("characterCreated", "addToPriority", function(character) + if invertedHighPriorityCharacters[character.SpeciesName.Value] then + Game.AddPriorityCharacter(character) + end +end) + +Hook.Add("item.created", "addToPriority", function (item) + if IsPriority(item) then + Game.AddPriorityItem(item) + end +end) + + +SetPriority() diff --git a/Performance Fix/Lua/performancefix_gui.lua b/Performance Fix/Lua/performancefix_gui.lua new file mode 100644 index 0000000..67b4b22 --- /dev/null +++ b/Performance Fix/Lua/performancefix_gui.lua @@ -0,0 +1,301 @@ +-- I'm sorry for the eyes of anyone looking at the GUI code. + +local MultiLineTextBox = dofile(PerformanceFix.Path .. "/Lua/MultiLineTextBox.lua") +local easySettings = dofile(PerformanceFix.Path .. "/Lua/easysettings.lua") + +Game.AddCommand("performancefix", "opens performance fix gui", function () + PerformanceFix.ToggleGUI() +end) + +local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent") + +local function CommaStringToTable(str) + local tbl = {} + + for word in string.gmatch(str, '([^,]+)') do + table.insert(tbl, word) + end + + return tbl +end + +local function ClearElements(guicomponent, removeItself) + local toRemove = {} + + for value in guicomponent.GetAllChildren() do + table.insert(toRemove, value) + end + + for index, value in pairs(toRemove) do + value.RemoveChild(value) + end + + if guicomponent.Parent and removeItself then + guicomponent.Parent.RemoveChild(guicomponent) + end +end + +local function GetAmountOfPrefab(prefabs) + local amount = 0 + for key, value in prefabs do + amount = amount + 1 + end + + return amount +end + +Hook.Add("stop", "PerformanceFix.CleanupGUI", function () + if selectedGUIText then + selectedGUIText.Parent.RemoveChild(selectedGUIText) + end + + if PerformanceFix.GUIFrame then + ClearElements(PerformanceFix.GUIFrame, true) + end +end) + +PerformanceFix.ShowGUI = function (frame) + PerformanceFix.GUIFrame = frame + + local config = easySettings.BasicList(frame) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Items: " .. tostring(#Item.ItemList), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Characters: " .. tostring(#Character.CharacterList), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Walls: " .. tostring(#Structure.WallList), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Submarines: " .. tostring(#Submarine.Loaded), nil, nil) + + local shadowCastingLights = 0 + local drawBehindSubLights = 0 + for key, value in pairs(Item.ItemList) do + local light = value.GetComponentString("LightComponent") + + if light and light.IsOn then + if light.CastShadows then shadowCastingLights = shadowCastingLights + 1 end + if light.DrawBehindSubs then drawBehindSubLights = drawBehindSubLights + 1 end + end + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Draw Behind Sub Lights: " .. tostring(shadowCastingLights), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Shadow Casting Lights: " .. tostring(drawBehindSubLights), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "", nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Item Prefabs Loaded: " .. tostring(GetAmountOfPrefab(ItemPrefab.Prefabs)), nil, nil) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Character Prefabs Loaded: " .. tostring(GetAmountOfPrefab(CharacterPrefab.Prefabs)), nil, nil) + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Submarines Loaded In Memory: " .. tostring(#SubmarineInfo.SavedSubmarines), nil, nil) + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Performance Fix Config", nil, nil, GUI.Alignment.Center) + + local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Save Config and Reload Client-Side Performance Fix", GUI.Alignment.Center, "GUIButtonSmall") + btn.OnClicked = function () + File.Write(PerformanceFix.Path .. "/config.json", json.serialize(PerformanceFix.Config)) + + dofile(PerformanceFix.Path .. "/Lua/performancefix.lua") + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Note: Server configurations require you to either restart or use the command reloadlua to change it. For dedicated servers you need to edit the file config.json, this GUI wont work.", nil, nil, GUI.Alignment.Center, true) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Timing Accumulator Max", nil, nil, GUI.Alignment.Center, true) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Lower values of Timing Accumulator Max means the game will more aggressively skip ticks, thus it can improve performance when your game is running really slowly. The games default is 250.", nil, nil, GUI.Alignment.Center, true) + + local accumulatorMax = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + accumulatorMax.MinValueInt = 1 + accumulatorMax.MaxValueInt = 1000 + accumulatorMax.valueStep = 10 + + if PerformanceFix.Config.accumulatorMax == nil then + accumulatorMax.IntValue = 250 + else + accumulatorMax.IntValue = PerformanceFix.Config.accumulatorMax + end + + accumulatorMax.OnValueChanged = function () + PerformanceFix.Config.accumulatorMax = accumulatorMax.IntValue + end + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client Map Entity Interval", nil, nil, GUI.Alignment.Center, true) + + local clientMapEntityUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + clientMapEntityUpdateInterval.MinValueInt = 1 + clientMapEntityUpdateInterval.MaxValueInt = 60 + + clientMapEntityUpdateInterval.IntValue = PerformanceFix.Config.clientMapEntityUpdateInterval + + clientMapEntityUpdateInterval.OnValueChanged = function () + PerformanceFix.Config.clientMapEntityUpdateInterval = clientMapEntityUpdateInterval.IntValue + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server Map Entity Interval", nil, nil, GUI.Alignment.Center, true) + + local serverMapEntityUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + serverMapEntityUpdateInterval.MinValueInt = 1 + serverMapEntityUpdateInterval.MaxValueInt = 60 + + serverMapEntityUpdateInterval.IntValue = PerformanceFix.Config.serverMapEntityUpdateInterval + + serverMapEntityUpdateInterval.OnValueChanged = function () + PerformanceFix.Config.serverMapEntityUpdateInterval = serverMapEntityUpdateInterval.IntValue + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Powered Update Interval (Client-Side only and only works on multiplayer)", nil, nil, GUI.Alignment.Center, true) + + local poweredUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + poweredUpdateInterval.MinValueInt = 1 + poweredUpdateInterval.MaxValueInt = 60 + + poweredUpdateInterval.IntValue = PerformanceFix.Config.poweredUpdateInterval or 1 + + poweredUpdateInterval.OnValueChanged = function () + PerformanceFix.Config.poweredUpdateInterval = poweredUpdateInterval.IntValue + end + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client High Priority Items", nil, nil, GUI.Alignment.Center, true) + + local clientHighPriorityItems = MultiLineTextBox(config.Content.RectTransform, "", 0.2) + + clientHighPriorityItems.Text = table.concat(PerformanceFix.Config.clientItemHighPriority, ",") + + clientHighPriorityItems.OnTextChangedDelegate = function (textBox) + PerformanceFix.Config.clientItemHighPriority = CommaStringToTable(textBox.Text) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server High Priority Items", nil, nil, GUI.Alignment.Center, true) + + local serverHighPriorityItems = MultiLineTextBox(config.Content.RectTransform, "", 0.2) + + serverHighPriorityItems.Text = table.concat(PerformanceFix.Config.serverItemHighPriority, ",") + + serverHighPriorityItems.OnTextChangedDelegate = function (textBox) + PerformanceFix.Config.serverItemHighPriority = CommaStringToTable(textBox.Text) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client High Priority Components", nil, nil, GUI.Alignment.Center, true) + + local clientHighPriorityComponents = MultiLineTextBox(config.Content.RectTransform, "", 0.2) + + clientHighPriorityComponents.Text = table.concat(PerformanceFix.Config.clientComponentPriority, ",") + + clientHighPriorityComponents.OnTextChangedDelegate = function (textBox) + PerformanceFix.Config.clientComponentPriority = CommaStringToTable(textBox.Text) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server High Priority Components", nil, nil, GUI.Alignment.Center, true) + + local serverHighPriorityComponents = MultiLineTextBox(config.Content.RectTransform, "", 0.2) + + serverHighPriorityComponents.Text = table.concat(PerformanceFix.Config.serverComponentPriority, ",") + + serverHighPriorityComponents.OnTextChangedDelegate = function (textBox) + PerformanceFix.Config.serverComponentPriority = CommaStringToTable(textBox.Text) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Character Update Config (Extra Experimental)", nil, nil, GUI.Alignment.Center, true) + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client Character Update Interval", nil, nil, GUI.Alignment.Center, true) + + local clientCharacterUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + clientCharacterUpdateInterval.MinValueInt = 1 + clientCharacterUpdateInterval.MaxValueInt = 60 + + clientCharacterUpdateInterval.IntValue = PerformanceFix.Config.clientCharacterUpdateInterval + + clientCharacterUpdateInterval.OnValueChanged = function () + PerformanceFix.Config.clientCharacterUpdateInterval = clientCharacterUpdateInterval.IntValue + end + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server Character Update Interval", nil, nil, GUI.Alignment.Center, true) + + local serverCharacterUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int) + + serverCharacterUpdateInterval.MinValueInt = 1 + serverCharacterUpdateInterval.MaxValueInt = 60 + + serverCharacterUpdateInterval.IntValue = PerformanceFix.Config.serverCharacterUpdateInterval + + serverCharacterUpdateInterval.OnValueChanged = function () + PerformanceFix.Config.serverCharacterUpdateInterval = serverCharacterUpdateInterval.IntValue + end + + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "High Priority Characters", nil, nil, GUI.Alignment.Center, true) + + local highPriorityCharacters = MultiLineTextBox(config.Content.RectTransform, "", 0.2) + + highPriorityCharacters.Text = table.concat(PerformanceFix.Config.highPriorityCharacters, ",") + + highPriorityCharacters.OnTextChangedDelegate = function (textBox) + PerformanceFix.Config.highPriorityCharacters = CommaStringToTable(textBox.Text) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "WARNING: THE BELOW CONFIGS ARE PERMANENT FOR SINGLEPLAYER AND IN MULTIPLAYER ARE REVERSIBLE BY RESTARTING THE ROUND.", nil, nil, GUI.Alignment.Center, true) + + + local singleplayerPermanent = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Allow Permanent Configs In Singleplayer") + + singleplayerPermanent.Selected = PerformanceFix.Config.allowSingleplayerPermanentConfigs or false + + singleplayerPermanent.OnSelected = function () + PerformanceFix.Config.allowSingleplayerPermanentConfigs = singleplayerPermanent.State == GUIComponent.ComponentState.Selected + end + + + local shadowCasting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Disable Shadow Casting Lights") + + shadowCasting.Selected = PerformanceFix.Config.disableShadowCastingLights + + shadowCasting.OnSelected = function () + PerformanceFix.Config.disableShadowCastingLights = shadowCasting.State == GUIComponent.ComponentState.Selected + end + + local drawBehindSub = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Disable Draw Behind Subs Lights") + + drawBehindSub.Selected = PerformanceFix.Config.disableDrawBehindSubsLights + + drawBehindSub.OnSelected = function () + PerformanceFix.Config.disableDrawBehindSubsLights = drawBehindSub.State == GUIComponent.ComponentState.Selected + end + + local hideInGameWires = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Hide In Game Wires") + + hideInGameWires.Selected = PerformanceFix.Config.hideInGameWires + + hideInGameWires.OnSelected = function () + PerformanceFix.Config.hideInGameWires = hideInGameWires.State == GUIComponent.ComponentState.Selected + end + + local hideInGameComponents = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Hide In Game Components") + + hideInGameComponents.Selected = PerformanceFix.Config.hideInGameComponents + + hideInGameComponents.OnSelected = function () + PerformanceFix.Config.hideInGameComponents = hideInGameComponents.State == GUIComponent.ComponentState.Selected + end +end + + +easySettings.AddMenu("Performance Fix", PerformanceFix.ShowGUI) + +PerformanceFix.ToggleGUI = function () + GUI.GUI.TogglePauseMenu() + + if GUI.GUI.PauseMenuOpen then + easySettings.Open("Performance Fix") + end +end \ No newline at end of file diff --git a/Performance Fix/config.json b/Performance Fix/config.json new file mode 100644 index 0000000..d593986 --- /dev/null +++ b/Performance Fix/config.json @@ -0,0 +1 @@ +{"accumulatorMax":150,"clientMapEntityUpdateInterval":4,"serverMapEntityUpdateInterval":1,"clientCharacterUpdateInterval":1,"serverCharacterUpdateInterval":1,"poweredUpdateInterval":1,"clientItemHighPriority":["door","doorwbuttons","windoweddoorwbuttons","windoweddoor","hatchwbuttons","sonartransducer","divingsuit","combatdivingsuit","abyssdivingsuit","pucs","slipsuit","battery","delaycomponent","acidmistemitter"],"serverItemHighPriority":["battery","delaycomponent","acidmistemitter"],"clientComponentPriority":["Engine","Pump","Sonar","Fabricator","Deconstructor","Reactor","Turret","Controller"],"serverComponentPriority":["Engine","Pump","Sonar","Fabricator","Deconstructor","Reactor","Turret","Controller"],"highPriorityCharacters":["Human"],"serverHighPriorityHands":true,"clientHighPriorityHands":true,"allowSingleplayerPermanentConfigs":false,"disableShadowCastingLights":false,"disableDrawBehindSubsLights":false,"hideInGameWires":false,"hideInGameComponents":false} \ No newline at end of file diff --git a/Performance Fix/filelist.xml b/Performance Fix/filelist.xml new file mode 100644 index 0000000..d6d5b21 --- /dev/null +++ b/Performance Fix/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Press R to Reload/Lua/Autorun/ReloadLua.lua b/Press R to Reload/Lua/Autorun/ReloadLua.lua deleted file mode 100644 index 1ce9dc0..0000000 --- a/Press R to Reload/Lua/Autorun/ReloadLua.lua +++ /dev/null @@ -1,466 +0,0 @@ -if SERVER then return end - -LuaUserData.RegisterType("Barotrauma.Items.Components.ItemContainer+SlotRestrictions") -LuaUserData.RegisterType('System.Collections.Immutable.ImmutableArray`1[[Barotrauma.Items.Components.ItemContainer+SlotRestrictions, Barotrauma]]') -LuaUserData.MakeFieldAccessible(Descriptors['Barotrauma.Items.Components.ItemContainer'], 'slotRestrictions') -LuaUserData.MakeFieldAccessible(Descriptors['Barotrauma.ItemInventory'], 'slots') -LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.CharacterInventory"], "slots") - - -- 配置重试参数 - local RETRY_CONFIG = { - INTERVAL = 0.3, -- 重试间隔(秒) - MAX_ATTEMPTS = 3, -- 最大尝试次数 - VALIDITY_DURATION = 5,-- 记录有效期(秒) - GENERATION_INTERVAL = 0.5 -- 分代时间间隔 - } - - -- 状态存储表 - local retryQueue = {} -- 结构: - -- { - -- [magID] = - -- { - -- generations = - -- { - -- [generationID] = { attempts, nextAttempt, expiry }, - -- ... - -- }, - -- mag = entityRef - -- }, - -- ... - -- } - -local function isSlotFull(slotRestriction, slot) - return slotRestriction.MaxStackSize - #slot.items -end - -local function tryPutItemsInInventory(character, hand, anotherhand, handInv, handIEnumerable, anotherhandIEnumerable) - - -- 重试队列管理 - local function addToRetryQueue(mag) - if not mag then return end - - local currentTime = Timer.GetTime() - local magID = mag.ID - - -- 生成分代ID(每0.5秒为一个分代) - local generationID = math.floor(currentTime / RETRY_CONFIG.GENERATION_INTERVAL) - - -- 初始化队列条目 - if not retryQueue[magID] then - retryQueue[magID] = { - mag = mag, - generations = {} - } - end - - -- 更新分代记录 - local entry = retryQueue[magID] - if not entry.generations[generationID] then - entry.generations[generationID] = { - attempts = 0, - nextAttempt = currentTime + RETRY_CONFIG.INTERVAL, - expiry = currentTime + RETRY_CONFIG.VALIDITY_DURATION - } - else - -- 延长该分代的过期时间 - entry.generations[generationID].expiry = currentTime + RETRY_CONFIG.VALIDITY_DURATION - end - - -- print(string.format("Added generation %d for %s", generationID, mag.Name)) - end - - if not handInv then return end - - local handInvSlots = handInv.slots - - local function getPlayerInvItemsWithoutHand() - local playerInvItems = character.Inventory.AllItemsMod - -- 去除双手持有的物品,避免在双持情况下互相抢弹药 - for i = #playerInvItems, 1, -1 do - local item = playerInvItems[i] - if (hand and item.ID == hand.ID) or (anotherhand and item.ID == anotherhand.ID) then - table.remove(playerInvItems, i) - end - end - return playerInvItems - end - - -- 内部堆叠实现(原tryStackMagzine拆分) - local function tryStackMagazineInternal(mag) - if not mag or mag.ConditionPercentage > 0 then - return false - end - - -- 原有堆叠逻辑 - local function tryStackInInventory(inventory, Mag) - local identifier = Mag.Prefab.Identifier - for i, slot in ipairs(inventory.slots) do - for _, item in ipairs(slot.items) do - if item.HasTag("weapon") then goto continue end - if item.Prefab.Identifier.Equals(identifier) and item.ConditionPercentage == 0 and item.ID ~= Mag.ID then -- 只有空弹匣可堆叠 - if inventory.CanBePutInSlot(Mag, i-1) then - inventory.TryPutItem(Mag, i-1, false, true, nil) - return true - end - end - ::continue:: - end - end - return false - end - - -- 尝试玩家库存 - if tryStackInInventory(character.Inventory, mag) then - return true - end - - -- 尝试子容器 - for item in getPlayerInvItemsWithoutHand() do - if item.OwnInventory and tryStackInInventory(item.OwnInventory, mag) then - return true - end - end - - return false - end - - -- 外部入口函数(替换原tryStackMagzine) - local function tryStackMagzine(mag) - if not mag then return false end - - -- 立即尝试 - local success = tryStackMagazineInternal(mag) - - -- 失败时加入队列 - if not success then - -- 防止重复添加 - addToRetryQueue(mag) - end - - return success - end - - -- -- 堆叠弹匣 - -- local function tryStackMagzine(Mag) - -- if Mag == nil or Mag.ConditionPercentage ~= 0 then return false end - -- local function tryStackInInventory(inventory, Mag) - -- local identifier = Mag.Prefab.Identifier - -- for i, slot in ipairs(inventory.slots) do - -- for _, item in ipairs(slot.items) do - -- if item.HasTag("weapon") then goto continue end - -- if item.Prefab.Identifier.Equals(identifier) and item.ConditionPercentage == 0 and item.ID ~= Mag.ID then -- 只有空弹匣可堆叠 - -- if inventory.TryPutItem(Mag, i-1, false, true, nil) then - -- return true - -- end - -- end - -- ::continue:: - -- end - -- end - -- return false - -- end - - -- -- 尝试将弹匣堆叠到玩家物品栏1-10 - -- if tryStackInInventory(character.Inventory, Mag) then - -- return true - -- end - - -- -- 尝试将弹匣堆叠到玩家背包、衣服等子物品栏 - -- for item in getPlayerInvItemsWithoutHand() do - -- if item.OwnInventory then - -- if tryStackInInventory(item.OwnInventory, Mag) then - -- return true - -- end - -- end - -- end - -- return false - -- end - - -- 卸载弹匣 - local function unloadMag(index) - local unloadedMag = handInvSlots[index].items[1] - - -- 尝试堆叠弹匣 - if tryStackMagzine(unloadedMag) then return true end - - local slots = character.Inventory.slots - -- 如果都失败了,优先尝试将弹匣放入玩家背包、衣服子物品栏 - for i = #slots, 1, -1 do - if i == 4 or i == 5 or i == 8 then - if character.Inventory.TryPutItem(unloadedMag, i-1, false, true, nil) then - return true - end - end - end - - -- 然后尝试将弹匣放入玩家物品栏1-10 - for i = #slots, 1, -1 do - if i <= 8 or i == 19 then goto continue end - if character.Inventory.CanBePutInSlot(unloadedMag, i-1) then - character.Inventory.TryPutItem(unloadedMag, i-1, false, false, nil) - return true - end - ::continue:: - end - - -- 保底情况,将弹匣丢到地面,暂时视为false,目前bool未使用 - unloadedMag.Drop(character, true, true) - return false - end - - -- 根据 index 构建一个含有所有可用的弹药/弹匣的 table,参数 num 是要寻找的数量 - local function findAvailableItemInPlayerInv(index, num) - local itemTable = {} - - for item in getPlayerInvItemsWithoutHand() do - local count = 0 - - -- 忽略掉所有带武器标签的物品,避免从其他武器中抢弹药 - if item.HasTag("weapon") then goto continue end - if handInv.CanBePutInSlot(item, index) and item.ConditionPercentage > 0 then - if itemTable[item.Prefab.Identifier.value] == nil then itemTable[item.Prefab.Identifier.value] = {} end - - table.insert(itemTable[item.Prefab.Identifier.value], item) - count = count + 1 - if count >= num then break end - end - if item.OwnInventory then - for item2 in item.OwnInventory.AllItemsMod do - if handInv.CanBePutInSlot(item2, index) and item2.ConditionPercentage > 0 then - if itemTable[item2.Prefab.Identifier.value] == nil then itemTable[item2.Prefab.Identifier.value] = {} end - - table.insert(itemTable[item2.Prefab.Identifier.value], item2) - count = count + 1 - if count >= num then break end - end - end - end - ::continue:: - end - - local maxLength = 0 - local maxElement = {} - for identifier, items in pairs(itemTable) do - if #items > maxLength then - maxLength = #items - maxElement = itemTable[identifier] - end - end - - return maxElement - end - - -- 根据 index 寻找可用的弹匣,但不要装入unloadedMag - local function findAvailableMagInPlayerInv(index, unloadedMag) - for item in getPlayerInvItemsWithoutHand() do - -- 忽略掉所有带武器标签的物品,避免从其他武器中抢弹药 - if item.HasTag("weapon") then goto continue end - if item and item.ID ~= unloadedMag.ID and handInv.CanBePutInSlot(item, index) and item.ConditionPercentage > 0 then - return item - end - if item.OwnInventory then - for item2 in item.OwnInventory.AllItemsMod do - if item2 and item2.ID ~= unloadedMag.ID and handInv.CanBePutInSlot(item2, index) and item2.ConditionPercentage > 0 then - return item2 - end - end - end - ::continue:: - end - return nil - end - - -- 根据 identifier 构建一个含有所有可用的弹药/弹匣的 table,参数 num 是要寻找的数量 - local function findAvailableItemWithIdentifier(identifier, num) - local findTable = {} - local count = 0 - for item in getPlayerInvItemsWithoutHand() do - -- 忽略掉所有带武器标签的物品,避免从其他武器中抢弹药 - if item.HasTag("weapon") then goto continue end - - if item.Prefab.Identifier.Equals(identifier) then - table.insert(findTable, item) - count = count + 1 - if count >= num then - return findTable - end - end - if item.OwnInventory then - for item2 in item.OwnInventory.AllItemsMod do - if item2.Prefab.Identifier.Equals(identifier) then - table.insert(findTable, item2) - count = count + 1 - if count >= num then - return findTable - end - end - end - end - ::continue:: - end - return findTable - end - - -- 根据 identifier 返回一个可用于堆叠已有弹匣的物品 - local function findAvailableForStackingInPlayerInv(identifier) - local itemList = {} - for item in getPlayerInvItemsWithoutHand() do - if item.HasTag("weapon") then goto continue end - if item.Prefab.Identifier.Equals(identifier) and item.ConditionPercentage > 0 then - table.insert(itemList, item) - end - if item.OwnInventory then - for item2 in item.OwnInventory.AllItemsMod do - if item2.Prefab.Identifier.Equals(identifier) and item2.ConditionPercentage > 0 then - table.insert(itemList, item2) - end - end - end - ::continue:: - end - -- 对 itemList 依照 ConditionPercentage 进行升序排序 - table.sort(itemList, function(a, b) return a.ConditionPercentage < b.ConditionPercentage end) - - return itemList - end - - local function putItem(item, index, isForStacking, isForSplitting) - if item == nil or item.ConditionPercentage == 0 or item == hand or item == anotherhand then return end - if not handInv.TryPutItem(item, index, isForStacking, isForSplitting, character, true, true) - then return false end -- 如果上弹失败,则返回false - return true - end - - -- 对枪械中每个 SlotRestriction 进行处理 - local itemContainer = handInv.Container - local i = math.max(itemContainer.ContainedStateIndicatorSlot + 1, 1) -- 准确定位弹匣的slot - local handInvSlotRestriction = itemContainer.slotRestrictions[i-1] - -- 空物品情况 - if #handInvSlots[i].items == 0 then - for _, item in ipairs(findAvailableItemInPlayerInv(i - 1, isSlotFull(handInvSlotRestriction, handInvSlots[i]))) do - putItem(item, i - 1, false, false) - end - -- 已有可堆叠弹药的情况 - elseif #handInvSlots[i].items > 0 and isSlotFull(handInvSlotRestriction, handInvSlots[i]) > 0 then - for _, item in ipairs(findAvailableItemWithIdentifier(handInvSlots[i].items[1].Prefab.Identifier, isSlotFull(handInvSlotRestriction, handInvSlots[i]))) do - putItem(item, i - 1, false, false) - end - end - -- 已有弹匣的情况 - if isSlotFull(handInvSlotRestriction, handInvSlots[i]) == 0 and #handInvSlots[i].items == 1 and handInvSlots[i].items[1].ConditionPercentage ~= 100 then - local itemlist = findAvailableForStackingInPlayerInv(handInvSlots[i].items[1].Prefab.Identifier) - local item = itemlist[1] - if (#itemlist == 1 and handInvSlots[i].items[1].ConditionPercentage == 0) or (item and item.ConditionPercentage ~=100 and handInvSlots[i].items[1].ConditionPercentage == 0) then --特殊情况,只剩一个弹匣下处理堆叠问题 - unloadMag(i) - putItem(item, i - 1, true, true) - end - if not putItem(item, i - 1, true, true) then -- 如果上弹失败,卸载弹匣 - local unloadedMag = handInvSlots[i].items[1] - unloadMag(i) - -- 如果此时双手武器未装备,重新装备武器 - local currentHand = character.Inventory.GetItemInLimbSlot(handIEnumerable[1]) - local currentAnotherHand = character.Inventory.GetItemInLimbSlot(anotherhandIEnumerable[1]) - if (currentHand == hand and currentAnotherHand == anotherhand) ~= true then - if hand and anotherhand and hand.ID == anotherhand.ID then -- 如果为双手武器 - for _, handSlotType in ipairs { InvSlotType.LeftHand, InvSlotType.RightHand } do - local handSlotIndex = character.Inventory.FindLimbSlot(handSlotType) - if handSlotIndex >= 0 then - character.Inventory.TryPutItem(hand, handSlotIndex, true, false, character, true, true) - end - end - else -- 如果为单手武器或者双持武器 - character.Inventory.TryPutItem(hand, character, handIEnumerable, true, true) - character.Inventory.TryPutItem(anotherhand, character, anotherhandIEnumerable, true, true) - end - end - local findMag = findAvailableMagInPlayerInv(i - 1, unloadedMag) - if #itemlist == 0 and unloadedMag.ConditionPercentage > 0 and findMag == nil then - putItem(unloadedMag, i - 1, false, false) - else - putItem(findMag, i - 1, false, false) - end - end - tryStackMagzine(item) -- 尝试堆叠空弹匣 - end - - -- 注册每帧检查,在多人游戏对tryStackMagazine进行重试 - Hook.Add("think", "magazineRetrySystem", function() - if not retryQueue then return end - local currentTime = Timer.GetTime() - - -- 遍历所有条目 - for magID, entry in pairs(retryQueue) do - local mag = entry.mag - local hasValidGenerations = false - - -- 实体有效性检查 - if not mag or mag.ID ~= magID then - retryQueue[magID] = nil - goto continue - end - - for genID, genRecord in pairs(entry.generations) do - -- 清理过期分代 - if currentTime > genRecord.expiry then - entry.generations[genID] = nil - -- print("Generation expired:", genID) - goto next_generation - end - - -- 执行重试条件检查 - if currentTime >= genRecord.nextAttempt then - -- 执行重试 - local success = tryStackMagazineInternal(mag) - - if success then - -- 成功时清除全部分代 - retryQueue[magID] = nil - -- print("Success via generation:", genID) - goto continue - else - -- 更新重试状态 - genRecord.attempts = genRecord.attempts + 1 - genRecord.nextAttempt = currentTime + RETRY_CONFIG.INTERVAL - - -- 超过最大尝试次数 - if genRecord.attempts >= RETRY_CONFIG.MAX_ATTEMPTS then - entry.generations[genID] = nil - -- print("Max attempts for generation:", genID) - end - end - end - - hasValidGenerations = true - ::next_generation:: - end - - -- 清理空条目 - if not hasValidGenerations then - retryQueue[magID] = nil - end - - ::continue:: - end - end) -end - -Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) - if retryQueue == nil then Hook.Remove("think", "magazineRetrySystem") end - if not PlayerInput.KeyHit(Keys.R) then return end - local Character = instance - if not Character then return end - - local rightHand = Character.Inventory.GetItemInLimbSlot(InvSlotType.RightHand) - local leftHand = Character.Inventory.GetItemInLimbSlot(InvSlotType.LeftHand) - local rightHandIEnumerable = {InvSlotType.RightHand} - local leftHandIEnumerable = {InvSlotType.LeftHand} - - if not rightHand and not leftHand then return end - - if rightHand and rightHand.HasTag("weapon") then - tryPutItemsInInventory(Character, rightHand, leftHand, rightHand.OwnInventory, rightHandIEnumerable, leftHandIEnumerable) - end - - if leftHand and not leftHand.Equals(rightHand) and leftHand.HasTag("weapon") then - tryPutItemsInInventory(Character, leftHand, rightHand, leftHand.OwnInventory, leftHandIEnumerable, rightHandIEnumerable) - end -end, Hook.HookMethodType.After) diff --git a/Press R to Reload/PressRtoReload.png b/Press R to Reload/PressRtoReload.png deleted file mode 100644 index 40a17f2..0000000 --- a/Press R to Reload/PressRtoReload.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7cbe3c1f9d524fad4ae2f22246159e984ee832371f9016cc95375ddf86c4448 -size 26231 diff --git a/Press R to Reload/Reload.code-workspace b/Press R to Reload/Reload.code-workspace deleted file mode 100644 index eece102..0000000 --- a/Press R to Reload/Reload.code-workspace +++ /dev/null @@ -1,41 +0,0 @@ -{ - "folders": [ - { - "path": "." - }, - ], - "settings": { - "Lua.diagnostics.libraryFiles": "Enable", - "Lua.workspace.library": [ - "D:/Projects/Barotrauma/types/client", - "D:/Projects/Barotrauma/types/shared", - ], - - "Lua.diagnostics.disable": [ - "param-type-mismatch", - "return-type-mismatch", - "undefined-field", - "need-check-nil", - "assign-type-mismatch", - "redundant-return-value", - "missing-parameter", - "undefined-global", - "missing-return-value", - "undefined-doc-name", - "missing-return", - "cast-local-type", - "deprecated", - ], - }, - "launch": { - "version": "0.2.0", - "configurations": [ - { - "name": "MoonSharp Attach", - "type": "moonsharp-debug", - "request": "attach", - "debugServer" : 41912 - } - ] - } -} \ No newline at end of file diff --git a/Press R to Reload/filelist.xml b/Press R to Reload/filelist.xml deleted file mode 100644 index 1f8780b..0000000 --- a/Press R to Reload/filelist.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/Real Sonar/Icons/Afflictions.png b/Real Sonar/Icons/Afflictions.png new file mode 100644 index 0000000..56f5fee --- /dev/null +++ b/Real Sonar/Icons/Afflictions.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc2c2505a5b47b55d85f88e2a6ccad548d2d597070133d99750545988a9fa5a3 +size 351336 diff --git a/Real Sonar/Icons/Anechoic_DivingSuit_Items.png b/Real Sonar/Icons/Anechoic_DivingSuit_Items.png new file mode 100644 index 0000000..60c3924 --- /dev/null +++ b/Real Sonar/Icons/Anechoic_DivingSuit_Items.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a54fbe59eeb9ff6d67b0bd88c0d28b689e6ab95fd8cd4a81e1f46bb6bc4cdeb +size 91103 diff --git a/Real Sonar/Icons/BrainHemorrhageOverlay.png b/Real Sonar/Icons/BrainHemorrhageOverlay.png new file mode 100644 index 0000000..a79417e --- /dev/null +++ b/Real Sonar/Icons/BrainHemorrhageOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f4dcb1ef865ac0625bee60125735ed4c7e384e8fb48eb5d9f2576e8178d24a7 +size 1450916 diff --git a/Real Sonar/Icons/MannaOverlay.png b/Real Sonar/Icons/MannaOverlay.png new file mode 100644 index 0000000..a05d493 --- /dev/null +++ b/Real Sonar/Icons/MannaOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a8bd7012ad9c8770af0b290b978dae866f3a02607f314b896865cbc46b24d45 +size 1015239 diff --git a/Real Sonar/Icons/MyodesopsiasOverlay.png b/Real Sonar/Icons/MyodesopsiasOverlay.png new file mode 100644 index 0000000..5460702 --- /dev/null +++ b/Real Sonar/Icons/MyodesopsiasOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad8f065faf2e678efe9d5045b9f4863ecbd22cf87f643fe4c0c3994731e0c1b8 +size 214872 diff --git a/Real Sonar/Icons/PeripheralOrbOverlay.png b/Real Sonar/Icons/PeripheralOrbOverlay.png new file mode 100644 index 0000000..6e38220 --- /dev/null +++ b/Real Sonar/Icons/PeripheralOrbOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2cfb4bc879f1312cbc6edbaedf18a2b50d23b74c8beba431b8d879be072a9ab +size 123635 diff --git a/Real Sonar/Icons/PhotopsiaOverlay1.png b/Real Sonar/Icons/PhotopsiaOverlay1.png new file mode 100644 index 0000000..1fdb13c --- /dev/null +++ b/Real Sonar/Icons/PhotopsiaOverlay1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a62ad162287b93d9bb88d74c40ac952f4d211d5dff5cfa01145e8280a06ba2ef +size 571237 diff --git a/Real Sonar/Icons/PhotopsiaOverlay2.png b/Real Sonar/Icons/PhotopsiaOverlay2.png new file mode 100644 index 0000000..e97759b --- /dev/null +++ b/Real Sonar/Icons/PhotopsiaOverlay2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:072712bf7f5f5db79f18ea873d1afba61b171c85f9a321adb6ff5370ac9bc981 +size 499959 diff --git a/Real Sonar/Icons/PhotopsiaOverlay3.png b/Real Sonar/Icons/PhotopsiaOverlay3.png new file mode 100644 index 0000000..3b28e9f --- /dev/null +++ b/Real Sonar/Icons/PhotopsiaOverlay3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:891a1ffc2adcb43abc70d919a147cbe82f666f96bb34674e6c5c9d5f6d208615 +size 476714 diff --git a/Real Sonar/Icons/PhotopsiaOverlay4.png b/Real Sonar/Icons/PhotopsiaOverlay4.png new file mode 100644 index 0000000..53857d7 --- /dev/null +++ b/Real Sonar/Icons/PhotopsiaOverlay4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a179f740774ff739fad2941ff64237ec4522f65405c271756b9a5645b0121c0 +size 642807 diff --git a/Real Sonar/Icons/TallFlash1.png b/Real Sonar/Icons/TallFlash1.png new file mode 100644 index 0000000..5162f36 --- /dev/null +++ b/Real Sonar/Icons/TallFlash1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8375ad1fad1c53bb530a6fd73c1b332c2c58a8972b2ee8e9ac2e3cbe202d2e8 +size 429962 diff --git a/Real Sonar/Icons/TallFlash2.png b/Real Sonar/Icons/TallFlash2.png new file mode 100644 index 0000000..8141271 --- /dev/null +++ b/Real Sonar/Icons/TallFlash2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94f1eecc0e80aaf198fa66d3e3d218fa13a843a59ffd2bd19514634cf0040361 +size 312326 diff --git a/Real Sonar/Icons/TallFlash3.png b/Real Sonar/Icons/TallFlash3.png new file mode 100644 index 0000000..72dd724 --- /dev/null +++ b/Real Sonar/Icons/TallFlash3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ba3ba1c559c4c4a01dcdc9b09797676c3f8b18788b72e86fc1a22335657b480 +size 205618 diff --git a/Real Sonar/Icons/anechoic_DivingSuit.png b/Real Sonar/Icons/anechoic_DivingSuit.png new file mode 100644 index 0000000..ca47a85 --- /dev/null +++ b/Real Sonar/Icons/anechoic_DivingSuit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:395be2ddff21944c9d82632868bba8555945c0848cd5e327da2d54f5c9bf17b1 +size 108034 diff --git a/Real Sonar/Icons/anechoic_diving_suit_icon.png b/Real Sonar/Icons/anechoic_diving_suit_icon.png new file mode 100644 index 0000000..7c7f616 --- /dev/null +++ b/Real Sonar/Icons/anechoic_diving_suit_icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b5054a738a1e7843ae8bd851ce979ddd983347bfb6925b8a75ee432f9840493 +size 29538 diff --git a/Real Sonar/Icons/blindness.png b/Real Sonar/Icons/blindness.png new file mode 100644 index 0000000..98e8282 --- /dev/null +++ b/Real Sonar/Icons/blindness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1cc5ec7e23f871caebd52ed5c1497b71ccc90bbd2f1a4d7a3b4dc74ce790e75 +size 185632 diff --git a/Real Sonar/Icons/divinghelmetlight.png b/Real Sonar/Icons/divinghelmetlight.png new file mode 100644 index 0000000..9a95f32 --- /dev/null +++ b/Real Sonar/Icons/divinghelmetlight.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4295c85a4b7e5f0a80805c0bffff016a040a45afed422d8ceafb455a6ef97932 +size 127842 diff --git a/Real Sonar/Icons/divingsuitcontainerwindow.png b/Real Sonar/Icons/divingsuitcontainerwindow.png new file mode 100644 index 0000000..10fd6f1 --- /dev/null +++ b/Real Sonar/Icons/divingsuitcontainerwindow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a27491c94db65a185b97358b63d10099ac45325213fce8f301f4a46537f57ff1 +size 19259 diff --git a/Real Sonar/Icons/flicker.png b/Real Sonar/Icons/flicker.png new file mode 100644 index 0000000..0f32aba --- /dev/null +++ b/Real Sonar/Icons/flicker.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe507bf89a0153b4e9f65439f0c9ebb0082624da75c88a827a59eaef9a87af7b +size 493722 diff --git a/Real Sonar/Icons/headgear.png b/Real Sonar/Icons/headgear.png new file mode 100644 index 0000000..4103bb8 --- /dev/null +++ b/Real Sonar/Icons/headgear.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:426a0967a39e413c764640f5a12b3b861598c6cb1767484fad7aac28a6bc50ad +size 20890 diff --git a/Real Sonar/Icons/icon.jpg b/Real Sonar/Icons/icon.jpg new file mode 100644 index 0000000..b298a76 Binary files /dev/null and b/Real Sonar/Icons/icon.jpg differ diff --git a/Real Sonar/Icons/medicineIcons.png b/Real Sonar/Icons/medicineIcons.png new file mode 100644 index 0000000..d0a24d3 --- /dev/null +++ b/Real Sonar/Icons/medicineIcons.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cec75d5203bf1befea684db2df37beee2c146c416f053f12f45efb22fe4623d3 +size 17460 diff --git a/Real Sonar/Icons/medicines.png b/Real Sonar/Icons/medicines.png new file mode 100644 index 0000000..a19a187 --- /dev/null +++ b/Real Sonar/Icons/medicines.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7818ad938d050ca8854df935ffd745d38098c37e7d0b66b34312f5b23359238e +size 12915 diff --git a/Real Sonar/Icons/navRemote.png b/Real Sonar/Icons/navRemote.png new file mode 100644 index 0000000..a5332ef --- /dev/null +++ b/Real Sonar/Icons/navRemote.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cd972a77b75cfbb47a83152542567ff71451da7e1499d67f475e86329ce74ff +size 3869 diff --git a/Real Sonar/Icons/sonarImpact.png b/Real Sonar/Icons/sonarImpact.png new file mode 100644 index 0000000..9beaf1f --- /dev/null +++ b/Real Sonar/Icons/sonarImpact.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1344b2d179edbed9ead85c092e77654f225ac99a1ee8bc69a716e306ddeb0a5b +size 1344942 diff --git a/Real Sonar/Icons/sonarImpact2.png b/Real Sonar/Icons/sonarImpact2.png new file mode 100644 index 0000000..1ce7c84 --- /dev/null +++ b/Real Sonar/Icons/sonarImpact2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:658b9094124abccafef17960805958a45c2e58443959b1f18f0b3be713a5e3ee +size 2083755 diff --git a/Real Sonar/Icons/sonarImpact3.png b/Real Sonar/Icons/sonarImpact3.png new file mode 100644 index 0000000..ad076ce --- /dev/null +++ b/Real Sonar/Icons/sonarImpact3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7129ac8244fa271c77b9d03b93492b76c699451f30498fdd6810ea9862ab5663 +size 2036987 diff --git a/Real Sonar/Localisation/Conversations_English.xml b/Real Sonar/Localisation/Conversations_English.xml new file mode 100644 index 0000000..961fbdc --- /dev/null +++ b/Real Sonar/Localisation/Conversations_English.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_French.xml b/Real Sonar/Localisation/Conversations_French.xml new file mode 100644 index 0000000..9fb8d24 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_French.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_German.xml b/Real Sonar/Localisation/Conversations_German.xml new file mode 100644 index 0000000..b10b58e --- /dev/null +++ b/Real Sonar/Localisation/Conversations_German.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_Italian.xml b/Real Sonar/Localisation/Conversations_Italian.xml new file mode 100644 index 0000000..f00b053 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_Italian.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_Japanese.xml b/Real Sonar/Localisation/Conversations_Japanese.xml new file mode 100644 index 0000000..e6fa08f --- /dev/null +++ b/Real Sonar/Localisation/Conversations_Japanese.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_LatinAmericanSpanish.xml b/Real Sonar/Localisation/Conversations_LatinAmericanSpanish.xml new file mode 100644 index 0000000..84a8555 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_LatinAmericanSpanish.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_Polish.xml b/Real Sonar/Localisation/Conversations_Polish.xml new file mode 100644 index 0000000..2ebe820 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_Polish.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_Russian.xml b/Real Sonar/Localisation/Conversations_Russian.xml new file mode 100644 index 0000000..d800843 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_Russian.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Conversations_SimplifiedChinese.xml b/Real Sonar/Localisation/Conversations_SimplifiedChinese.xml new file mode 100644 index 0000000..776acb5 --- /dev/null +++ b/Real Sonar/Localisation/Conversations_SimplifiedChinese.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_BrazilianPortuguese.xml b/Real Sonar/Localisation/Info_BrazilianPortuguese.xml new file mode 100644 index 0000000..7155850 --- /dev/null +++ b/Real Sonar/Localisation/Info_BrazilianPortuguese.xml @@ -0,0 +1,175 @@ + + + A intensidade de um ping de sonar ativo é poderosa o suficiente para ferver a água ao redor dos transdutores. + Recomenda-se usar um traje de mergulho anecoico ao trabalhar perto de um submarino. Um traje de mergulho típico não o protegerá do sonar ativo. + O sonar ativo de um submarino pode atingir volumes de 235dB, o que é aproximadamente 724 vezes mais alto e 3,16 bilhões de vezes mais intenso que um motor a jato. + As ondas sonoras viajam quatro vezes mais longe na água. Sons de baixa frequência, como os pings do sonar ativo de um submarino, penetram ainda mais. + Quando o som se propaga da água para o ar, a intensidade é reduzida em 80dB (256 vezes mais silencioso). Isso, combinado com o casco anecoico de um submarino, mantém os submarinistas seguros do sonar ativo. + Os cascos dos submarinos são revestidos com placas anecoicas, placas de borracha contendo milhares de pequenos vazios, projetadas para absorver o sonar ativo e atenuar os sons emitidos de dentro do navio. + A curta distância, a intensidade de um ping de sonar ativo é suficiente para romper órgãos e causar hemorragia interna. + Certifique-se de que nenhum de seus companheiros de tripulação esteja fora da segurança do casco antes de ativar o sonar ativo. + Dentro das paredes de um submarino, a tripulação está protegida de seu sonar ativo. No entanto, essa proteção desaparece quando o casco é perfurado e a água entra. + Desligue o sonar ativo se o casco for perfurado. Seus engenheiros terão dificuldade em reparar o vazamento se seus tímpanos estiverem rompidos. + Tenha cuidado ao mergulhar perto de um submarino. Um único ping de sonar pode causar perda auditiva, danos nos tecidos e, em casos extremos, ruptura de órgãos e hemorragia cerebral. + Recomenda-se levar um traje de mergulho anecoico ao ativar estações de balizas. Embora não seja tão poderoso quanto o de um submarino, um ping de sonar de uma baliza ainda pode causar ferimentos graves. + Cortizida é a única maneira de salvar um paciente de uma hemorragia cerebral induzida por sonar. + O extrato de Maná pode temporariamente interromper a progressão de uma hemorragia cerebral induzida por sonar. Depois disso, a Cortizida é a única opção. + Não é recomendado administrar Extrato de Maná se o paciente já tiver vestígios dele em seu sistema. + Fique longe dos tanques de lastro quando o sonar ativo estiver ativado. As ondas sonoras podem se propagar facilmente através dos canos cheios de água. + Se não tratados, os danos por vibração do sonar ativo podem causar danos nos nervos e rabdomiólise nos músculos afetados. + Com os submarinos sendo um modo de vida em Europa, a medicina avançou para tratar lesões únicas relacionadas ao sonar. Enxertos inteligentes para órgãos perfurados, Cortizida para hemorragias cerebrais e Extrato de Maná para danos nos tecidos. + + Sonar de submarino + + Sonar de baliza + + Trauma acústico + Os tímpanos do paciente foram perfurados, causando sangramento e zumbido. + Seus ouvidos estão zumbindo e pingando sangue, você se sente tonto e confuso. + Morte otogênica + Você sangrou até a morte pelos ouvidos. + + Dano por vibração + O paciente está sofrendo de danos menores em seu sistema circulatório causados por intensas vibrações de sonar. + O paciente sofreu danos sérios em suas artérias, nervos e músculos. + O interior do paciente está em frangalhos. Há danos devastadores em suas artérias, nervos, músculos e ossos. + Você sente uma dor surda por todo o corpo. Sua pele está formigando como se tivesse alfinetes e agulhas. + Suas extremidades estão dormentes e você sente dores agudas do tamanho de agulhas por todo o corpo. + Você não consegue sentir seus membros. Tudo que você sente é uma dor excruciante, como se cada célula do seu corpo tivesse sido dilacerada. + Dano interno catastrófico + Seu interior foi dilacerado. + + Dano nervoso + Os nervos do paciente foram danificados por vibrações. Tarefas diárias são mais difíceis. + Suas mãos estão dormentes, sua falta de jeito faz você trabalhar com menos eficiência. + + Rabdomiólise + Os músculos do paciente começaram a se decompor e derramar na corrente sanguínea. + A maioria dos músculos do paciente necrosou e quantidades perigosas de proteínas estão derramando na corrente sanguínea. + Você se sente lento, suas pernas estão inchadas e doloridas. + Suas pernas parecem frágeis. Andar é quase impossível, e a dor é imensurável. + Falência renal + Seus músculos liberaram uma quantidade letal de proteínas na sua corrente sanguínea. + + Pulmão rompido + Os pulmões do paciente se romperam devido às vibrações do sonar. + Os pulmões do paciente foram dilacerados por vibrações extremas, levando à hipoxemia e alta probabilidade de asfixia. + Há uma dor aguda em seu peito. Respirar é mais difícil. + Você mal consegue respirar entre os acessos de tosse com sangue, cada inalação é acompanhada de agonia. + Afogou-se em seu próprio sangue + Você se afogou em seu próprio sangue devido a graves danos pulmonares. + + Hemorragia cerebral + O cérebro do paciente está sangrando devido à exposição ao sonar ativo. Felizmente, não parece estar piorando. + Grandes porções do cérebro do paciente derreteram em uma gosma. O cérebro está se afogando em seu próprio sangue, e está apenas piorando. + O cérebro do paciente foi derretido pelo sonar ativo. + Sua visão está embaçada e sua mente se sente nebulosa. + Você não consegue pensar. Você vê flashes e sente gosto de metal. Você quer gritar, mas não consegue. Você está perdendo o controle de todas as suas funções motoras, e a realidade está lentamente escorregando. + Morte cerebral + Seu cérebro foi derretido pelo sonar ativo. + + Influência do Maná + Este membro está sob a influência curativa do Extrato de Maná. + Você sente uma pressão suave e um calor reconfortante sob a pele. + + Overdose de Maná + O paciente tem uma quantidade perigosa de Maná em seu sangue. + Você se sente fantástico. + Morreu em êxtase + Você conseguiu, bem-vindo ao paraíso. + + Fotopsia + O paciente está experimentando anomalias visuais na forma de luzes piscando e flashes brilhantes. + As luzes parecem piscar, você está vendo coisas? Flashes de luz preenchem sua visão periférica. Algo definitivamente está errado. + + Ataxia + O cerebelo do paciente está comprometido, levando a espasmos musculares involuntários e coordenação terrível. + Seus músculos parecem ter vontade própria. Você continua cambaleando para frente sem aviso, e quando tenta andar, acaba voltando para onde começou. + + Afasia + O paciente sofreu danos na área de Broca do cérebro, tornando-o incapaz de falar em frases completas. + Você é incapaz de terminar frases básicas e tem extrema dificuldade em formar palavras, às vezes recorrendo a murmúrios incoerentes. + + Neurite óptica + O lobo occipital do paciente está gravemente danificado, cegando e desorientando periodicamente o paciente. + Sua visão é periodicamente encoberta pela escuridão. Será este o fim? + + Extrato de Maná + Líquido milagroso que funde hemoglobinas humanas com plasma alienígena para aproveitar a resiliência natural e as propriedades curativas dos habitantes subaquáticos de Europa. Usado para tratar danos internos no sistema muscular e nervoso, e é capaz de interromper temporariamente uma hemorragia cerebral. Deve-se notar que o uso repetido produz retornos diminutos e riscos de overdose. + Cortizida + Uma mistura potente de drogas para alívio da dor e da pressão com uma série de efeitos colaterais desagradáveis. Tipicamente injetada no crânio como último recurso para tratar uma hemorragia cerebral. + Aviso: Administrar em um ambiente cerebral saudável pode causar um aumento perigoso de pressão no crânio. + Enxerto Inteligente + Tecido conectivo geneticamente modificado que herda o DNA do paciente para estimular a regeneração de sistemas anatômicos complexos. Normalmente usado para reparar órgãos perfurados. + + Traje de Mergulho Anecoico + Um traje leve e furtivo projetado para absorver as ondas sonoras do sonar ativo com seu revestimento anecoico. Oferece proteção mínima contra danos e pode suportar pressões de até 6.000 metros. + Controle Remoto de Navegação + Um dispositivo portátil que pode ser usado para controlar remotamente o sonar e os motores do submarino. + + Configurações Reais do Sonar + Configurações de Volume + Volume do Ping no Ar + Volume do Ping na Água + Volume do Ping no Traje + Volume do Zumbido + Volume da Distorção + Configurações de Rede - Apenas Cliente (Requer "cl_reloadlua" no console) + Modo de Baixa Latência (Experimental) + Elimina o atraso causado por ping alto para o servidor. Pode causar bugs visuais ou dessincronização se o servidor tiver opções de configuração contrastantes. + Configurações de Jogabilidade - Apenas Anfitrião + Configurações de Jogabilidade + Alcance do Sonar (Apenas um jogador) + Dano do Sonar (Não linear) + Sonar do Submarino + Ativa a funcionalidade dos Terminais de Navegação. + Sonar de Baliza + Ativa a funcionalidade dos Monitores de Sonar. + Sonar da Nave + Ativa a funcionalidade dos Terminais da Nave. + Sonar Inimigo + Ativar pings de sonar de submarinos controlados por NPCs. + Sonar Personalizado + Ativa a funcionalidade para terminais personalizados. Desativar pode melhorar o desempenho. + Mirar Criaturas + Ativa o dano a todas as criaturas não humanas. + Mirar Jogadores + Ativa o dano aos jogadores. + Mirar Bots + Ativa o dano aos bots. + Detecção de Casco de Criaturas + Detecção precisa de impacto de sonar para criaturas. Desativar pode melhorar o desempenho. + Detecção de Casco Humano + Detecção precisa de impacto de sonar para humanos, por exemplo, você quer que os humanos sejam protegidos nos tanques de lastro? + Intensidade Visual do Impacto do Sonar + Penalidade de Velocidade de Movimento do Sonar + Outros Visuais (Hemorragia cerebral, cortizida, etc.):\nPadrão + Outros Visuais (Hemorragia cerebral, cortizida, etc.):\nReduzido + Outros Visuais (Hemorragia cerebral, cortizida, etc.):\nDesativado + Nomes de Jogadores Ignorados + IDs de Personagens Ignorados + Resistências do Traje de Mergulho + Terminais de Sonar + (Requer que a opção "Sonar Personalizado" esteja ativada) + Redefinir + Redefinir Tudo + Entrada Inválida + Fechar + + Preciso de equipamento de mergulho anecoico! + Preciso de um traje anecoico para fazer reparos com o sonar ligado! + Preciso encontrar um traje anecoico! + Não consigo encontrar um traje anecoico! Desligue o sonar! + Não há trajes anecoicos! Não vou entrar lá! + Não vou entrar lá até que o sonar esteja desligado! + Não tenho proteção! Desligue o sonar! + Não posso fazer reparos até que o sonar esteja desligado! + Desligue o sonar! + Meus ouvidos estão sangrando por causa desse maldito sonar! + Desligue o sonar! + Estou preso no sonar! + Jesus, esse sonar está alto! + Estou na água, desative o sonar! + Meu Deus, desative o sonar! + Alguém desligue o sonar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_CastilianSpanish.xml b/Real Sonar/Localisation/Info_CastilianSpanish.xml new file mode 100644 index 0000000..534c6aa --- /dev/null +++ b/Real Sonar/Localisation/Info_CastilianSpanish.xml @@ -0,0 +1,175 @@ + + + La intensidad de un ping de sónar activo es lo suficientemente potente como para hacer hervir el agua alrededor de los transductores. + Se recomienda usar un traje de buceo anecoico cuando se trabaja cerca de un submarino. Un traje de buceo típico no te protegerá del sónar activo. + El sónar activo de un submarino puede alcanzar volúmenes de 235dB, lo que es aproximadamente 724 veces más fuerte y 3,16 mil millones de veces más intenso que un motor a reacción. + Las ondas sonoras viajan cuatro veces más lejos en el agua. Los sonidos de baja frecuencia, como los pings del sónar activo de un submarino, penetran aún más. + Cuando el sonido se propaga del agua al aire, la intensidad se reduce en 80dB (256 veces más silencioso). Esto, combinado con el casco anecoico de un submarino, mantiene a los submarinistas a salvo del sónar activo. + Los cascos de los submarinos están recubiertos con baldosas anecoicas, baldosas de goma que contienen miles de pequeños vacíos, diseñadas para absorber el sónar activo y atenuar los sonidos emitidos desde el interior del buque. + A corta distancia, la intensidad de un ping de sónar activo es suficiente para romper órganos y causar hemorragias internas. + Asegúrate de que ninguno de tus compañeros de tripulación esté fuera de la seguridad del casco antes de activar el sónar activo. + Dentro de las paredes de un submarino, la tripulación está protegida de su sónar activo. Sin embargo, esa protección desaparece una vez que el casco se rompe y el agua entra. + Apaga el sónar activo si el casco se rompe. Tus ingenieros tendrán dificultades para reparar la fuga si sus tímpanos están rotos. + Ten cuidado al bucear cerca de un submarino. Un solo ping de sónar puede causar pérdida de audición, daño tisular y, en casos extremos, ruptura de órganos y hemorragia cerebral. + Se recomienda llevar un traje de buceo anecoico al activar estaciones de baliza. Aunque no tan potente como el de un submarino, un ping de sónar de una baliza aún puede causar lesiones graves. + La Cortizida es la única forma de salvar a un paciente de una hemorragia cerebral inducida por sónar. + El extracto de Maná puede detener temporalmente la progresión de una hemorragia cerebral inducida por sónar. Después de eso, la Cortizida es la única opción. + No se recomienda administrar Extracto de Maná si el paciente ya tiene rastros de él en su sistema. + Mantente alejado de los tanques de lastre cuando el sónar activo está activado. Las ondas sonoras pueden propagarse fácilmente a través de las tuberías llenas de agua. + Si no se trata, el daño por vibración del sónar activo puede causar daño nervioso y rabdomiólisis en los músculos afectados. + Con los submarinos siendo una forma de vida en Europa, la medicina ha avanzado para tratar lesiones únicas relacionadas con el sónar. Injertos inteligentes para órganos perforados, Cortizida para hemorragias cerebrales y Extracto de Maná para daño tisular. + + Sónar de submarino + + Sónar de baliza + + Trauma acústico + Los tímpanos del paciente han sido perforados, causando sangrado y tinnitus. + Tus oídos están zumbando y goteando sangre, te sientes mareado y confundido. + Muerte otogénica + Te desangraste por los oídos. + + Daño por vibración + El paciente está sufriendo daños menores en su sistema circulatorio causados por intensas vibraciones de sónar. + El paciente ha sufrido daños graves en sus arterias, nervios y músculos. + El interior del paciente está hecho jirones. Hay daños devastadores en sus arterias, nervios, músculos y huesos. + Sientes un dolor sordo por todo el cuerpo. Tu piel hormiguea como si tuvieras alfileres y agujas. + Tus extremidades están entumecidas y sientes dolores agudos del tamaño de una aguja por todo el cuerpo. + No puedes sentir tus extremidades. Todo lo que sientes es un dolor excruciante, como si cada célula de tu cuerpo hubiera sido destrozada. + Daño interno catastrófico + Tus órganos internos fueron destrozados. + + Daño nervioso + Los nervios del paciente han sido dañados por vibraciones. Las tareas diarias son más difíciles. + Tus manos se sienten entumecidas, tu torpeza hace que trabajes con menos eficiencia. + + Rabdomiólisis + Los músculos del paciente han comenzado a descomponerse y verterse en el torrente sanguíneo. + La mayoría de los músculos del paciente se han necrosado y cantidades peligrosas de proteínas se están vertiendo en el torrente sanguíneo. + Te sientes lento, tus piernas están hinchadas y adoloridas. + Tus piernas se sienten frágiles. Caminar es casi imposible, y el dolor es inconmensurable. + Fallo renal + Tus músculos liberaron una cantidad letal de proteínas en tu torrente sanguíneo. + + Pulmón perforado + Los pulmones del paciente se han roto por las vibraciones del sónar. + Los pulmones del paciente han sido destrozados por vibraciones extremas, llevando a hipoxemia y una alta probabilidad de asfixia. + Hay un dolor agudo en tu pecho. Respirar es más difícil. + Apenas puedes respirar entre ataques de tos con sangre, cada inhalación es una agonía. + Se ahogó en su propia sangre + Te ahogaste en tu propia sangre debido a un daño pulmonar severo. + + Hemorragia cerebral + El cerebro del paciente está sangrando por la exposición al sónar activo. Afortunadamente, no parece estar empeorando. + Grandes porciones del cerebro del paciente se han derretido en una masa. El cerebro se está ahogando en su propia sangre, y solo está empeorando. + El cerebro del paciente ha sido derretido por el sónar activo. + Tu visión está borrosa y tu mente se siente nublada. + No puedes pensar. Ves destellos y saboreas metal. Quieres gritar, pero no puedes. Estás perdiendo el control de todas tus funciones motoras, y la realidad se está desvaneciendo lentamente. + Muerte cerebral + Tu cerebro fue derretido por el sónar activo. + + Influencia del Maná + Esta extremidad está bajo la influencia curativa del Extracto de Maná. + Sientes una suave presión y un calor reconfortante bajo la piel. + + Sobredosis de Maná + El paciente tiene una cantidad peligrosa de Maná en su sangre. + Te sientes fantástico. + Murió en éxtasis + Lo lograste, bienvenido al cielo. + + Fotopsia + El paciente está experimentando anomalías visuales en forma de luces parpadeantes y destellos brillantes. + Las luces parecen parpadear, ¿estás viendo cosas? Destellos de luz llenan tu visión periférica. Algo definitivamente está mal. + + Ataxia + El cerebelo del paciente está dañado, lo que lleva a espasmos musculares involuntarios y una terrible coordinación. + Tus músculos parecen tener mente propia. Sigues tambaleándote hacia adelante sin previo aviso, y cuando intentas caminar, terminas de vuelta donde empezaste. + + Afasia + El paciente ha recibido daño en el área de Broca del cerebro, lo que le impide hablar en oraciones completas. + No puedes terminar oraciones básicas y tienes extrema dificultad para formar palabras, a veces recurriendo a murmullos incoherentes. + + Neuritis óptica + El lóbulo occipital del paciente está gravemente dañado, cegando y desorientando periódicamente al paciente. + Tu visión se nubla periódicamente con oscuridad. ¿Es este el final? + + Extracto de Maná + Líquido milagroso que fusiona hemoglobinas humanas con plasma alienígena para aprovechar la resiliencia natural y las propiedades curativas de los habitantes submarinos de Europa. Se utiliza para tratar daños internos en el sistema muscular y nervioso, y es capaz de detener temporalmente una hemorragia cerebral. Cabe señalar que el uso repetido produce rendimientos decrecientes y riesgo de sobredosis. + Cortizida + Una potente mezcla de fármacos para aliviar el dolor y la presión con una serie de efectos secundarios desagradables. Normalmente se inyecta en el cráneo como último recurso para tratar una hemorragia cerebral. + Advertencia: La administración en un entorno cerebral sano puede causar un peligroso aumento de la presión en el cráneo. + Injerto Inteligente + Tejido conectivo genéticamente modificado que hereda el ADN del paciente para estimular la regeneración de sistemas anatómicos complejos. Típicamente usado para reparar órganos perforados. + + Traje de Buceo Anecoico + Un traje ligero y sigiloso diseñado para absorber las ondas sonoras del sónar activo con su revestimiento anecoico. Ofrece una protección menor contra daños y puede soportar presiones de hasta 6.000 metros. + Control Remoto de Navegación + Un dispositivo portátil que se puede usar para controlar remotamente el sónar y los motores del submarino. + + Configuración Real del Sónar + Configuración de Volumen + Volumen del Ping en el Aire + Volumen del Ping en el Agua + Volumen del Ping del Traje + Volumen del Tinnitus + Volumen de la Distorsión + Configuración de Red - Solo Cliente (Requiere "cl_reloadlua" en la consola) + Modo de Baja Latencia (Experimental) + Elimina el retraso causado por el ping alto al servidor. Puede causar errores visuales o desincronización si el servidor tiene opciones de configuración contrastantes. + Configuración de Juego - Solo Anfitrión + Configuración de Juego + Alcance del Sónar (Solo un jugador) + Daño del Sónar (No lineal) + Sónar del Submarino + Habilita la funcionalidad de los Terminales de Navegación. + Sónar de Baliza + Habilita la funcionalidad de los Monitores de Sónar. + Sónar de la Lanzadera + Habilita la funcionalidad de los Terminales de la Lanzadera. + Sónar Enemigo + Activar los pings de sonar de submarinos controlados por NPCs. + Sónar Personalizado + Habilita la funcionalidad para terminales personalizados. Desactivarlo puede mejorar el rendimiento. + Objetivo Criaturas + Habilita el daño a todas las criaturas no humanas. + Objetivo Jugadores + Habilita el daño a los jugadores. + Objetivo Bots + Habilita el daño a los bots. + Detección de Casco de Criaturas + Detección precisa de impacto de sónar para criaturas. Desactivarlo puede mejorar el rendimiento. + Detección de Casco Humano + Detección precisa de impacto de sónar para humanos, por ejemplo, ¿quieres que los humanos estén protegidos en los tanques de lastre? + Intensidad Visual del Impacto del Sónar + Penalización de Velocidad de Movimiento del Sónar + Otros Visuales (Hemorragia cerebral, cortizida, etc.):\nEstándar + Otros Visuales (Hemorragia cerebral, cortizida, etc.):\nReducido + Otros Visuales (Hemorragia cerebral, cortizida, etc.):\nDesactivado + Nombres de Jugadores Ignorados + IDs de Personajes Ignorados + Resistencias del Traje de Buceo + Terminales de Sónar + (Requiere que la opción "Sónar Personalizado" esté activada) + Restablecer + Restablecer Todo + Entrada No Válida + Cerrar + + ¡Necesito equipo de buceo anecoico! + ¡Necesito un traje anecoico para hacer reparaciones con el sónar encendido! + ¡Necesito encontrar un traje anecoico! + ¡No puedo encontrar un traje anecoico! ¡Apaga el sónar! + ¡No hay trajes anecoicos! ¡No voy a entrar ahí! + ¡No voy a entrar ahí hasta que el sónar esté apagado! + ¡No tengo protección! ¡Apaga el sónar! + ¡No puedo hacer reparaciones hasta que el sónar esté apagado! + ¡Apaga el sónar! + ¡Mis oídos están sangrando por ese maldito sónar! + ¡Apaga el sónar! + ¡Estoy atrapado en el sónar! + ¡Jesús, ese sónar está muy alto! + ¡Estoy en el agua, desactiva el sónar! + ¡Oh Dios, desactiva el sónar! + ¡Que alguien apague el sónar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_English.xml b/Real Sonar/Localisation/Info_English.xml new file mode 100644 index 0000000..870a74b --- /dev/null +++ b/Real Sonar/Localisation/Info_English.xml @@ -0,0 +1,175 @@ + + + The intensity of an active sonar ping is powerful enough to boil the water around the transducers. + It's recommended to wear an anechoic diving suit when working around a submarine. A typical diving suit will not protect you from active sonar. + A submarine's active sonar can reach volumes of 235db, which is roughly 724x times louder, and 3.16 billion times the intensity of a jet engine. + Sound waves travel four times further in the water. Low-frequency sounds, like the pings from a submarine's active sonar, penetrate even further. + When sound propagates from water to air, the intensity is reduced by 80db (256x quieter). This, combined with the anechoic tiled hull of a submarine, keeps submariners safe from active sonar. + Submarine hulls are coated with anechoic tiles, rubber tiles containing thousands of tiny voids, designed to absorb active sonar and attenuate sounds emitted from inside the vessel. + At close range, the intensity of an active sonar ping is enough to rupture organs and cause internal hemorrhaging. + Make sure none of your crewmates are outside the safety of the hull before enabling active sonar. + Inside the walls of a submarine, the crew are shielded from their active sonar. However, that shielding disappears once the hull is breached and the water flows in. + Turn off active sonar if the hull is breached. Your engineers will have a hard time repairing the leak if their eardrums are ruptured. + Be careful when diving near a submarine. A single sonar ping can cause hearing loss, tissue damage, and in extreme cases, ruptured organs and brain hemorrhaging. + It's recommended to bring an anechoic diving suit when activating beacon stations. While not as powerful as a submarine's, a sonar ping from a beacon can still cause serious injury. + Cortizide is the only way to save a patient from a sonar-induced brain hemorrhage. + Manna extract can temporarily stop the progression of a sonar-induced brain hemorrhage. After that, Cortizide is the only option. + It's not recommended to administer Manna Extract if the patient already has traces of it in their system. + Stay away from the ballast tanks when active sonar is enabled. The sound waves can easily propagate through the water-filled pipes. + If left untreated, vibration damage from active sonar can cause nerve damage and rhabdomyolysis in affected muscles. + With submarines being a way of life in Europa, medicine has advanced to treat unique sonar related injuries. Smart grafts for perforated organs, cortizide for brain hemorrhages, and manna extract for tissue damage. + + Submarine sonar + + Beacon sonar + + Acoustic trauma + The patient's eardrums have been perforated, causing bleeding and tinnitus. + Your ears are ringing and dripping blood, you feel dizzy and confused. + Otogenic death + You bled to death through your ears. + + Vibration damage + The patient is suffering from minor damage to their circulatory system caused by intense sonar vibrations. + The patient has sustained serious damage to their arteries, nerves, and muscles. + The patient's insides are in tatters. There is devastating damage to their arteries, nerves, muscles, and bones. + You feel a dull pain all over your body. Your skin is tingling like you've got pins and needles. + Your extremities are numb and you feel needle sized sharp pains all over your body. + You can't feel your limbs. All you feel is excruciating pain, like every cell in your body has been torn apart. + Catastrophic internal damage + Your insides were torn apart. + + Nerve damage + The patient's nerves have been damaged by vibrations. Daily tasks are more difficult. + Your hands feel numb, your clumsiness causes you to work less efficiently. + + Rhabdomyolysis + The patient's muscles have begun to break down and spill into the bloodstream. + The majority of the patient's muscles have necrosed and dangerous amounts of proteins are spilling into the bloodstream. + You feel sluggish, your legs are swollen and aching. + Your legs feel frail. Walking is almost impossible, and the pain is immeasurable. + Kidney failure + Your muscles released a lethal amount of proteins into your bloodstream. + + Ruptured lung + The patient's lungs have ruptured from sonar vibrations. + The patient's lungs have been torn apart by extreme vibrations, leading to hypoxemia and a high probability of asphyxiation. + There's a sharp pain in your chest. Breathing is more difficult. + You can barely breathe between coughing up blood, every inhale is met with agony. + Drowned in their own blood + You drowned in your own blood due to severe lung damage. + + Brain hemorrhage + The patient's brain is bleeding from exposure to active sonar. Luckily it doesn't seem to be getting any worse. + Large portions of the patient's cerebrum have melted into sludge. The brain is drowning in its own blood, and it's only getting worse. + The patient's brain has been melted by active sonar. + Your vision is blurred and your mind feels foggy. + You can't think. You see flashes and taste metal. You want to scream, but you can't. You're losing control of all your motor functions, and reality is slowly slipping away. + Brain death + Your brain was melted by active sonar. + + Manna influence + This limb in under the healing influence of Manna Extract. + You feel a gentle pressure and comforting warmth beneath the skin. + + Manna overdose + The patient has a dangerous amount of Manna in their blood. + You feel fantastic. + Died in ecstasy + You made it, welcome to heaven. + + Photopsia + The patient is experiencing visual anomalies in the form of flickering lights and bright flashes. + The lights seem to flicker, are you seeing things? Flashes of light fill your peripheral vision. Something is definitely wrong. + + Ataxia + The patient's cerebellum is crippled, leading to involuntary muscle spasms and terrible coordination. + Your muscles seem to have a mind of their own. You keep lurching forward without warning, and when you try to walk, you end up back where you started. + + Aphasia + The patient has received damage to the Broca's area of the brain, rendering them unable to speak in complete sentences. + You're unable to finish basic sentences and have extreme difficulty forming words, sometimes resorting to incoherent mumblings. + + Optic neuritis + The patient's occipital lobe is badly damaged, periodically blinding and disorienting the patient. + Your vision is periodically clouded with darkness. Is this the end? + + Manna Extract + Miracle liquid that fuses human hemoglobins with alien plasma to harness the natural resilience and healing properties of Europa's underwater inhabitants. Used for treating internal damage to the muscular and nervous system, and is capable of temporarily stopping a brain hemorrhage. It should be noted that repeated use produces diminishing returns and risks overdose. + Cortizide + A potent mixture of pain and pressure-relieving drugs with a host of nasty side effects. Typically injected into the cranium as a last resort to treat a brain hemorrhage. +Warning: Administering into a healthy brain environment can cause a dangerous pressure buildup in the skull. + Smart Graft + Genetically engineered connective tissue that inherits the patient's DNA to stimulate the regeneration of complex anatomical systems. Typically used for repairing perforated organs. + + Anechoic Diving Suit + A stealthy, lightweight suit designed to absorb the sound waves of active sonar with its anechoic plating. It offers minor protection against damage and can withstand pressures of up to 6,000 meters. + Nav Remote + A handheld device that can be used to remotely control the submarine's sonar and engines. + + Real Sonar Settings + Volume Settings + Air Ping Volume + Water Ping Volume + Suit Ping Volume + Tinnitus Volume + Distortion Volume + Network Settings - Client Only (Requires "cl_reloadlua" in console) + Low Latency Mode (Experimental) + Eliminates delay caused by high ping to server. May cause visual bugs or desync if server has contrasting config options. + Gameplay Settings - Host Only + Gameplay Settings + Sonar Range (Single-player only) + Sonar Damage (Non-linear) + Submarine Sonar + Enable functionality of Navigation Terminals. + Beacon Sonar + Enable functionality of Sonar Monitors. + Shuttle Sonar + Enable functionality of Shuttle Terminals. + Enemy Sonar + Enable sonar pings from NPC-controlled submarines. + Custom Sonar + Enable functionality for custom terminals. Disabling may improve performance. + Target Creatures + Enable damage to all non-human creatures. + Target Players + Enable damage to players. + Target Bots + Enable damage to bots. + Creature Hull Detection + Accurate sonar hit detection for creatures. Disabling may improve performance. + Human Hull Detection + Accurate sonar hit detection for humans, e.g. Do you want humans to be protected in ballast tanks? + Sonar Impact Visual Intensity + Sonar Movement Speed Penalty + Other Visuals (Brain hemorrhage, cortizide, etc.):\nStandard + Other Visuals (Brain hemorrhage, cortizide, etc.):\nReduced + Other Visuals (Brain hemorrhage, cortizide, etc.):\nDisabled + Ignored Player Names + Ignored Character IDs + Diving Suit Resistances + Sonar Terminals + (Requires the "Custom Sonar" option to be enabled) + Reset + Reset All + Invalid Input + Close + + I need anechoic diving gear! + I need an anechoic suit to do repairs with the sonar on! + Need to find an anechoic suit! + I can't find an anechoic suit! Turn off the sonar! + There's no anechoic suits! I'm not going in there! + I'm not going in there until the sonar is off! + I don't have protection! Shut down the sonar! + I can't do repairs until the sonar is off! + Turn off the sonar! + My ears are bleeding from that damn sonar! + Shut off the sonar! + I'm caught in the sonar! + Jesus, that sonar is loud! + I'm in the water, disable the sonar! + Oh god, disable the sonar! + Someone turn off the sonar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_French.xml b/Real Sonar/Localisation/Info_French.xml new file mode 100644 index 0000000..f86c6e0 --- /dev/null +++ b/Real Sonar/Localisation/Info_French.xml @@ -0,0 +1,175 @@ + + + L'intensité d'une impulsion de sonar actif est suffisamment puissante pour faire bouillir l'eau autour du transducteur. + Il est recommandé de porter une combinaison anéchoïque lors de travaux autour du sous-marin. Une combinaison de plongée normale ne protège pas d'un sonar actif. + Le sonar actif d'un sous-marin peut atteindre un volume de 235 db, sois environs 724 fois plus fort et 3.16 milliard plus intense qu'un moteur d'avion. + Les ondes sonores vont quatre fois plus loin dans l'eau. Les sons de basse fréquence, comme les impulsions d'un sonar, vont encore plus loin. + Quand le son se propage de l'eau vers l'aire, son intensité est diminué de 80 db (soit 256 fois moins fort). Ceci, combiné aux propriétés anéchoïques de la coque du sous-marin, garde l'équipage en sécurité. + La coque des sous-marins est tapissée de plaques anéchoïques (plaques de caoutchouc contenant de nombreux pores) conçus pour absorber les impulsions d'un sonar et atténuer les sons émis depuis l'intérieur du vaisseau. + A courte portée, l'intensité d'un sonar actif est suffisante pour causer des dommages aux organes et provoquer des hémorragies internes. + Faites en sorte qu'aucun membre d'équipage se trouve hors du sous-marin avant de lancer le sonar actif. + Dans le vaisseau, l'équipage est protégé du sonar actif. Cependant cette protection disparait si la coque est perforée et que l'eau s'engouffre dans la brèche. + Désactivez le sonar actif si votre coque est percée. Vos ingénieurs aurons du mal à réparer la brèche si leurs tympans sont percés. + Soyez vigilant si vous nagez près du sous-marin. Une seule impulsion du sonar actif peut causer une perte d'audition, des dommages internes et, dans le pire des cas, des ruptures d'organes voir des hémorragies cérébrales. + Il est recommandé de porter une combinaison anéchoïque pour réparer une station balise. Même si elles ne sont pas aussi puissantes que les sonars des sous-marins, une seule impulsion de balise peut causer de sérieux dommages. + Les Corticoïdes sont le seul moyen de sauver un patient d'une hémorragie cérébrale. + L'Extrait de Manne peut temporairement endiguer la progression d'une hémorragie cérébrale provoqué par un sonar. Malheureusement, les Corticoïdes sont le seul traitement viable. + Il n'est pas recommandé d'administrer de l'Extrait de Manne à un patient qui en a déjà dans son système. + Restez hors des ballasts quand le sonar est actif. Les impulsion se propagent facilement dans les tubes remplis d'eau. + Si laissées sans traitement, les lésions de vibration due aux sonars peuvent causer des lésions nerveuses et des rhabdomyolyse dans les muscles affectés. + Les sous-marin occupant une grande parti de la vie sur Europa, la médecine s'est adapté pour pouvoir traiter les blessures uniques provoquées par les sonars. Des Greffons pour les organes perforés, des Corticoïdes pour les hémorragies cérébrales et de l'Extrait de Manne pour les lésions tissulaires. + + Sonar actif + + Sonar actif balise + + Trauma Acoustique + Les tympans du patient ont étés perforés, causant des saignements et des acouphènes. + Vos oreilles sifflent et saignent, vous vous sentez confus et étourdi. + Mort otogène + Vous avez saigné à mort de vos oreilles. + + Lésion de vibration + Le patient est atteint de légères lésions dans leur système circulatoire causées par les intenses vibrations d'un sonar. + Le patient présente de sérieux traumatismes au niveau de ses artères, ses muscles et ses nerfs. + Les organes du patient sont en lambeau. Des dommages catastrophiques sont observables sur ses artères, muscles, nerfs et os. + Vous ressentez de faibles douleurs dans votre corps. Votre peau vous picote légèrement. + Vos doigts sont engourdis et vous ressentez des douleurs cinglantes dans tout votre corps. + Vous ne sentez plus vos membres. Tout ce que vous ressentez est une douleur insupportable, comme si tout votre corps avait été réduit en charpie. + Dommages catastrophiques aux organes internes + Vos organes sont en lambeaux + + Lésion nerveuse + Le système nerveux du patient a été endommagé par des vibrations. Les tâches quotidiennes sont plus difficiles. + Vos mains sont engourdies. Votre maladresse vous fait travailler plus lentement. + + Rhabdomyolyse + Les muscles du patient commencent à se déliter dans le flux sanguin. + La majorité des muscles du patient sont nécrosés et des quantités léthales de protéines sont déversés dans les vaisseaux sanguins. + Vous vous sentez apathique, vos jambes sont gonflés et douloureuses. + Vos jambes sont faibles. Marcher est presque impossible et la douleur est impossible à supporter. + Insuffisance rénale + Vos muscles ont empoisonné votre sang + + Contusion pulmonaire + Les poumons du patient ont été perforés par les vibrations d'un sonar. + Les poumons du patient ont été déchirés par des vibrations extrêmes menant à l'apparition d'une hypoxémie et à de forts risques d'asphyxie. + Vous ressentes une forte douleur dans votre poitrine. Il vous est compliqué de respirer normalement. + Vous pouvez à peine respirer, chaque inspiration est une agonie. Vous toussez du sang. + Noyé dans son propre sang + Vous vous êtes noyé dans votre propre sang due à une lésion pulmonaire + + Hémorragie cérébrale + Le cerveau du patient saigne à cause d'une exposition à un sonar actif. Heureusement cela ne semble pas s'aggraver + Une grande parti de l'encéphale du patient a été réduit en bouillie. Son cerveau baigne dans son propre sang, et cela empire. + Le cerveau du patient a fondu sous l'effet d'un sonar actif. + Votre vision se trouble et votre esprit est embrumé. + Vous ne pouvez plus penser. Vous voyez des éclairs et vous sentez un gout de métal dans votre bouche. Vous ne pouvez plus crier. Vous perdez vos fonctions motrices et perdez lentement connaissance. + Mort cérébrale + Votre cerveau a été fondu par un sonar actif. + + Influence de manne + Ce membre est sous l'influence curative de l'Extrait de manne. + Vous ressentez une légère pression et chaleur sous votre peau. + + Overdose de manne + Le patient présente dans son sang des taux dangereux d'Extrait de manne. + Vous vous sentez comme un charme. + Mort en extase + Tu as réussi, bienvenue au paradis. + + Photopsie + Le patient témoigne d'anomalie visuelles sous la forme de lumières vacillantes ou de flash lumineux. + Les lumières vacillent, hallucinez-vous ? Des flashs lumineux englobent la périphérie de votre vision. Quelque-chose ne vas pas. + + Ataxie + Le patient présente des troubles cérébelleux, menant à des spasmes musculaires involontaire et à des troubles de la coordination. + Vos muscles semblent agir d'eux même. Vous titubez involontairement et, quand vous tentez de marcher, vous retournez à votre point de départ. + + Aphasie + Le patient présentes des lésion cérébrales dans l'Aire de Broca, l'empêchant de parler normalement. + Vous êtes incapables de dire des phrases simples et vous avez de grandes difficultés pour prononcer des mots, vous faisant marmonner. + + Névrite optique + Le lobe occipital du patient est gravement touché, désorientant et aveuglant le patient périodiquement. + Votre vision est parfois assombrie par les ténèbres. Est-ce la fin ? + + Extrait de manne + Une substance miracle qui permet la fusion de l'hémoglobine humaine au plasma alien pour manifester les propriétés régénératrices des habitant venant des profondeurs d'Europa. Utilisé pour traiter les lésions nerveuses et musculaires, il permet aussi de stopper temporairement une hémorragie cérébrale. L'utilisation répétée de ce produit conduit à une diminution de ses effets curatif et risque de mener à une overdose. + Corticoïdes + Un savant mélange d'antidouleur et d'anti-inflammatoires avec une foule d'effets secondaires. Normalement injecté dans le crâne en dernier recourt pour traiter une hémorragie cérébrale. +Attention: Injecter ce produit dans un corps saint peut causer une augmentation de la pression crânienne. + Greffon + Un tissus génétiquement modifié pour stimuler la régénération de systèmes anatomiques complexes chez le patient. Utilisé généralement pour réparer des organes perforés. + + Tenue pressurisée anéchoïque + Une tenue de plongée conçue pour absorber les ondes sonores avec ses plaques anéchoïques. Elle offre une protection modérée contre les dommages et peut résister à une pression maximale de 6.000 mètres. + Télécommande de navigation + Un appareil portable qui peut être utilisé pour contrôler à distance le sonar et les moteurs du sous-marin. + + Paramètres de Real Sonar + Paramètres de Volume + Volume d'Impulsion dans l'Air + Volume Impulsion dans l'Eau + Volume d'Impulsion dans Combinaison + Volume sous Acouphène + Volume sous Distorsion + Paramètres Réseau - Client Seul (Requiert "cl_reloadlua" dans la console) + Mode à Basse Latence (Experimental) + Elimine le délai causé par une latence élevée sur le serveur. Peut provoquer des désyncronisations a des oprions de configuration contradictoires. + Paramètres de Gameplay - Hôte Seul + Paramètres de Gameplay + Portée du Sonar (Jeux Solo seulement) + Dégats du Sonar (Non linéaire) + Sonar du Submersible + Active les dégâts du Terminal de Navigation. + Sonar de Balises + Active les dégâts du Sonar Portatif. + Sonar de Navette + Sonar Ennemi + Activer les signaux sonar des sous-marins contrôlés par des PNJ. + Activer les dégâts du Terminal de la Navette. + Sonar personnalisé + Activer les dégâts du terminal personnalisés. Le désactiver peut améliorer les performances du jeu. + Effet sur les Créatures + Active les dégats sur les Créatures non humaines. + Effet sur le Joueur + Effet sur les Bots + Active les dégâts sur les Joueurs. + Active les dégâts sur les bots. + Creature Hull Detection + Détection précise des dégâts du sonar pour les créatures. Le désactiver peut améliorer les performances du jeu. + Détection de la coque pour les humains + Détection précise des dégats du sonar pour les humain, e.g. Voulez-vous que les humains soient protégés dans les ballast ? + Intensité de l'Impact Visuel du Sonar + Pénalité de Mouvement due au Sonar + Autre Affichage (Brain hemorrhage, Corticoïdes, etc.):\nStandard + Autre Affichage (Lésion nerveuse, Corticoïdes, etc.):\nRéduits + Autre Affichage (Lésion nerveuse, Corticoïdes, etc.):\nDésactivés + Noms de Joueurs Ignorés + ID de personnage ignorés + Résistances des combinaisons de plongée + Terminals Sonar + (Requiert que l'option "Sonar personnalisé" soit activée) + Réinitialiser + Effacer tout + Entrée invalide + Fermer + + J'ai besoin d'une combinaison anéchoïque ! + J'ai besoin d'une tenue anéchoïque pour pouvoir réparer comme le sonar est allumé ! + Je dois trouver une combinaison anéchoïque ! + Je ne trouve pas de combinaison anéchoïque ! Eteignez le sonar ! + Pas de tenue anéchoïque ! Je vais pas aller là-dedans ! + Je ne vais pas là-dedans tant que le sonar n'est pas éteint ! + Je n'ai pas de protection ! Arrêtez le sonar ! + Je ne peux pas réparer ça si le sonar n'est pas éteint ! + Eteignez le sonar ! + Mes oreilles ! Elles saignent ! Satané sonar ! + Coupez le sonar ! + Je me prend le sonar là ! + Dieu que le sonar est fort ! + Je suis dans l'eau. etaignez le sonar ! + Mon dieux, éteignez le sonar ! + Que quelqu'un éteigne le sonar ! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_German.xml b/Real Sonar/Localisation/Info_German.xml new file mode 100644 index 0000000..1925fbd --- /dev/null +++ b/Real Sonar/Localisation/Info_German.xml @@ -0,0 +1,175 @@ + + + Die Intensität eines aktiven Sonartons ist stark genug, um Wasser um den Sender zum Kochen zu bringen. + Es ist empfohlen, einen anechoischen Taucheranzug in der Nähe des U-Boots zu tragen. Ein normaler Anzug wird dich nicht von dem Sonar beschützen. + Eine aktive Sonaranlage kann bis zu 235db erreichen, ungefähr 724-Mal lauter, und 3.16 Milliarde-Mal intensiver als ein Düsenjet. + Schallwellen bewegen sich im Wasser viermal so weit. Niedrigere Frequenzen, wie die Töne vom Sonar, können noch weiter sich bewegen. + Wenn Schall sich Wasser zur Luft reist, ist die Intensität um 80db (256-Mal) verringert. Dies, in Verbindung mit der Anechoischen Beschichtung des U-Boots, beschützt Besaztungsmitglieder besser vor dem aktivem Sonar. + U-Bootrümpfe sind mit Anechoischen Platten ausgerüstet, Gummiplatten mit Tausenden von kleinen Löchern, welche Sonartöne schwächen sollen. + Nah genug ist die Intensität von einem Sonarton genug, um Organrupturen und interne Blutungen auszulösen. + Sorge dafür, dass keine Besatzungsmitglieder außerhalb des Bootes sind, bevor Sonar aktiviert wird. + In dem U-boot ist die Crew von Sonartönen beschützt. Aber dieser Schutz funktioniert nicht, wenn der Rumpf geschädigt und geflutet ist. + Schalte das Sonar aus, wenn der Rumpf geschädigt wurde. Es ist schwer, Lecks zu reparieren, wenn man einen Ohrenschaden erleidet. + Gib acht, wenn du in der Nähe eines Schiffes tauchsts. Ein einziger Sonarton kann folgendes auslösen: Zellschäden, Gehörverlust, und in extremen Fällen, Organschäden und Gehirnblutungen. + Es ist empfohlen, einen Anechoischen Taucheranzug zu einer Sonarstation mitzunehmen. Auch wenn der Sonarton von dieser nicht so stark wie der des U-boots ist, ist er dennoch gefährlich. + Kortizid ist der einzigste Weg, einen Patienten von Sonar-bedintgen Gehirnschäden zu retten. + Mannaextrakt kann auf kurze Zeit den Fortschritt von Sonar-bedingten Gehirnschäden verlangsamen. Danach ist aber Kortizid die einzigste option. + Es wird nicht empfohlen, Mannaextrakt zu verabreichen, wenn der Patient noch welches im Kreislauf hat. + Halte dich von den Ballasttanks fern, während das Sonar aktiv ist. Der Schall kann leicht durch die wassergefüllten Rohre sich bewegen. + Ohne Behandlung erzeugt Vibrationsschaden von Sonar Nervenschäden und Rhabdomyolyse in den betroffenen Muskeln. + Wegen der Menge von U-booten auf Europa, hat die Medizin Methoden zur verartztung von Sonar-bedingten Verletzungen entwickelt. Smarttransplantate für Organschäden, Kortizid für Gehirnblutungen, und Mannaextrakt für Zellschäden. + + U-Boot-Sonar + + Beacon-Sonar + + Akustisches Trauma + Das Trommelfell des Patienten ist gerissen, was Tinitus und Blutungen erzeugt. + Deine Ohren klingeln, tropfen von Blut, und du fühlst dich verwirrt und schwindelig. + Otogener Tod + Du bist durch deine Ohren verblutet. + + Vibrationsschäden + Der Patient leidet an mildem Schaden zum Blutkreislauf, ausgelöst durch starke Sonartöne. + Der Patient hat schwere Schäden zu seinen Arterien, Nerven, und Muskeln erlitten. + Die Innereien das Patienten sind zerfetzt. Es gibt extremen Schaden zu dem Kreislauf, Nerven, Muskel, und Knochen. + Du fühlst einen leichten Schmerz über deinen ganzen Körper. Es wäre, als ob dein ganzer Körper eingeschlafen wäre. + Deine Gliedmaßen sind taub, und du fühlst stechenden Schmerz in deinem ganzem Körper. + Du kannst deine Gliedmaßen nicht mehr fühlen. Du fühlst dich, also ob etwas deine Zellen zerfetzt wurden. + Schwere interne Verletzungen + Deine Innerein wurden zerfetzt. + + Nervenschäden + Die Nerven des Patienten sind geschädigt. Alltägliche Aufgaben werden schwierig. + Deine Hände sind taub, und du kannst kaum ordentlich arbeiten. + + Rhabdomyolyse + Die Muskeln des Patienten haben angefangen, sich zu zersetzen und in den Blutkreis zu gelangen. + Ein Großteil der Muskeln das Patienten zersetzen sich. Eine gefährliche Menge Proteine gelangt in den Kreislauf. + Du fühlst dich Müde, deine Beine sind angeschwollen und tuhen weh. + Deine Beine sind schwach. Es ist fast unmöglich zu laufen, und der Schmerz ist unbeschreiblich. + Nierenversagen + Deine Muskeln haben tödliche Mengen and Proteinen in den Kreislauf ausgeschüttet. + + Lungenruptur + Die Lungen des Patienten sind wegen Sonartönen ruptiert. + Die Lungen des Patienten sind von Sonar auseinandergerissen worden. Hohe Warscheinlichkeit von Hypoxämie und Erstickung. + Es tut dir stark in der Brust weh. Atmen ist schwierig. + Du kannst kaum atmen, musst konstant Blut aufhusten, und jeder Atemzug tut Höllisch weh. + Am eigenem Blut ertrunken + Du bist wegen schwerer Lungenschäden an deinem Blut ertrunken. + + Gehirnblutung + Das Gehirn des Patienten blutet aufgrund von Sonartönen. Allerdings scheint es sich nicht zu verschlimmern. + Große teile des Gehirns sehen aus wie Matsch. Das gehirn ertrenkt am eigenem Blut, und es wird nur noch schlimmer. + Das Gehirn des Patienten wurde von aktivem Sonar zermatscht. + Dein Sichtfeld ist neblig und du Fühlst dich schlapp. + Du kannst kaum denken. Du siehst Blitze und schmeckst Metall. Du willst schreien, kannst aber nicht. Du verlierst Kontrolle von deinem Körper. Die Realität schwindet weiter und weiter. + Gehirntod + Dein Gehirn wurde vom Sonar Vermatscht. + + Mannaeinfluss + Dieses Glied wird von Mannaextract geheilt. + Du fühlst einen leichten Druck, sowie angenehme Wärme unter der Haut. + In Ekstase gestorben + Du hast es geschafft, willkommen im Himmel. + + Manna-Überdosis + Der Patient hat gefährliche Mengen Manna im Blut. + Du fühlst dich fantastisch. + + Photopsie + Der Patient meldet visuelle Anomalitäten, wie Blitze oder flackerndes Licht. + Das Licht flackert. Lichtblitze füllen dein Sichtfeld. Ist bei dir alles Ok? Etwas stimmt nicht. + + Ataxie + Das Kleinhirn des Patienten ist Geschädigt, was ungewollte Muskelbewegungen auslöst. + Deine Muskeln scheinen, ihren eigenen Sinn zu haben. Du bewegst dich unkontrolliert. Du veruschst zu gehen, aber landest dort, wo du warst. + + Aphasie + Das Brocal-Areal des Gehirns ist beschädigt, und der Patient kann keine Sätze bilden. + Du kannst nichtmal einfache Sätze zusammenfügen oder Wörter Aussprechen, und musst zu unverständlichem Murmeln greifen. + + Optsiche Neuritis + Der Occipitallappen ist beschädigt, was den Patienten zum unkontrolliertem erblinden und verlust des Orientierungssinnes führt. + Deine Sicht ist oft von Dunkelheit verdeckt. Ist das das ende? + + Mannaextraxt + Ein Heilmittel, was Menschliche Blutkörperchen mit Alienplasma verschmelzen lässt, um die natürliche Wiederstandsfähigkeit der Kreaturen Europas zu verwenden. Kann zur Heilung von Muskel- und Nervenschäden verwendet werden, und kann temporär Gehirnblutungen stoppen. Ofte Benutzung verringert die Heilfähigkeit und kann eine Überdosis auslösen. + Kortizid + Eine starke Mischung aus Drucksenkenden und Schmerzlindernden Medikamenten mit gefährlichen Nebenwirkungen. Wird oft als letze Option in das Gehirn Injitziert, um eine Gehirnblutung zu stoppen. +WARNUNG: Injitzierung in ein Gesundes Gehirn kann einen Druckaufbau im Schädel verursachen. + Smarttransplantat + Gentechnisch entwickelte Zellen, welche die DNS des Patienten kopieren, um komplexe anatomische System zur Heilung zu bringen. Oft bei perforierten Organen verwendet. + + Anechoischen Taucheranzug + Ein leicht gebaute Anzug, welcher dafür konzipiert wurde, mit Anechoischen Platten Sonarwellen abzuwehren. Bietet leichten Schutz und hat eine maximale Tiefe von 6,000 Metern. + Navigations-Fernbedienung + Ein tragbares Gerät, mit dem das Sonar und die Motoren des U-Bootes ferngesteuert werden können. + + Real-Sonar Einstellungen + Lautstärke-Einstellungen + Sonarecho-Lautstärke (Luft) + Sonarecho-Lautstärke (Wasser) + Sonarecho-Lautstärke (Anzug) + Tinitus-Lautstärke + Verzerrungs-Lautstärke + Netzwerkeinstellungen ("cl_reloadlua" in der Konsole nötig!) + Verminderte-Latenz-Modus (Experimentell) + Eliminiert Verzögerungen wegen hohem Ping. Kann Desynchronysierung herbeirufen, wenn der Server Gegenteilige Konfigurierungen besitzt. + Spieloptionen - (Host) + Gameplay-optionen + Sonar-distanz (Einzelspieler) + Sonarschaden (Nicht-linear) + U-Boots-sonar + Schaden von Navigationskonsolen aktivieren. + Sonar von Sonarbojen + Schaden von Sonarmonitoren aktivieren. + Shuttle-sonar + Schaden von Shuttle-Terminals aktivieren. + Feindliches-sonar + Sonarpings von NPC-gesteuerten U-Booten aktivieren. + Benutzerdefiniertes Sonar + Schaden von benutzerdefiniertes-terminals aktivieren. Dies auszuschalten kann die Spielleistung verbessern. + Kreaturen anviesieren + Schaden für nichtmenschliche Kreaturen aktivieren. + Spieler anvisieren + Bots anvisieren + Schaden für Spieler aktivieren. + Schaden für Bots aktivieren. + Kreaturen-Rumpf-erkennung + Akkurate Sonartreffer für Kreaturen. Dies auszuschalten kann die Spielleistung verbessern. + Menschen-Rumpf-Erkennung + Akkurate Sonartreffer für Menschen, D.h, willst du das Menschen z.b im Ballast-Tank sicher sind? + Sonar-Treffer-Effekt Intensivität + Geschwindigeits-verminderung bei Treffer + Diverse Effekte (Gehirnblutung, Kortizid etc.):\nÜblich + Diverse Effekte (Gehirnblutung, Kortizid etc.):\nReduziert + Diverse Effekte (Gehirnblutung, Kortizid etc.):\nDeaktiviert + Ignorierte Spielernamen + Ignorierte Zeichen-IDs + Widerstände von Tauchanzügen + Sonar-Terminals + (Erfordert die Aktivierung der Option "Benutzerdefiniertes Sonar") + Zurücksetzen + Alles zurücksetzen + Ungültige Eingabe + Schließen + + Ich brauche anechoische Taucherausrüstung! + Ich brauche einen anechoischen Taucheranzug, um trotz dem Sonar das Schiff zu reparieren! + Ich muss einen anechoischen Anzug finden! + Ich kann keinen Anzug finden! Schalte das Sonar aus! + Es gibt keine Schutzanzüge! Ich kann da nicht rein! + Ich gehe dort nicht rein, bis das Sonar aus ist! + Ich habe keinen Schutz! Mach das Sonar aus! + Ich kann das Schiff nicht reparieren, bis das Sonar aus ist! + Mach das Sonar aus! + Meine Ohren bluten vom scheiss Sonar! + Schalt das Sonar ab! + Ich bin im Sonarfeld! + Himmel, Arsch und Zwirn, ist das Sonar laut! + Ich bin im Wasser, mach das Sonar aus! + Herrgott nochmal, mach das aus! + Irgendwer, mach das aus! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Italian.xml b/Real Sonar/Localisation/Info_Italian.xml new file mode 100644 index 0000000..2f12cd9 --- /dev/null +++ b/Real Sonar/Localisation/Info_Italian.xml @@ -0,0 +1,175 @@ + + + L'intensità di un segnale sonar attivo è abbastanza potente da far bollire l'acqua attorno ai trasduttori. + Si consiglia di indossare una muta da sub anecoica quando si lavora intorno a un sottomarino. Una tipica muta da sub non ti proteggerà dal sonar attivo. + Il sonar attivo di un sottomarino può raggiungere volumi di 235 dB, che è circa 724 volte più forte e 3,16 miliardi di volte l'intensità di un motore a reazione. + Le onde sonore viaggiano quattro volte più lontano nell'acqua. I suoni a bassa frequenza, come i ping del sonar attivo di un sottomarino, penetrano ancora di più. + Quando il suono si propaga dall'acqua all'aria, l'intensità si riduce di 80 dB (256 volte più silenziosa). Questo, combinato con lo scafo piastrellato anecoico di un sottomarino, protegge il personale dal sonar attivo. + Gli scafi dei sottomarini sono rivestiti con piastrelle anecoiche, piastrelle di gomma contenenti migliaia di minuscoli vuoti, progettati per assorbire il sonar attivo e attenuare i suoni emessi dall'interno della nave. + A distanza ravvicinata, l'intensità di un segnale sonar attivo è sufficiente per rompere gli organi e causare un'emorragia interna. + Assicurati che nessuno dei tuoi compagni sia al di fuori del sottomarino prima di abilitare il sonar. + All'interno delle mura di un sottomarino, l'equipaggio è protetto dal suo sonar attivo. Tuttavia, quella schermatura scompare una volta che lo scafo viene sfondato e l'acqua scorre all'interno. + Spegnere il sonar se lo scafo è rotto. I tuoi ingegneri avranno difficoltà a riparare lo scafo se i loro timpani sono rotti. + Fai attenzione quando ti immergi vicino a un sottomarino. Un singolo ping del sonar può causare perdita dell'udito, danni ai tessuti e, in casi estremi, rotture di organi ed emorragie cerebrali. + Si consiglia di portare una muta da sub anecoica quando si attivano le stazioni radiofaro. Sebbene non siano potenti come quello di un sottomarino, un sonar proveniente da un faro può comunque causare gravi lesioni. + La cortizide è l'unico modo per salvare un paziente da un'emorragia cerebrale indotta dal sonar. + L'estratto di manna può fermare temporaneamente la progressione di un'emorragia cerebrale indotta dal sonar. Dopo di che, Cortizide è l'unica opzione. + Non è consigliabile somministrare l'estratto di manna se il paziente ne ha già tracce nel proprio sistema. + Stare lontano dai serbatoi di zavorra quando il sonar attivo è abilitato. Le onde sonore possono facilmente propagarsi attraverso i tubi pieni d'acqua. + Se non trattato, il danno da vibrazione del sonar attivo può causare danni ai nervi e rabdomiolisi nei muscoli interessati. + Con i sottomarini che sono uno stile di vita in Europa, la medicina è avanzata per curare lesioni legate al sonar. Innesti intelligenti per organi perforati, Cortizide per emorragie cerebrali ed Estratto di manna per danni tissutali. + + Sonar sottomarino + + Sonar stazion radiofaro + + Acoustic trauma + I timpani del paziente sono stati perforati, causando sanguinamento e tinnito. + Ti fischiano le orecchie e gocciola sangue, ti senti stordito e confuso. + Morte otogena + Sei morto dissanguato dalle orecchie. + + Vibration damage + Il paziente soffre di lievi danni al sistema circolatorio causati dalle intense vibrazioni del sonar. + Il paziente ha subito gravi danni alle arterie, ai nervi e ai muscoli. + Le viscere del paziente sono a brandelli. Ci sono danni devastanti alle loro arterie, nervi, muscoli e ossa. + Senti un dolore continuo in tutto il corpo. La tua pelle formicola come se avessi spilli e aghi. + Le tue estremità sono intorpidite e senti dolori acuti delle dimensioni di un ago in tutto il corpo. + Non riesci a sentire i tuoi arti. Tutto quello che senti è un dolore lancinante, come se ogni cellula del tuo corpo fosse stata fatta a pezzi. + Danno interno catastrofico + Le tue viscere sono state fatte a pezzi. + + Nerve damage + I nervi del paziente sono stati danneggiati dalle vibrazioni. Le attività quotidiane sono più difficili. + Le tue mani si sentono intorpidite, la tua goffaggine ti fa lavorare in modo meno efficiente + + Rhabdomyolysis + I muscoli del paziente hanno iniziato a rompersi ea riversarsi nel flusso sanguigno. + La maggior parte dei muscoli del paziente è necrotica e quantità pericolose di proteine ??si stanno riversando nel flusso sanguigno. + Ti senti debole, le tue gambe sono gonfie e doloranti. + Le tue gambe si sentono fragili. Camminare è quasi impossibile e il dolore è incommensurabile. + Kidney failure + I tuoi muscoli hanno rilasciato una quantità letale di proteine ??nel flusso sanguigno. + + Ruptured lung + I polmoni del paziente si sono rotti a causa delle vibrazioni del sonar. + I polmoni del paziente sono stati lacerati da vibrazioni estreme, che hanno provocato ipossiemia e un'alta probabilità di asfissia. + C'è un forte dolore al petto. La respirazione è più difficile. + Riesci a malapena a respirare tra la tosse e il sangue, ogni respiro incontra agonia. + Annegato nel suo stesso sangue. + Sei annegato nel tuo stesso sangue a causa di gravi danni ai polmoni. + + Brain hemorrhage + Il cervello del paziente sta sanguinando per l'esposizione al sonar attivo. Per fortuna non sembra peggiorare. + Ampie porzioni del cervello del paziente si sono sciolte in melma. Il cervello sta annegando nel suo stesso sangue, e sta solo peggiorando. + Il cervello del paziente è stato fuso dal sonar attivo. + La tua vista è offuscata e la tua mente è annebbiata. + Non puoi pensare. Vedi lampi e senti il sapore di metallo. Vorresti urlare, ma non puoi. Stai perdendo il controllo di tutte le tue funzioni motorie e la realtà sta lentamente scivolando via. + Brain death + Il tuo cervello è stato sciolto dal sonar attivo. + + Influenza della manna + Questo arto è sotto l'influenza curativa dell'estratto di manna. + Senti una leggera pressione e un calore confortante sotto la pelle. + + Overdose di manna + Il paziente ha una quantità pericolosa di Manna nel sangue. + Ti senti fantastico. + Morto in estasi + Ce l'hai fatta, benvenuto in paradiso. + + Fotopsia + Il paziente sta vivendo anomalie visive sotto forma di luci tremolanti e lampi luminosi. + Le luci sembrano tremolare, vedi delle cose? Lampi di luce riempiono la tua visione periferica. Qualcosa è decisamente sbagliato. + + Atassia + Il cervelletto del paziente è paralizzato, provocando spasmi muscolari involontari e una terribile coordinazione. + I tuoi muscoli sembrano avere una mente propria. Continui a barcollare in avanti senza preavviso e quando provi a camminare, torni al punto di partenza. + + Afasia + Il paziente ha subito un danno all'area Broca del cervello, rendendolo incapace di pronunciare frasi complete. + Non sei in grado di finire frasi di base e hai estrema difficoltà a formare le parole, ricorrendo a volte a borbottii incoerenti. + + Neurite ottica + Il lobo occipitale del paziente è gravemente danneggiato, periodicamente accecando e disorientando il paziente. + La tua vista è periodicamente offuscata dall'oscurità. È questa la fine? + + estratto di manna + Liquido miracoloso che fonde emoglobine umane con plasma alieno per sfruttare la resilienza naturale e le proprietà curative degli abitanti sottomarini di Europa. Utilizzato per il trattamento di danni interni ai sistemi muscolare e nervoso ed è in grado di arrestare temporaneamente un'emorragia cerebrale. Va notato che l'uso ripetuto produce rendimenti decrescenti e rischi di overdose. + Cortizide + Una potente miscela di farmaci per alleviare il dolore e la pressione con una serie di sgradevoli effetti collaterali. Tipicamente iniettato nel cranio come ultima risorsa per curare un'emorragia cerebrale. +ATTENZIONE: la somministrazione in un ambiente cerebrale sano può causare un pericoloso accumulo di pressione nel cranio. + Innesto intelligente + Tessuto connettivo geneticamente modificato che eredita il DNA del paziente per stimolare la rigenerazione di sistemi anatomici complessi. Tipicamente utilizzato per la riparazione di organi perforati. + + Muta da sub anecoica + Una tuta furtiva e leggera progettata per assorbire le onde sonore del sonar attivo con la sua placcatura anecoica. Offre una protezione minore contro i danni e può resistere a pressioni fino a 6.000 metri. + Telecomando di navigazione + Un dispositivo portatile che può essere utilizzato per controllare a distanza il sonar e i motori del sottomarino. + + Impostazioni Real Sonar + Volume Impostazioni + Volume del segnale dell'Aria + Volume del segnale dell'acqua + Volume del segnale della Tuta + Volume del Tintinnio + Volume della Distorsione + Impostazioni di Connessione - Client only (Richiede "cl_reloadlua" nella console) + Modalità a bassa latenza (Esperimentale) + Elimina il ritardo causato da un ping elevato server. Può causare desync se il server ha opzioni di configurazione contrastanti. + Impostazioni di gioco - Host Only + Impostazioni di gioco + Distanza del Sonar (Solamente Giocatore Singolo) + Danno del Sonar (Non lineare) + Sonar del sottomarino + Attiva danno dalle stazioni di navigazione. + Segnale del Sonar + Abilita danno dai Monitor del Sonar. + Sonar della Navetta + Abilita danno dal terminale di navigazione della navetta. + Sonar Nemico + Abilita i ping sonar dai sottomarini controllati da NPC. + Sonar personalizzato + Abilita i danni dai terminali personalizzati. La disabilitazione può migliorare le prestazioni. + Segnala le Creature + Abilita il danno contro tutte le creature non umane. + Segnala le Giocatori + Abilita danno ai Giocatori. + Segnala le Bots + Abilita danno ai Bot . + Rivelamento delle Creature sullo Scafo + Rivelamento Accurato della Posizione per Creature. La disabilitazione può migliorare le prestazioni. + Rivelamento degli Umani sullo Scafo + Rivelamento Accurato della Posizione per Umani, e.g. Vuoi che gli umani siano protetti nel serbatoio di Zavorra?? + Intensità dell'Impatto Visuale del Sonar + Penalità sulla velocità di movimento del Sonar + Altre Immagini (Emorragia celebrale, cortizide, etc.):\nNormale + Altre Immagini (Emorragia celebrale, cortizide, etc.):\Ridotta + Altre Immagini (Emorragia celebrale, cortizide, etc.):\nDisabilitata + Nomi Giocatori Ignorati + ID dei personaggi ignorati + Resistenze della muta da sub + Terminali sonar + (Richiede che l'opzione "Sonar personalizzato" sia abilitata) + Ripristina + Ripristina tutto + Inserimento non valido + Chiuso + + Ho bisogno di attrezzatura subacquea anecoica! + Mi serve una tuta anecoica per riparare con il sonar acceso! + Devo trovare una tuta anecoica! + Non riesco a trovare una tuta anecoica! Spegni il sonar! + Non ci sono tute anecoiche!Non andrò lì dentro! + Non andrò lì fino a quando il sonar non sarà spento! + Non ho nessuna protezione!Spegni il Sonar! + Non posso fare riparazioni se il sonar rimane attivo! + Spegni il sonar! + Le mie orecchie stanno sanguinando per quel maledetto sonar! + Isolate quel sonar! + Sono nell'area del sonar! + Gesù, quel sonar è forte! + Sono in acqua, disattiva il sonar! + Oh dio,disattivate quel sonar! + Qualcuno spenga il sonar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Japanese.xml b/Real Sonar/Localisation/Info_Japanese.xml new file mode 100644 index 0000000..e0309ce --- /dev/null +++ b/Real Sonar/Localisation/Info_Japanese.xml @@ -0,0 +1,179 @@ + + + アクティブソナーのピンガーの強さは、トランスデューサー周辺の水を沸騰させるほど強力です。 + 潜水艦の周りで作業するときは、無響音潜水服の着用をお勧めします。一般的な潜水服ではアクティブソナーから身を守ることはできません。 + 潜水艦のアクティブソナーの音量は235dbに達し、これはジェットエンジンのおよそ724倍、31億6000万倍の音量です。 + 音波は水中では4倍も遠くまで伝わります。潜水艦のアクティブソナーから発せられるピンのような低周波音は、さらに遠くまで伝わります。 + 音が水中から空中に伝搬するとき、強度は80db減少します(256倍静かになる)。これが潜水艦の無響タイル張りの船体と組み合わさることで、乗員はアクティブソナーから安全に身を守ることができるのです。 + 潜水艦の船体には、無響タイルという小さな空洞を何千個も持つゴム製のタイルが貼られており、アクティブソナーを吸収して船内から発せられる音を減衰させるよう設計されている。 + 近距離のアクティブソナー照射には、臓器を破裂させ、内出血を起こすほどの強度があります。 + アクティブソナーを有効にする前に、船体の安全な場所にクルーが1人もいないことを確認してください。 + 潜水艦内部の乗組員は外殻によってアクティブソナーから防護されていますが、船体を破損して水が流入すると、その防護は消えてしまいます。 + 船体に穴が開いたらアクティブソナーを切りましょう。鼓膜が破れてしまっては、エンジニアは漏水を修復するのに苦労するでしょう。 + 潜水艦の近くで潜るときは、注意が必要です。ソナー1発で難聴や組織損傷、ひどい場合は臓器破裂や脳出血を引き起こすことがあります。 + ビーコンステーションを作動させるときは、無響潜水服の持参をお勧めします。潜水艦ほど強力ではありませんが、ビーコンからのソナー信号で大怪我をする可能性があります。 + ソナーによる脳出血から患者を救うには、コルチザイドが唯一の手段です。 + マナエキスは、ソナーによる脳出血の進行を一時的に止めることができます。その後は、コルチザイドが唯一の選択肢となります。 + 患者がすでにマナエキスを接種していた場合は、マナエキスを投与することは推奨されません。 + アクティブソナーが有効なときは、バラストタンクに近づかないようにしてください。音波は水を張ったパイプの中を伝わりやすくなっています。 + アクティブソナーによる振動被害を放置すると、神経損傷や患部の筋肉の横紋筋融解を引き起こす可能性があります。 + 潜水艦が生活の一部となっているエウロパでは、ソナーによる特異な傷害を治療するための医療が発達しています。穿孔した臓器にはスマートグラフト、脳出血にはコルチザイド、組織損傷にはマナエキス。 + + 潜水艦ソナー + + ビーコンソナー + + 音響外傷 + 患者の鼓膜に穴が開き、出血と耳鳴りが生じている。 + 耳鳴りがして血が滴り、めまいがして混乱する。 + + 振動による損傷 + ソナーの激しい振動により、循環器系に軽い損傷を受けた状態。 + 患者は動脈、神経、筋肉に深刻なダメージを受けている。 + 患者の内蔵はボロボロだ。動脈、神経、筋肉、骨に壊滅的なダメージを受けている。 + 全身に鈍い痛みを感じる。皮膚がピンと張ったようにヒリヒリする。 + 四肢がしびれ、全身に針のような鋭い痛みを感じる。 + 手足の感覚がない。感じるのは耐えがたい痛みだけで、体中の細胞が引き裂かれたような感覚。 + 壊滅的な臓器損傷 + 体内が振動でズタズタになった + + 神経障害 + 神経が振動で傷ついている。日常的な作業が困難になるだろう。 + 手がしびれたり、不器用なために仕事の能率が低下する。 + + 横紋筋融解症 + 患者の筋肉が分解され、血中に流出し始めている。 + 患者の大半の筋肉が壊死し、危険な量のタンパク質が血液中に流出している。 + 体がだるく、足がむくんで痛くなる。 + 足が弱ったように感じる。歩くことはほとんど不可能で、痛みは計り知れない。 + 腎不全 + 筋肉が致死量のタンパク質を血中に放出した + + 肺破裂 + ソナーの振動で肺が破裂した患者。 + 患者の肺は極端な振動で引き裂かれ、低酸素血症を引き起こし、窒息する可能性が高い。 + 胸に鋭い痛みがある。呼吸がより困難になる。 + 血を吐いてやっと息ができ、息を吸うたびに苦しくなる。 + 吐血で窒息した。 + 肺に深刻なダメージを受け、血で窒息した。 + + 脳出血 + 患者の脳はアクティブソナーへの暴露により出血しています。幸いにも、これ以上悪化することはないようです。 + 患者の大脳の大部分はどろどろに溶けている。脳は自分の血で溺れており、悪化の一途をたどっている。 + アクティブソナーで患者の脳が溶けてしまった。 + 視界がぼやけ、頭がぼんやりしている。 + 考えることはできない。閃光を見たり、金属の味を感じたり。叫びたいのに、叫べない。運動機能の制御を失い 現実は徐々に失われていく... + 脳死 + ソナーで脳が溶けた + + マナの影響 + この手足は、マナエキスの癒しの影響下にあります。 + 肌の下に優しい圧力と心地よい温もりを感じることができます。 + + マナ過剰摂取 + 患者の血中には危険な量のマナが含まれている。 + 超・サイコー!! + + 視力障害 + チカチカする光や明るい閃光のような視覚異常がある。 + 照明がチカチカしているように見えるが、何か見えているのだろうか?周辺視野に光の点滅が充満している。確かに何かおかしい。 + + 運動失調症 + 小脳が麻痺しているため、不随意筋の痙攣やひどい協調運動が起こる。 + 筋肉が勝手に動いているようだ。前触れもなく前に進み続け、歩こうとしても元の場所に戻ってしまうのです。 + + 失語症 + 脳の運動性言語中枢に障害があり、完全な言葉を話すことができない患者。 + 基本的な文章を書き上げることができず、言葉を作るのが非常に困難で、時には支離滅裂なつぶやきをすることもある。 + + 視神経炎 + 患者の後頭葉はひどく損傷しており、周期的に目が見えなくなり、見当識障害に陥る。 + 視界は定期的に暗闇に覆われる。これで終わりなのか? + + マナエキス + 人間のヘモグロビンとエイリアンの血漿を融合させ、エウロパの海中生物が持つ自然回復力と治癒力を利用した奇跡の液体。筋肉や神経系の内部損傷に使用され、脳出血を一時的に止めることができる。繰り返し使用すると効果が薄れ、過剰摂取の危険性があることに注意する必要がある。 + コルチザイド + 痛みと圧力を和らげる強力な混合薬で、多くの厄介な副作用がある。脳出血の治療のため、最終手段として頭蓋内に注射されるのが一般的。 +警告 健康な脳環境に投与すると、頭蓋骨に危険な圧力がかかることがある。 + スマートグラフト + 患者のDNAを受け継いだ遺伝子工学的結合組織で、複雑な解剖学的システムの再生を促進する。一般的に、穴のあいた臓器の修復に用いられる。 + + 対振動潜水服 + アクティブソナーの音波を対振動メッキで吸収するように設計された、ステルス性の高い軽量スーツ。ダメージから身を守り、6,000mまでの圧力に耐えることができる。 + リモートナビ + 潜水艦のソナーやエンジンを遠隔操作するための携帯端末。 + ソナーを切れ! + あのソナーで耳から血が出そうだ! + ソナーを止めろ! + ソナーに引っかかった!? + なんだ、あのソナー音は!? + 水中にいるんだ、ソナーをオフにしろ! + ソナーをオフに! + 誰かソナーを止めて! + + リアルソナー設定 + 音量設定 + 空気でソナー音量 + 水中でソナー音量 + スーツでソナー音量 + 耳鳴り音量 + ディストーション音量 + ネットワーク設定ークライアントだけ(コンソールに「cl_reloadlua」入力しなければいけない) + 低遅延モード(試験的) + サーバーへの高いpingための問題が取り除きます。矛盾的なサーバー設定あると同期がとれないこととか視覚的な不具合が起こるかもしれません。 + ホストのゲームプレイ設定 + ゲームプレイ設定 + ソナー射程(シングルプレイだけ) + ソナーダメージ(非線形) + 航法装置の有効あり + 航法装置が使える許可 + ビーコンソナー + ビーコンソナーモニターが使える許可 + シャトル航法装置の有効あり + シャトル航法装置が使える許可 + 敵のソナー + NPCが操作する潜水艦からのソナーピングを有効にします。 + カスタム ソナー + カスタム装置が使える許可。無効にするとパフォーマンスが向上する可能性があります。 + 怪物ダメージあり + 人間じゃない生き物にダメージを有効にする + プレイヤーダメージあり + プレイヤーにダメージを有効にする + ボットダメージあり + ボットにダメージを有効にする + 船体上の怪物検知あり + 怪物の正確なソナー当たり判定を可能にする。無効にするとパフォーマンスが向上する可能性があります。 + 船体上の人間検知あり + 人間の正確なソナー当たり判定を可能にする。 (人間はバラストの中にソナーダメージ受けられない) + ソナーインパクト視覚強度設定 + ソナー移動速度ペナルティ設定 + 他の視覚効果(脳内出血、コルチジド、など):\nデフォルト + 他の視覚効果(脳内出血、コルチジド、など):\n少し + 他の視覚効果(脳内出血、コルチジド、など):\nなし + 無視するプレイヤー名 + 無視されるキャラクターID + ダイビングスーツの抵抗 + ソナー装置 + (「カスタム ソナー」オプションを有効にする必要があります) + リセット + すべてリセット + 無効入力 + 閉じる + + 対振動潜水服が必要だ! + ソナー中に修理すると対振動潜水服が必要あるんだよ! + 対振動潜水服を探さないと! + 対振動潜水服が見つからない! ソナーを切れ! + 対振動潜水服がが全然ないよ! そこに入ってはいけない! + ソナーが切れるまでは行かないよ! + 対振動潜水服をつけない!ソナーを切れ! + ソナーつけてままに修理できないよ! + ソナーを切れ! + あのソナーで耳から血が出そうだ! + ソナーを止めろ! + ソナーに引っかかった!? + なんだ、あのソナー音は!? + 水中にいるんだ、ソナーをオフにしろ! + ソナーをオフに! + 誰かソナーを止めて! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Korean.xml b/Real Sonar/Localisation/Info_Korean.xml new file mode 100644 index 0000000..9ffbe21 --- /dev/null +++ b/Real Sonar/Localisation/Info_Korean.xml @@ -0,0 +1,175 @@ + + + 활성 소나 핑의 강도는 트랜스듀서 주변의 물을 끓일 만큼 강력합니다. + 잠수함 주변에서 작업할 때는 무반향 잠수복을 착용하는 것이 좋습니다. 일반적인 잠수복으로는 활성 소나로부터 보호받을 수 없습니다. + 잠수함의 활성 소나는 235dB의 음량에 도달할 수 있으며, 이는 제트 엔진보다 약 724배 더 크고, 강도는 31.6억 배 더 강합니다. + 수중에서 음파는 공기 중보다 4배 더 멀리 전파됩니다. 잠수함의 활성 소나에서 나오는 핑과 같은 저주파 음파는 더 멀리 침투합니다. + 소리가 물에서 공기로 전파될 때, 강도는 80dB(256배 더 조용함) 감소합니다. 이와 잠수함의 무반향 타일 선체가 결합되어 잠수함 승무원들을 활성 소나로부터 안전하게 보호합니다. + 잠수함 선체는 무반향 타일로 코팅되어 있습니다. 이 고무 타일에는 수천 개의 작은 공극이 있어 활성 소나를 흡수하고 선체 내부에서 발생하는 소리를 감쇠시키도록 설계되었습니다. + 근거리에서 활성 소나 핑의 강도는 장기를 파열시키고 내부 출혈을 일으킬 만큼 강력합니다. + 활성 소나를 작동하기 전에 모든 승무원이 선체의 안전 범위 내에 있는지 확인하세요. + 잠수함 벽 안에서 승무원들은 자체 활성 소나로부터 보호받습니다. 하지만 선체가 파손되어 물이 유입되면 이 보호막은 사라집니다. + 선체가 파손되면 활성 소나를 끄세요. 기술자들이 고막이 터진 상태에서는 누수를 수리하기 어려울 것입니다. + 잠수함 근처에서 잠수할 때는 주의하세요. 단 한 번의 소나 핑으로도 청력 손실, 조직 손상, 극단적인 경우 장기 파열과 뇌출혈을 일으킬 수 있습니다. + 비콘 기지를 활성화할 때는 무반향 잠수복을 착용하는 것이 좋습니다. 잠수함만큼 강력하지는 않지만, 비콘에서 나오는 소나 핑도 심각한 부상을 일으킬 수 있습니다. + 코르티자이드는 소나로 인한 뇌출혈 환자를 구할 수 있는 유일한 방법입니다. + 만나 추출물은 일시적으로 소나로 인한 뇌출혈의 진행을 멈출 수 있습니다. 그 후에는 코르티자이드만이 유일한 선택지입니다. + 환자의 체내에 이미 만나 추출물 흔적이 있다면 추가로 투여하는 것은 권장되지 않습니다. + 활성 소나가 작동 중일 때는 밸러스트 탱크에서 멀리 떨어지세요. 음파가 물이 가득 찬 파이프를 통해 쉽게 전파될 수 있습니다. + 치료하지 않으면 활성 소나로 인한 진동 손상은 신경 손상과 영향을 받은 근육의 횡문근융해증을 유발할 수 있습니다. + 유로파에서 잠수함이 생활의 일부가 되면서, 의학은 독특한 소나 관련 부상을 치료하기 위해 발전했습니다. 천공된 장기를 위한 스마트 이식, 뇌출혈을 위한 코르티자이드, 조직 손상을 위한 만나 추출물 등이 있습니다. + + 잠수함 소나 + + 비콘 소나 + + 음향 외상 + 환자의 고막이 천공되어 출혈과 이명이 발생했습니다. + 귀에서 이명이 들리고 피가 흐르며, 어지럽고 혼란스럽습니다. + 이성 사망 + 귀에서 출혈이 멈추지 않아 사망했습니다. + + 진동 손상 + 환자가 강렬한 소나 진동으로 인해 순환계에 경미한 손상을 입었습니다. + 환자의 동맥, 신경, 근육에 심각한 손상이 발생했습니다. + 환자의 내부가 망가졌습니다. 동맥, 신경, 근육, 뼈에 치명적인 손상이 발생했습니다. + 온몸에 둔통을 느낍니다. 피부가 저리고 따끔거립니다. + 사지가 마비되고 온몸에 바늘로 찌르는 듯한 날카로운 통증을 느낍니다. + 팔다리를 느낄 수 없습니다. 몸의 모든 세포가 찢어지는 것 같은 극심한 고통만 느껴집니다. + 치명적인 내부 손상 + 내장이 찢어졌습니다. + + 신경 손상 + 환자의 신경이 진동으로 인해 손상되었습니다. 일상적인 작업이 더 어려워집니다. + 손이 마비된 것 같고, 어색해서 작업 효율이 떨어집니다. + + 횡문근융해증 + 환자의 근육이 분해되기 시작하여 혈류로 유입되고 있습니다. + 환자의 대부분의 근육이 괴사되었으며 위험한 양의 단백질이 혈류로 유입되고 있습니다. + 몸이 느려지고, 다리가 붓고 아픕니다. + 다리가 허약해졌습니다. 걷는 것이 거의 불가능하고, 고통이 극심합니다. + 신부전 + 근육에서 치명적인 양의 단백질이 혈류로 유입되었습니다. + + 폐 파열 + 환자의 폐가 소나 진동으로 인해 파열되었습니다. + 환자의 폐가 극심한 진동으로 인해 찢어져 저산소증과 질식의 위험이 높습니다. + 가슴에 날카로운 통증이 있습니다. 호흡이 더 어려워졌습니다. + 피를 토하느라 겨우 숨을 쉴 수 있습니다. 숨을 들이쉴 때마다 고통스럽습니다. + 자신의 피에 익사함 + 심각한 폐 손상으로 인해 자신의 피에 익사했습니다. + + 뇌출혈 + 환자의 뇌가 활성 소나 노출로 인해 출혈하고 있습니다. 다행히 더 악화되지는 않는 것 같습니다. + 환자의 대뇌 대부분이 진흙처럼 녹아내렸습니다. 뇌가 자신의 피에 잠기고 있으며, 상황은 계속 악화되고 있습니다. + 환자의 뇌가 활성 소나에 의해 녹아버렸습니다. + 시야가 흐려지고 정신이 몽롱합니다. + 생각을 할 수 없습니다. 번쩍이는 것이 보이고 금속 맛이 납니다. 소리를 지르고 싶지만 할 수 없습니다. 모든 운동 기능을 잃어가고 있으며, 현실이 서서히 멀어지고 있습니다. + 뇌사 + 활성 소나에 의해 뇌가 녹아버렸습니다. + + 만나의 영향 + 이 사지가 만나 추출물의 치유 영향 하에 있습니다. + 피부 아래에서 부드러운 압력과 편안한 따뜻함을 느낍니다. + + 만나 과다복용 + 환자의 혈액에 위험한 양의 만나가 있습니다. + 기분이 환상적입니다. + 황홀감 속에서 사망 + 당신은 해냈습니다, 천국에 오신 것을 환영합니다. + + 광시증 + 환자가 깜박이는 불빛과 밝은 섬광 형태의 시각적 이상을 경험하고 있습니다. + 불빛이 깜박이는 것 같습니다. 뭔가 보이나요? 시야 주변에 밝은 섬광이 가득합니다. 뭔가 확실히 잘못되었습니다. + + 운동실조 + 환자의 소뇌가 손상되어 불수의적 근육 경련과 심각한 협응 장애를 겪고 있습니다. + 근육이 제멋대로 움직이는 것 같습니다. 경고 없이 계속 앞으로 휘청거리고, 걸으려고 하면 제자리로 돌아옵니다. + + 실어증 + 환자의 브로카 영역이 손상되어 완전한 문장으로 말할 수 없게 되었습니다. + 기본적인 문장을 완성하지 못하고 단어를 형성하는 데 극도의 어려움을 겪고 있으며, 때로는 알아들을 수 없는 중얼거림으로 대체하게 됩니다. + + 시신경염 + 환자의 후두엽이 심각하게 손상되어 주기적으로 환자를 실명시키고 방향 감각을 잃게 합니다. + 시야가 주기적으로 어둠에 잠깁니다. 이게 끝인가요? + + 만나 추출물 + 인간의 헤모글로빈과 외계 플라즈마를 융합하여 유로파의 수중 생물체의 자연적인 회복력과 치유 특성을 활용하는 기적의 액체입니다. 근육계와 신경계의 내부 손상을 치료하는 데 사용되며, 일시적으로 뇌출혈을 멈출 수 있습니다. 반복 사용 시 효과가 감소하고 과다복용의 위험이 있다는 점에 유의해야 합니다. + 코르티자이드 + 강력한 진통 및 감압 약물 혼합물로, 다양한 심각한 부작용이 있습니다. 일반적으로 뇌출혈 치료의 마지막 수단으로 두개골에 주입합니다. +경고: 건강한 뇌 환경에 투여하면 두개골 내 위험한 압력 증가를 유발할 수 있습니다. + 스마트 이식 + 환자의 DNA를 상속받아 복잡한 해부학적 시스템의 재생을 자극하는 유전자 조작된 결합 조직입니다. 일반적으로 천공된 장기를 복구하는 데 사용됩니다. + + 무반향 잠수복 + 무반향 플레이트로 활성 소나의 음파를 흡수하도록 설계된 은밀하고 가벼운 잠수복입니다. 약간의 손상 보호 기능을 제공하며 최대 6,000미터의 압력을 견딜 수 있습니다. + 항해 리모컨 + 잠수함의 소나와 엔진을 원격으로 제어하는 데 사용할 수 있는 휴대용 장치입니다. + + 실제 소나 설정 + 음량 설정 + 공기 중 핑 음량 + 수중 핑 음량 + 잠수복 핑 음량 + 이명 음량 + 왜곡 음량 + 네트워크 설정 - 클라이언트 전용 (콘솔에서 "cl_reloadlua" 필요) + 저지연 모드 (실험적) + 서버에 대한 높은 핑으로 인한 지연을 제거합니다. 서버의 구성 옵션이 다를 경우 시각적 버그나 동기화 오류가 발생할 수 있습니다. + 게임플레이 설정 - 호스트 전용 + 게임플레이 설정 + 소나 범위 (싱글플레이어 전용) + 소나 피해 (비선형) + 잠수함 소나 + 항해 터미널의 기능을 활성화합니다. + 비콘 소나 + 소나 모니터의 기능을 활성화합니다. + 셔틀 소나 + 셔틀 터미널의 기능을 활성화합니다. + 적 소나 + NPC가 조종하는 잠수함의 소나 핑을 활성화합니다. + 사용자 정의 소나 + 사용자 정의 터미널의 기능을 활성화합니다. 비활성화하면 성능이 향상될 수 있습니다. + 생물체 타겟팅 + 모든 비인간 생물체에 대한 피해를 활성화합니다. + 플레이어 타겟팅 + 플레이어에 대한 피해를 활성화합니다. + 봇 타겟팅 + 봇에 대한 피해를 활성화합니다. + 생물체 선체 감지 + 생물체에 대한 정확한 소나 타격 감지입니다. 비활성화하면 성능이 향상될 수 있습니다. + 인간 선체 감지 + 인간에 대한 정확한 소나 타격 감지입니다. 예를 들어, 밸러스트 탱크 안의 인간을 보호하고 싶나요? + 소나 충격 시각 효과 강도 + 소나 이동 속도 페널티 + 기타 시각 효과 (뇌출혈, 코르티자이드 등):\n표준 + 기타 시각 효과 (뇌출혈, 코르티자이드 등):\n감소됨 + 기타 시각 효과 (뇌출혈, 코르티자이드 등):\n비활성화됨 + 무시된 플레이어 이름 + 무시된 캐릭터 ID + 잠수복 저항력 + 소나 터미널 + ("사용자 정의 소나" 옵션이 활성화되어야 함) + 초기화 + 모두 초기화 + 잘못된 입력 + 닫기 + + 무반향 잠수 장비가 필요해요! + 소나가 켜진 상태에서 수리하려면 무반향 잠수복이 필요해요! + 무반향 잠수복을 찾아야 해요! + 무반향 잠수복을 찾을 수 없어요! 소나를 꺼주세요! + 무반향 잠수복이 없어요! 저는 거기 들어가지 않을 거예요! + 소나가 꺼질 때까지 거기 들어가지 않을 거예요! + 보호 장비가 없어요! 소나를 끄세요! + 소나가 꺼질 때까지 수리할 수 없어요! + 소나를 꺼주세요! + 그 망할 소나 때문에 귀에서 피가 나요! + 소나를 끄세요! + 소나에 갇혔어요! + 맙소사, 그 소나 소리가 너무 크네요! + 물 속에 있어요, 소나를 비활성화해주세요! + 오, 제발 소나를 비활성화해주세요! + 누군가 소나를 꺼주세요! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_LatinAmericanSpanish.xml b/Real Sonar/Localisation/Info_LatinAmericanSpanish.xml new file mode 100644 index 0000000..f56d7be --- /dev/null +++ b/Real Sonar/Localisation/Info_LatinAmericanSpanish.xml @@ -0,0 +1,174 @@ + + + La intensidad de un ping sonar activo es lo suficientemente poderosa como para hervir agua alrededor de los transductores. + Es recomendado usar un traje de buceo anecoico cuando se trabaja alrededor de un submarino. Un traje de buceo comun no te protejerá de un sonar activo. + El sonar activo de un submarino puede alcanzar volúmenes de 235db, lo que es mas o menos 724 veces mas fuerte, y 3.16 billiones de veces mas intenso que un motor a reacción. + Las ondas sonoras viajan cuatro veces más rápido en el agua. Sonidos de baja frecuencia, como los pings del sonar activo de un submarino son aún mas rápidos. + Cuando el sonido se propaga del agua al aire, la intensidad se reduce por 80db (256x mas silencioso). Esto, combinado con el casco anecoico de un submarino keeps submariners safe from active sonar. + Los cascos de un submarino estan recubiertos con placas anecoicas, placas de caucho que contienen miles de pequeños vacíos, diseñadas para absorver un sonar activo y atenuar soindos emitidos desde dentro del buque. + A corto rango, la intensidad de un ping sonar activo es suficiente para penetrar órganos y causar hemorragia interna. + Asegúrate que ninguno de tus compañeros de tripulación esten fuera de la seguridad del casco antes de encender el sonar activo. + Dentro de las paredes de un submarino, la tripulación esta protegida del sonar activo. Sin embargo, ese blindaje desaparece una vez que se rompe el casco y el agua fluye al interior. + apaga el sonar activo si se rompe el casco. Tus ingenieros tendrán dificultades reparando la fuga si se perforan sus tímpanos. + Se cuidadoso al bucear cerca de un submarino. Solo un ping sonar puede causar pérdida de la audición, daño a los tejidos, y en casos extremos, órganos perforados y hemorragia cerebral. + Se recomienda traer un traje de buceo anecoico al activar estaciones de balizas. Aunque no tan poderoso como el de un submarino, el ping sonar de una baliza puede causar heridas serias. + Cortizida es la única forma de salvar a un paciente de hemorragia cerbral causada por sonar. + El extracto de maná puede detener el avance de la hemorragia cerebral causada por sonar. Después de eso, Cortizida es la única opcion. + No se recomienda administrar Extracto de Maná si el paciente already ya tiene rastros en su cuerpo. + Mantente alejado de los lastres mientras el sonar activo esté funcionando. las ondas sonoras fácilmente pueden propagarse a través de las tuberías llenas de agua. + Si no es tratado, el daño por vibración del sonar activo puede causar daño a los nervios y rabdomiólisis en los músculos afectados. + Ya que los submarinos son una forma de vida en Europa, la medicina ha avanzado para tratar heridas causadas por sonar. Injertos Inteligentes para órganos perforados, Cortizida para hemorragia cerebral y Extracto de Maná para daño a los tejidos. + + Sonar activo + + Sonar estación de baliza + + Trauma Acústico + Los tímpanos del paciente se han perforado, causando sangrado y tinnitus. + Tus oídos estan zumbando y goteando sangre, te sientes mareado y confundido. + Muerte otogénica + Te desangraste hasta morir por las orejas. + + Daño por Vibración + El paciente sufre de daños menores a su sistema circulatorio causado por vibraciones intensas del sonar. + El paciente ha sufrido daños serios a sus arterias, nervios y músculos. + El interior del paciente esta arruinado. Hay daños devastadores en sus arterias, músculos y huesos. + Sientes un dolor sordo por todo tu cuerpo. Tu piel hormiguea. + Tus extremidades estan entumecidas y sientes pinchazos agudos por todo el cuerpo. + No puedes sentir tus extremidades. Todo lo que sientes es dolor agudo, como si cada célula de tu cuerpo hubiera sido destrozada. + Daño interno catastrófico + Tu interior fue destrozado. + + Daño a los nervios + Los nervios del paciente fueron dañados por vibraciones. Tareas diarias son más difíciles. + Tus manos estan entumecidas, tu torpeza te puede hacer menos eficiente. + + Rabdomiólisis + Los músculos del paciente estan rupturandose y se estan derramando en el flujo sanguíneo. + La gran mayoría de músculos del paciente sufren de necrosis y peligrosas cantidades de proteínas se estan derramando en el flujo sanguíneo. + Te sientes lento, tus piernas estan hinchadas y adoloridas. + Tus piernas se sienten fragíles. Caminar es casi imposible, el dolor es inconmensurable. + Fallo Renal + Tus músculos liberaron cantidades letales de proteínas en tu flujo sanguíneo. + + Pulmón Perforado + Los pulmones del paciente fueron perforados por vibraciones del sonar. + Los pulmones del paciente han sido perforados por vibraciones extremas, causando hipoxemia y una alta probabilidad de asfixia. + Hay un dolor agudo en tu pecho. Respirar es más difícil. + Apenas puedes respirar entre toser sangre, cada inhalación es una agonía. + Ahogado en su propia sangre + Te ahogaste en tu propia sangre por el daño severo a tus pulmones. + + Hemorragia Cerebral + El cerebro del paciente esta sangrando por la exposición a un sonar activo. Afortunadamente no parece estar empeorando. + Gran parte del cerebro del paciente se ha hecho papilla. El cerebro se esta ahogando en su propia sangre y solo sigue empeorando. + El cerebro del paciente se hizo papilla por exposición a un sonar activo. + Tu visión esta borrosa y tu mente se siente nublada. + No puedes pensar. ves destellos y saboreas metal. Quieres gritar, pero no puedes. estas perdiendo el control de todas tus funciones motoras y la realidad se aleja lentamente. + Muerte Cerebral + Tu cerebro fue hecho papilla por un sonar activo. + + Influencia del Maná + Esta extremidad esta bajo la influencia curativa del Extracto de Maná. + Sientes una gentil presión y calor reconfortante debajo de tu piel. + + Sobredosis de Maná + El paciente tiene cantidades peligrosas de Maná en la sangre. + Te sientes fantástico. + Murió en éxtasis + Lo hiciste, bienvenido al cielo. + + Fotopsia + El paciente sufre de anomalías visuales en forma de luces parpadeantes y destellos brillantes. + Las luces parecen parpadear, ¿estás imaginando cosas? Destellos de luz llenan tu visíon periferal. Algo esta mal. + + Ataxia + El cerebelo del paciente esta lesionado, causando espasmos musculares y coordinación terrible. + Tus músculos parecen tener mente propia. Te tambaleas sin aviso, y cuando intentas caminar terminas justo donde empezaste. + + Afasia + El paciente ha recibido daños en la area de Broca del cerebro. Lo que le impide hablar en oraciones completas. + Eres incapaz de terminar oraciones básicas y tienes dificultades extremas para formar palabras, a veces recurriendo a murmullos incoherentes. + + Neuritis Óptica + El lóbulo occipital del paciente esta dañado de gravedad. Periodicamente cegando y desorientando al paciente. + Tu visión se oscurece constantemente. ¿Este es el final? + + Extracto de Maná + Líquido milagroso que combina la hemoglobina humana con plasma alien para conseguir la resistencia natural y propiedades curativas de los habitantes subacuáticos de Europa. Usada para tratar daños internos al sistema muscular y nervioso. Y es capaz de detener la hemoraggia cerebral temporalmente. Múltiples usos son menos efectivos y arriesgan sobredosis. + Cortizida + Una potente mezcla de medicamentos para aliviar el dolor y la presión con una serie de efectos secundarios desagradables. Normalmente se inyecta directo al cráneo como último recurso para tratar la hemorragia cerebral. +Cuidado: Administrarla a un cerebro sano puede causar acumulaciones de presión peligrosas en el cráneo. + Injerto Inteligente + Tejido conectivo diseñado genéticamente que hereda el adn del paciente para estimular la regeneración de sistemas anatómicos complejos. usada para reparar órganos perforados. + + Traje de Buceo Anecoico + Un traje ligero y sigiloso diseñado para absorver ondas sonoras de un sonar activo con sus placas anecoicas. Ofrece protección minima contra los daños y puede soportar presiones de hasta 6.000 metros. + Control remoto de navegación + Un dispositivo de mano que se puede utilizar para controlar de forma remota el sonar y los motores del submarino. + + Opciones Real Sonar + Opciones de volumen + Volumen del Ping por Aire + Volumen del Ping por Agua + Volumen del Ping en Traje + Volumen de Tinnitus + Volumen de Distorsión + Opciones de Red - Solo Cliente (Requiere "cl_reloadlua" en la consola) + Modo de baja latencia (Experimental) + Elimina el retraso al servidor causado por alto ping. Podría causar Desync si el servidor tiene opciones contrastantes activadas en la configuracion. + Configuración de jugabilidad: solo para el anfitrión + Configuración de jugabilidad + Daño del sonar (no lineal) + Sonar de submarino + Habilitar daño desde las Terminales de Navegación. + Sonar de estación de baliza + Habilitar daño desde los Monitores de Sonar. + Sonar de lanzadera + Habilitar daño desde las Terminales de Lanzadera. + Sonar Enemigo + Habilitar los pings de sonar de submarinos controlados por NPCs. + Sonar de personalizada + Habilitar daño desde las terminales de personalizada. Desactivarlo puede mejorar el rendimiento. + Apuntar a criaturas + Habilitar daño a todas las criaturas no humanas. + Apuntar a jugadores + Habilitar daño a jugadores. + Apuntar a bots + Habilitar daño a bots. + Detección del casco para criaturas + Detección precisa de impacto del sonar para criaturas. Desactivarlo puede mejorar el rendimiento. + Detección del casco para humanos + Detección precisa de impacto del sonar para humanos, por ejemplo, ¿deseas que los humanos estén protegidos en los tanques de lastre? + Intensidad Visual de impactos del Sonar + Penalizacion de velocidad de movimiento por Sonar + Otros efectos visuales (Hemorragia Cerebral, cortizida, etc.):\nEstándar + Otros efectos visuales (Hemorragia Cerebral, cortizida, etc.):\nReducidos + Otros efectos visuales (Hemorragia Cerebral, cortizida, etc.):\nDesactivados + Nombres de Jugadores Ignorados + ID de personajes ignorados + Resistencias del traje de buceo + Terminales de sonar + (Requiere que la opción "Sonar de personalizada" esté habilitada) + Reiniciar + Reiniciar todo + Entrada inválida + Cerrar + + ¡Necesito equipo de buceo anecoico! + ¡Necesito un traje de buceo anecoico para hacer reparaciones con el sonar encendido! + ¡Debo encontrar un traje anecoico! + ¡No puedo encontrar un traje anecoico! ¡Apaguen el sonar! + ¡No quedan trajes anecoicos! ¡No entraré ahí! + ¡No iré hasta que el sonar este aapagado! + ¡No tengo proteccion! ¡Apaguen el sonar! + ¡No puedo hacer reparaciones hasta que el sonar este apagado! + ¡Apaguen el sonar! + ¡Mis oídos sangran gracias a ese maldito sonar! + ¡Callen el sonar! + ¡Me atrapó el sonar! + ¡Dios, ese sonar es ruidoso! + ¡Estoy en el agua, apaguen el sonar! + ¡Oh dios, apaguen el sonar! + ¡Alguien apague el sonar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Polish.xml b/Real Sonar/Localisation/Info_Polish.xml new file mode 100644 index 0000000..a1bdb45 --- /dev/null +++ b/Real Sonar/Localisation/Info_Polish.xml @@ -0,0 +1,175 @@ + + + Siła dzwięku wydawanego przez sonar aktywny jest wystarczająco silna, aby zagotować wodę wokół transduktora. + Zalecane jest noszenie skafandra bezechowego podczas pracy przy zewnątrzu lub przy kadłubie okrętu. Podstawowy skafander nie uchroni ciała przed siłą niesioną przez dźwięk sonaru. + Sonar aktywny statku podwodnego wydaje dźwięki o sile 235db, co jest około 724 razy silniejsze i 3,16 biliona bardziej intensywne od dźwięku silnika odrzutowego. + Fale dźwiękowe lecą około 4 razy dalej pod wodą. Dźwięki o niskiej częstotliwości, takie jak te od sonaru aktywnego statku podwodnego, przedzierają się przez wodę jeszcze dalej. + Gdy dźwięk rozprzestrzenia się z wody do powietrza, jego intensywność jest redukowana o 80db (256 razy ciszej). To, połączone z bezechowym opłytowaniem statku podwodnego, zapewnia bezpieczeństwo załogantom znajdującym się na pokładzie. + Statek podwodny jest pokryty płytami bezechowymi, gumowymi płytami pełnymi małych przestrzeni próżniowymi, wykonane po to, aby wyciszać dzwięk sonaru aktywnego, oraz osłabiać dźwięki wydobywające się ze środka statku. + Na bilskim dystansie, sonar aktywny jest dość silny aby uszkadzać organy oraz wywoływać krwotoki wewnętrzne. + Upewnij się że żaden załogant jest poza bezpieczeństwem statku przed aktywowaniem sonaru aktywnego. + Wewnątrz łodzi podwodnej jej załoga jest bezpieczna przed zagrożeniem ze strony sonaru. Jednak jeżeli w kadłubie jest dziura i dostanie się woda, bezpieczeństwo już jest tylko iluzją. + Wyłącz sonar aktywny jeżeli na łodzi jest przeciek. Twojej załodze będzie trudno go zaspawać jeżeli ich błony bębenkowe ucha są pęknięte. + Bądź ostrożny gdy pływasz wokół statku. Pojedyńczy dźwięk wydany przez sonar może spodowować utratę słuchu, obrażenia tkanek miękkich i w najgorszych przypadkach, pęknięcie organów i krwotoki mózgu. + Zalecane jest wzięcie skafandra bezechowego do napraw stacji nadajnika. Nawet jeżeli nie jest tak potężny jak ten aplikowany w łodziach podwodnych, dźwięk ze stacji nadajnika nadal może wywołać poważne obrażenia. + Dawka kortyzydu to jedyny sposób na odratowanie załoganta od krwotoku mózgu. + Kalok C może tymczasowo zatrzymać pogarszanie się krwotoku mózgowego spowodowanego obrażeniami wywołanymi przez dźwięk sonaru. Potem jednak, Kalok C to jedyna opcja. + Nie jest zalecane stosowanie Kaloku C jeżeli pacjent nadal ma jego resztki z poprzedniej dawki w krwiobiegu. + Nie wchodź do balastu jeżeli sonar jest włączony. Fale dźwiękowe łatwo rozprzestrzeniają się w rurach wypełnionych wodą. + Jeżeli pozostawione, obrażenia od wibracji od aktywnego sonaru mogą wywołać obrażenia tkanek nerwowych oraz rabdomiolizę w dotkniętych nimi mięśniach. + Jako że statki stały się sposobem na życie w wodach Europy, medycyna rozszerzyła się aby leczyć bardziej sytuacyjne przypadki. Inteligętne przeszczepy na uszkodzone organy, kortyzyd na krwotoki mózgu, czy Kalok C na uszkodzenie tkanek. + + Sonar podwodnej + + Sonar stacji nadajnika + + Uraz akustyczny + Błony bębenkowe ucha pacjenta są pęknięte, powodując krawienie i szum w uszach. + Piszczy Ci w uszach i krawi Ci z uszu, jest Ci trochę niedobrze i jesteś zakłopotany. + Śmierć otogeniczna + Wykrwawiłeś się na śmierć przez uszy. + + Uraz od wibracji + Pacjent cierpi na lekkie obrażenia systemu krwionośnego spowodowanego dźwiękiem sonaru. + Pacjent ma poważne obrażenia tętnic, nerwów i mięśni. + Organy pacjenta to teraz łachmany. pacjent ma uśmiercające obrażenia tętnic, nerwów, mięśni i kości. + Czujesz tępy ból w całym ciele. Skóra łaskocze cię jakbyś skrobał po niej setką igiełek. + Twoje kończyny są zdrętwiałe i czujesz jakby w całe twoje ciało były wkłuwane igły. + Nie czujesz rąk i nóg. Jedyne co czujesz to wykańczający ból, jakby każda twoja komórka była rozerwana na części. + Katastroficzne obrażenia wewnętrzne + Twoje organy zostały rozerwane na strzępy. + + Obrażenia tkanki nerwowej + Nerwy lub zakończenia nerwowe pacjenta zostały zniszczone lub uszkodzone przez wibracje. Codzienne czynności są dość trudne. + Twoje dłonie są zdrętwiałe, twoja niezdarność nie pozwala Ci pracować w twoim normalnym tempie. + + Rabdomioliza + Mięśnie pacjenta zaczynają się odrywać i krążyć po krwiobiegu. + Duża część mięśni pacjenta doświadczyła martwicy i niebezpieczna ilość białek krąży po krwiobiegu. + Czujesz się powolny, twoje nogi bolą i są spuchnięte. + Twoje nogi wydają się wątłe. Chodzenie jest prawie niemożliwe, a każdy moment to wykańczający ból. + Niewydolność nerek + Twoje mięśnie wydały śmiertelną ilość białek do krwiobiegu. + + Pęknięte płuca + Płuca pacjenta zostały mocno uszkodzone przez wibracje. + Płuca pacjenta zostały porozerwywane, zostawiając go z hipoksemią i wysokim ryzykiem uduszenia. + Masz ostry ból w klatce piersiowej. Oddychanie jest utrudnione. + Ledwo jesteś w stanie oddychać pomiędzy kaszlem krwią. Każdy wdech to czysta agonia. + Utonął we własnej krwi + Utonąłeś we własnej krwi z powodu uszkodzeń płuc. + + Krwotok mózgu + Mózg pacjenta krawi z powodu uszkodzeń dźwiękiem. Na szczęście nie wygląda na to, żeby robiło się gorzej. + Duża część mózgu pacjenta to już płyn. Mózg tonie we własnej krwi, i sytuacja tylko się pogarsza. + Mózg pacjenta został roztopiony przez sonar. + Twój wzrok wydaje się zamazany, a myśli wydają się mgliste. + Nie możesz myśleć. Widzisz błyski i czujesz smak metalu. Chcesz krzyknąć, lecz nie możesz. Tracisz kontrolę nad zdolnościami ruchowymi, a rzeczywistość powoli Ci odpływa. + Śmierć mózgu + Twój mózg został roztopiony przez sonar. + + Wpływ Kaloku C + Ta kończyna jest pod leczącym wpływem Kaloku C. + Czujesz lekki nacisk i komfortujące ciepło pod skórą. + + Przedawkowanie Kaloku C + Pacjent ma niebezpieczną ilość Kaloku C w krwiobiegu. + Czujesz się lepiej niż kiedykolwiek dotąd. + Umarł w ekstazie + Udało ci się, witaj w niebie. + + Fotopsia + Pacjent doświadcza anomalii wizualnych w formie migających świateł i błysków. + Światła wydają się migać, czy to ty tylko widzisz dziwne rzeczy? Błyski zapełniają twoją wizję peryferalną. Coś na prawdę jest nie tak. + + Ataksja + Móżdżek pacjenta jest sparaliżowany, powodujące drgawki mięśni i okropną koordynację ruchową. + Twoje mięśnie wydają się mieć własne myśli. Cały czas kołyszesz się do przodu i do tyłu bez ostrzeżenia, a gdy próbujesz chodzić, kończysz tam, gdzie zacząłeś. + + Afazja + Pacjent doświadczył obrażeń ośrodka mowy, powodując niezdolność do składania pełnych zdań. + Nie jesteś w stanie złożyć w kupę normalnych zdań, używasz już tylko bezsensownych grymasów i paplań aby się wysłowić. + + Zapalenie nerwu wzrokowego + Płat potyliczny pacjenta ma poważne obrażenia, periodyczne oślepiając i dezoriętując go. + Twój wzrok jest periodycznie zapełniany ciemnością. Czy to już koniec? + + Kalok C + Cudodajny płyn który łączy ludzką hemoglobinę i plasmę stworzeń oceanu aby wykorzystać naturalną odporność i właściwości lecznicze kreatur Europy. Używany do leczenia szkieletu mięsniowego, systemu nerwowego, i jest w stanie tymczasowo wstrzymać krwotok mózgu. Powinno być wspomniane że z czasem lek będzie miał mniej zadowalające rezultaty i jest bardzo uzależniający. + Kortyzyd + Silna mieszanina środków przeciwbólowych i odciążających z nalepką pełną nieprzyjemnych skutków ubocznych. Często wstrzykiwany pomiędzy szwy czaszkowe w celu szybkiego zatamowania krwotoku mózgu. +Uwaga: wstrzyknięcie dawki leku w ten sposób przy zdrowym środowisku może spowodować niebezpieczny wzrost ciśnienia w czaszce. + Inteligętny przeszczep + Genetycznie zmodyfikowana tkanka łączna, przyjmująca DNA pacjenta, aby stymulować przyrost i regenerację tkanek pacjenta. Regularnie używane do leczenia pęknięć organów. + + Skafander bezechowy + Dyskretny, lekki strój zaprojektowany w celu absorbowania fal dźwiękowych sonaru. Oferuje niewielką ochronę przed uszkodzeniami mechanicznymi oprócz drgań, i wytrzymuje ciśnienie do poziomu 6000 metrów. + Pilot do nawigacji + Podręczne urządzenie, którego można używać do zdalnego sterowania sonarem i silnikami łodzi podwodnej. + + Ustawienia Real Sonar + Ustawienia Głośności + Głośność sygnałów w powietrzu + Głośność sygnałów w wodzie + Głośność sygnałów w strojach + Głośność szumienia w uszach + Głośność zniekształceń + Ustawienia sieci - Klient (Wymaga wpisania "cl_reloadlua" w konsolę) + Tryb niskiego opóźnienia (Eksperymentalne) + Eliminuje opóźnienie wytwarzane przez opóźnienie serwera. Może powodować Desync jeżeli serwer ma kontrastujące ustawienia konfiguracyjne. + Ustawienia gry - ustawienia hosta + Ustawienia gry + Zasięg sonaru (Tylko na tryb jednego gracza) + Obrażenia sonaru (nieliniowe) + Okręt podwodny + Włącz obrażenia od terminali nawigacyjnych. + Stacja nadajnika + Włącz obrażenia od ekranów sonaru. + Sonar statków transportowych + Włącz obrażenia od terminali nawigacyjnych transportowca. + Sonar wroga + Włącz pingi sonaru z okrętów podwodnych sterowanych przez NPC. + Niestandardowy sonar + Włącz obrażenia od terminali niestandardowe. Wyłączenie może poprawić wydajność. + Stworzenia + Włacz obrażenia dla kreatur nie będących człowiekiem. + Gracze + Włącz obrażenia dla graczy. + Boty + Włącz obrażenia dla botów. + Sprawdzanie obecności kadłuba dla kreatur + Dokładne sprawdzanie uderzeń dla kreatur. Wyłączenie może poprawić wydajność. + Sprawdzanie obecności kadłuba dla ludzi + Dokładne sprawdzanie uderzeń dla np. ludzi. Czy chcesz aby ludzie doznawali obrażeń w zbiornikach balastowych? + Intensywność wizualna uderzenia sonaru + Obniżenie prędkości od sonaru + Inne efekty wizualne (Krwotok mózgu, Kortyzyd, itp.):\nStandardowe + Inne efekty wizualne (Krwotok mózgu, Kortyzyd, itp.):\nZredukowane + Inne efekty wizualne (Krwotok mózgu, Kortyzyd, itp.):\nWyłączone + Ignorowane Nazwy Graczy + Ignorowane identyfikatory postaci + Odporność skafandra do nurkowania + Terminale sonaru + (Wymaga włączenia opcji "Niestandardowy sonar".) + Zresetuj + Zresetować wszystko + Nieprawidłowe dane wejściowe + Zamknąć + + Potrzebuję bezechowy sprzęt do nurkowania! + Potrzebuję bezechowego skafandra żeby naprawiać przy włączonym sonarze! + Muszę znaleźć bezechowy sprzęt do nurkowania! + Nie mogę znaleść bezechowego skafandra! Wyłączcie sonar! + Nie ma skafandrów bezechowych! Ja tam nie wchodzę! + Ja tam nie wchodzę tak długo, jak działa sonar! + Nie mam sprzętu ochronnego! Wyłączcie sonar! + Nie mogę wykonywać napraw dopóki sonar jest włączony! + Wyłączcie sonar! + Uszy mi krwiawią od tego obsranego sonaru! + Wyłączcie ten cholerny sonar! + Jestem w zasięgu sonaru! + Jezu, ten sonar jest tak głośny! + Jestem poza statkiem, wyłączcie sonar! + O boże, wyłączcie sonar! + Niech ktoś wyłączy sonar! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Russian.xml b/Real Sonar/Localisation/Info_Russian.xml new file mode 100644 index 0000000..86c1755 --- /dev/null +++ b/Real Sonar/Localisation/Info_Russian.xml @@ -0,0 +1,176 @@ + + + Мощность импульса активного сонара настолько высока, что вокруг передатчиков испаряется вода. + При работе поблизости подлодки или её корпуса рекомендуется носить звукоизолирующий скафандр. Обычные водолазные скафандры не защищают их пользователей от активного сонара. + Активный сонар подводной лодки может достигать 235дБ, что примерно в 724 раза громче, и в 3 миллиарда раза мощнее работающего реактивного двигателя. + Звуковые волны распространяются до четырёх раз дальше под водой, тем временем низкочастотные звуки, например от импульсов активного сонара подлодки, проникают ещё дальше. + Когда звук из воды попадает в воздушную среду, его громкость понижается на 80дБ (в 256 раз). Вместе с противоэховым покрытием корпуса подлодки, громкость активного сонара падает до безопасных для подводников уровней. + Корпуса подводных лодок покрыты звукоизолирующими плитками из резины с тысячами пустот. Такая конструкция была специально разработана для поглощения активного сонара и погашения звуков изнутри подлодки. + На близкой дистанции, импульс активного сонара может разорвать внутренние органы и вызвать внутреннее кровотечение. + Убедитесь, что за борту нету ни одного из ваших соратников перед включением активного сонара. + Внутри подлодки экипаж защищён от активного сонара. Однако, эта защита пропадает при бреше корпуса и затоплении. + Выключите активный сонар, если корпус разорван. Вашим механикам будет трудно справится с брешами, если у них лопнули барабанные перепонки. + Будьте осторожны при выходе в воду вблизи подлодки. Хватит лишь одного импульса сонара, чтобы потерять слух, повредить себе внутренние ткани, и в исключительных случаях, внутренние органы и мозг. + При активации маяков рекомендуется носить звукоизолирующий скафандр. Хоть сонар маяков не настолько мощен, как у подлодок, он всё равно может вас сильно покалечить. + От кровоизлияний в мозг, вызванных сонаром, пациента может спасти только кортизид. + Экстракт Моны может временно остановить сонарное кровоизлияние в мозг. После этого пациенту может помочь только кортизид. + Медикам не рекомендуется давать дозу экстракта моны пациенту, у которого в кровеносной системе есть его примеси. + Оберегайтесь балластных отсеков при работе активного сонара. Звуковые волны легко проходят через заполненные водой трубы. + Если долго не лечить последствия вибраций активного сонара, у пострадавшего могут развиться повреждения нервной системы и рабдомиолиз в некоторых мышцах. + В связи с высоким распространением подлодок для выживания в водах Европы, медицина прогрессировала в области лечения уникальных звуковых травм. Умные тканезаменители для перфорированных органов, кортизид для кровоизлияний в мозг, и экстракт моны для повреждённых тканей. + + Воздействие сонара подлодок + + Воздействие сонара маяков + + Акустическая травма + Барабанные перепонки пациента были перфорированы, вызывая кровотечение и тиннитус. + Ваши уши звенят, роняя время от времени капли крови, у вас кружится голова. + Отогенная смерть + Ты истек кровью через уши. + + Вибрационная травма + Пациент страдает от повреждений кровеносной системы, вероятно, из-за попадания в зону активности сонара. + Пациент пережил сильные повреждения артерий, нервов и мышц. + Внутренности пациента в плачевном состоянии. Крайне сильно повреждены артерии, нервная система, мышцы, кости. + Вы чувствуете вяло от боли по всему телу. Вы чувствуете, что по коже проходят множество иголок. + Ваши конечности онемели, и вы чувствуете колящую боль повсюду по вашему телу. + Вы не чувствуете свои конечности, лишь нескончаемую боль, будто каждую клетку тела разорвало. + Погибает от внутренних повреждений + Ваши внутренности были разорваны. + + Повреждение нервной системы + Нервная система пациента была повреждена вибрациями. Ежедневная рутина выполняется с трудом. + Ваши руки онемели, из-за неуклюжести вы менее эффективно работаете. + + Рабдомиолиз + Мышцы пациента начали распадаться в кровеносную систему. + Большинство мышц пациента некрозировали, в крови опасное количество белков. + Вы чувствуете замедленность, ваши ноги вспухли, вызывая боль. + Ваши ноги хрупко чувствуются. Ходить практически невозможно, из-за неуморимой боли. + Погибает от почечного разрушения + Ваши мышцы выпустили летальное количество белков в кровь. + + Лопнутые лёгкие + Лёгкие пациента лопнули из-за воздействия импульса сонара. + Лёгкие пациента были уничтожены мощными вибрациями, вызывая гипоксемию, у пациента высокий шанс гибели от удушья. + Вы чувствуете боль в туловище. Вам трудно дышать. + Вы еле дышите между выкашливанием крови, каждый вдох вызывает агонию. + Утонул в своей крови + Вы утонули в своей крови из-за лопнутых лёгких. + + Кровоизлияния мозга + Мозг пациента кровотечёт из-за воздействия активного сонара. К счастью, хуже оно не становится. + Бóльшая часть мозговой выемки превратилась в сжиженную жидкость. Мозг пациента тонет в своей крови, состояние быстро ухудшается. + Мозг пациента был сжижен активным сонаром. + Ваше зрение и мысли будто туманные. + Вы не можете думать. Виднеются вспышки, чувствуется парализующий, металлический вкус. Вы хотите крикнуть, но не можете. Вы теряете контроль над движением, реальность будто медленно от вас уходит. + Вы ничего не можете воспринять или почувствовать, кроме туманной пустоты. + Погибает от смерти мозга + Ваш мозг расплавил активный сонар. + + Действие Моны + На эту конечность действуют целебные свойства экстракта Моны. + Вы чувствуете слабый напор и успокаивающую теплоту в глубине. + + Передоз Моны + У пациента опасное количество Моны в крови. + Вы чувствуете превосходно. + Умер в экстазе + Вы сделали это, добро пожаловать в рай. + + Фотопсия + Пациент испытывает визуальные аномалии, главным образом мерцание и яркие вспышки. + Свет видно мерцает, может, вам кажется? Редкие вспышки света заполняют вашу периферию. Что-то определённо не так. + + Атаксия + Мозжечок пациента подавлен, случайным образом спазмируют мышцы, координация нарушена. + Ваши конечности будто думают сами. Вы постоянно дёргаетесь вперёд без внимания, когда пытаетесь двигаться, оказываетесь там же, где начали. + + Афазия + Пациент не способен составлять полные предложения, из-за повреждения мозга. + Вы не способны закончить простые предложения, возникают проблемы с составлением слов, иногда вместо этого выдаёте непонятное бормотание. + + Воспаление зрительного нерва + Затылочная доля мозга пациента повреждена, периодически ослепляя и дизоиентируя его. + Ваше зрение периодически затуманивается темнотой. Это конец? + + Экстракт Моны + Мона - "чудо-жидкость", смешиваюшая человеческие гемоглобины с ксено-плазмой, в целях перенять естественную устойчивость и регенерирующие свойства у подводной фауны Европы. Используется для лечения внутренних повреждений мышечной и нервной систем, и способна временно остановить кровоизлияния в мозг. Следует заметить, что повторное использование более слабо укрепляет эффект, есть риск передоза. + Кортизид + Концентрированная смесь противоболевых и противобаровых препаратов с кучей неприятных последствий. Обычно иньецируется в голову последним шансом для лечения кровоизлияний в мозг. +Внимание: Введение в здоровую мозговую среду может привести к опасному повышению давления в черепе. + Умный тканезаменитель + Созданная генной инженерией соединительная ткань, принимающая на себя ДНК пациента, стимулирующая регенерацию сложных анатомических систем. Обычно используется для восстановления перфорированных органов. + + Звукоизолирующий скафандр + Скрытный, легковесный скафандр, созданный для поглощения звуковых волн активного сонара, используя безэховое покрытие. В некоторой степени защищает и выдерживает давление на глубине до 6 000 м. + Пульт навигации + Портативное устройство, позволяющее дистанционно контролировать сонар и двигатели подлодки. + + Настройки Real Sonar + Настройки громкости + Громкость импульса в воздухе + Громкость импульса под водой + Громкость импульса + Громкость эффекта тиннита + Громкость оглушения + Сетевые настройки - Клиент (требуют "cl_reloadlua") + Режим пониженной задержки (экспериментальный) + Исправляет задержки, созданные высоким пингом к серверу. Может вызвать рассинхрон при несовпадающих конфигурациях. + Настройки геймплея - Сервер + Настройки геймплея + Радиус сонара (только для singleplayer) + Урон сонара (нелинейный) + Сонар подлодок + Урон от активного сонара навигационных терминалов. + Сонар радиомаяков + Урон от активного сонара радиомаяков (через монитор сонара). + Сонар челноков + Урон от активного сонара навигационных терминалов шаттла. + Сонар вражеский + Включить сигналы сонара от подводных лодок под управлением NPC. + Сонар пользовательский + Урон от активного сонара пользовательский навигационных терминалов. Выключение может улучшить производительность. + Урон существам + Включить урон нечеловеческим сущностям. + Урон игрокам + Включить урон игрокам. + Урон NPC-подводникам + Включить урон ботам. + Урон существам внутри подлодок + Включает точные расчёты ударов активного сонара для существ. Выключение может улучшить производительность. + Урон людям внутри подлодок + Включает точные расчёты ударов активного сонара для людей. Защищает людей от сонара в балластах. + Визуальная мощность эффектов сонара + Замедление после удара сонаром + Другие эффекты (кровоизлияний в мозг, кортизида, и т.д.):\nСтандартные + Другие эффекты (кровоизлияний в мозг, кортизида, и т.д.):\nСнижены + Другие эффекты (кровоизлияний в мозг, кортизида, и т.д.):\nВыключены + Игнорируемые имена игроков + Игнорируемые идентификаторы персонажей + Скафандр сопротивления + Пользовательский терминалов + (Требовать активация "Сонар пользовательский") + Сбросить + Сбросить все + Неверный Ввод + Закрывать + + Надо найти звукоизолирующий скафандр! + Мне нужен безэховый скафандр, чтобы чинить со включенным сонаром! + Мне нужно изолирующее снаряжение! + Я не нахожу изолирующих скафандров! Отключите сонар! + У нас нет безэховых скафандров! Я туда не полезу! + Я не пойду туда, пока сонар включён! + Мне нечем изолироваться! Выключите сонар! + Я не смогу ничего починить, выключите сонар! + Выключите сонар! + Мои уши болят от чёртового сонара! + Отключите сонар! + Меня застало в сонаре! + Какой же громкий этот сонар! + Я под водой, отключите сонар! + Боже, отключите сонар! + Кто-нибудь, отключите сонар! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_SimplifiedChinese.xml b/Real Sonar/Localisation/Info_SimplifiedChinese.xml new file mode 100644 index 0000000..050a3e6 --- /dev/null +++ b/Real Sonar/Localisation/Info_SimplifiedChinese.xml @@ -0,0 +1,175 @@ + + + 主动声纳的脉冲强度足以使声呐换能器周围的水沸腾。 + 建议在潜艇周围水下作业时穿上吸音潜水服。一般潜水服无法保护你免受主动声纳的影响。 + 一艘潜艇的主动声纳发射的脉冲强度可以达到235分贝,这大约是噪音的724倍,是喷气式发动机强度的31.6亿倍。 + 声波在水中传播的距离是四倍。低频的声音,如潜艇主动声纳发出的脉冲,会传播得更远。 + 当声波从水中传播到空气中时,其强度会降低80分贝(噪音的256倍)。加上潜艇外壳上的消声瓦,可以使船员免受主动声纳的影响。 + 潜艇船体上覆盖着消声涂层与消声瓦,这些橡胶瓦含有成千上万个小空洞,旨在吸收主动声纳和来自船内的声音。 + 在近距离内,主动声纳脉冲的强度足以使器官破裂并导致内出血。 + 在启动主动声纳之前,确保你的船员都不在船体的安全范围之外。 + 在潜艇的内部,船员可以免受主动声纳的影响。然而,一旦船体被破坏,水流进来,这种屏蔽就会消失。 + 如果船体完整性被破坏,请关闭主动声纳。耳膜破裂的工程师进行修补漏洞工作将会十分困难。 + 在潜水艇附近潜水时要小心。一个主动声纳脉冲就能导致听力丧失、组织损伤,在极端情况下,还会导致器官破裂和脑出血。 + 建议在启用活动声纳时带上无回声潜水服。虽然不如潜艇的主动声纳强大,但信标发出的声纳脉冲仍然可能造成严重伤害。 + 科达灵是拯救由声纳引起脑出血患者的唯一方法。 + 吗哪提取物可以暂时阻止声纳引起的脑出血的发展。在此之后,科达灵是唯一的选择。 + 如果患者体内已经有吗哪提取物,则不建议再次使用。 + 当主动声纳启动时,远离压载舱。声波可以轻易通过充满水的管道传播。 + 如果未能及时治疗,主动声纳造成的振动损伤可能会导致神经损伤和受影响肌肉的溶血性肌炎。 + 随着潜艇成为欧罗巴的一种生活方式,医学已经发展到可以治疗独特的声纳相关损伤。如组织移植物治疗器官穿孔,科达灵治疗脑出血,吗哪提取物治疗组织损伤。 + + 潜艇声呐 + + 信标声呐 + + 声波创伤 + 患者的耳膜穿孔,导致出血和耳鸣。 + 你的耳朵嗡嗡作响,滴着血,你感到头晕目眩,混乱不堪。 + 耳源性死亡 + 你从耳朵里流血而死。 + + 振动损伤 + 患者受到强烈声波振动对其循环系统造成的轻微损伤。 + 患者的动脉、神经和肌肉受到严重损伤。 + 患者的内脏破碎。动脉、神经、肌肉和骨骼受到毁灭性损伤。 + 你感觉全身都有沉闷的疼痛。你的皮肤像有针扎一样发出麻麻的感觉。 + 你的四肢麻木,全身都有针扎般的尖锐疼痛。 + 你感觉不到四肢。你只感觉到剧烈的疼痛,就像你的每个细胞都被撕裂了一样。 + 灾难性的内部损伤 + 你的内脏被撕裂了。 + + 神经损伤 + 患者的神经因振动而受损。日常工作更加困难。 + 你的手感觉麻木,你的笨拙反应使你的工作效率降低。 + + 肌肉溶解症 + 患者的肌肉开始分解成蛋白质并渗入血液。 + 患者的大部分肌肉已经坏死,致命量的蛋白质正在流入血液。 + 你感到疲乏,双腿肿胀疼痛。 + 你的双腿感觉虚弱。几乎无法行走,痛苦无法估量。 + 肾衰竭 + 你的肌肉向血液中释放了致命量的蛋白质。 + + 肺部破裂 + 患者的肺部因声纳振动而破裂。 + 患者的肺部被剧烈振动撕裂,导致低氧血症,极有可能窒息。 + 你的胸部刺痛。呼吸困难。 + 你开始咳血,几乎无法呼吸,每一次呼吸都非常痛苦。 + 淹死在自己的血液里 + 你因为严重的肺损伤而被自己的血液淹死。 + + 脑出血 + 患者的大脑因暴露于主动声纳而导致出血,幸运的是情况似乎并没有变得更糟。 + 患者的大脑皮层大部分已经融化成了稀泥,大脑已经淹没在自己的血液中,情况只会越来越糟。 + 患者的大脑被主动声纳融化了。 + 你的视线模糊,思维感觉迷茫。 + 你无法思考。你看到莫名的闪光,感受到金属的味道。你想尖叫,但你无法发出声音。你失去了对所有运动功能的控制,现实正在慢慢消失。 + 脑死亡 + 你的大脑被主动声纳融化了。 + + 吗哪提取物治疗 + 这个肢体受到吗哪提取物的治疗影响。 + 你感到皮肤下有一种温和的压力和舒适的温暖。 + + 吗哪过量 + 病人血液中含有危险含量的吗哪。 + 你感觉很棒。 + 死于狂喜 + 你做到了,欢迎来到天堂。 + + 光点症 + 患者的视觉异常表现为闪烁的灯光和明亮的闪光。 + 灯光好像在闪烁,你看到什么了吗?闪烁的光点充满了你的视野。一定是出了什么问题。 + + 共济失调 + 患者的小脑受损,导致肌肉无意识抽搐和糟糕的协调能力。 + 你的肌肉似乎有自己的意识。你总是毫无征兆地向前蹒跚,当你试图走路时,你最终会回到原来的位置。 + + 失语症 + 患者的布罗卡区(语言中枢)受到损伤,导致患者无法说出完整的句子。 + 你无法完成基本的句子,在组织词语方面有极大的困难,有时会出现语无伦次的喃喃自语。 + + 视神经炎 + 患者的枕叶受到严重损伤,会导致周期性失明和失去方向感。 + 你的视力周期性地被黑暗笼罩。这就是结局吗? + + 吗哪提取物 + 一种奇迹液体,将人类血红蛋白与外星血浆融合,以利用欧罗巴水下居民的自然恢复力和愈合特性。用于治疗肌肉和神经系统的内部损伤,并能暂时阻止脑出血。应该注意的是,反复使用效果有限,并有超剂量的风险。 + 科达灵 + 一种用于缓解疼痛和压力的强效药物混合物,有许多令人讨厌的副作用。通常作为治疗脑出血的最后手段,注射到颅内。 +警告:在健康的脑环境中注射药物可能会导致颅内压力增加的风险。 + 组织移植物 + 一种智能组织移植物,通过遗传工程技术改造的连接组织,继承患者的DNA,以刺激器官的再生。通常用于修复穿孔的器官。 + + 吸音潜水服 + 一种灵巧轻便的潜水服,特制的消声镀层可以吸收潜艇主动声纳的声波。它可以提供轻微的保护,可以承受最高6000米的压力。 + 导航遥控器 + 一种手持设备,可用于远程控制潜艇的声纳和引擎。 + + 真实声纳设置 + 音量设置 + 声纳脉冲音量(空气) + 声纳脉冲音量(水下) + 声纳脉冲音量(潜水服) + 耳鸣音量 + 失真音量 + 网络设置 - 仅客户端(需要在控制台输入"cl_reloadlua") + 低延迟模式(实验性) + 消除由高服务器延迟引起的延迟。如果服务器配置选项不同,可能会导致视觉错误或不同步。 + 游戏设置 - 仅主机 + 游戏设置 + 声纳范围(仅单人游戏) + 声纳伤害(非线性) + 潜艇声纳 + 启用导航终端的功能。 + 信标声纳 + 启用声纳监视器的功能。 + 穿梭机声纳 + 启用穿梭机终端的功能。 + 敌方声呐 + 启用由NPC控制的潜艇的声呐信号。 + 自定义声纳 + 启用自定义终端的功能。禁用可能会提高性能。 + 目标生物 + 启用对所有非人类生物的伤害。 + 目标玩家 + 启用对玩家的伤害。 + 目标机器人 + 启用对机器人的伤害。 + 生物船体检测 + 生物的准确声纳命中检测。禁用可能会提高性能。 + 人类船体检测 + 人类的准确声纳命中检测,例如,你是否希望人类在压载舱中受到保护? + 声纳影响视觉强度 + 声纳移动速度惩罚 + 其他视觉效果(脑出血、科达灵等):\n标准 + 其他视觉效果(脑出血、科达灵等):\n降低 + 其他视觉效果(脑出血、科达灵等):\n禁用 + 忽略的玩家名称 + 忽略的角色ID + 潜水服抗性 + 声纳终端 + (需要启用"自定义声纳"选项) + 重置 + 重置全部 + 无效输入 + 关闭 + + 我需要吸音潜水服! + 我需要一件吸音潜水服,才能在打开声纳时进行维修工作! + 我需要找一套吸音潜水服! + 我找不到吸音潜水服! 关掉声纳! + 这里没有吸音潜水服! 我才不要进去呢! + 在声纳关闭之前,我是不会进去的! + 我没有任何保护措施!关掉声纳! + 在声纳关闭之前,我无法进行维修工作! + 关掉声纳! + 我的耳朵都被那该死的声纳震出血了! + 把声纳关掉! + 关掉那该死的声呐! + 天啊,声纳的声音太大了! + 我在水里,关掉声纳! + 天啊,关掉声纳! + 谁能把声纳关了! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_TraditionalChinese.xml b/Real Sonar/Localisation/Info_TraditionalChinese.xml new file mode 100644 index 0000000..550cb18 --- /dev/null +++ b/Real Sonar/Localisation/Info_TraditionalChinese.xml @@ -0,0 +1,175 @@ + + + 主動聲納的脉冲強度足以使換能器周圍的水沸騰。 + 在潛艇周圍工作時,建議穿著消聲潛水服。普通潛水服無法保護你免受主動聲納的影響。 + 潛艇的主動聲納可達235分貝,大約是噴氣發動機的724倍響度,強度是其31.6億倍。 + 聲波在水中傳播的距離是空氣中的四倍。低頻聲音,如潛艇主動聲納的脉冲聲,傳播得更遠。 + 當聲音從水傳播到空氣中時,強度會降低80分貝(聲音減弱256倍)。這一點,再加上潛艇的消聲瓦外殼,使潛艇乘員免受主動聲納的傷害。 + 潛艇外殼覆蓋著消聲瓦,這是含有數千個微小空隙的橡膠瓦,設計用於吸收主動聲納並減弱從船內發出的聲音。 + 在近距離內,主動聲納脉冲的強度足以破裂器官並導致內出血。 + 啟用主動聲納前,確保沒有船員在船體安全區域之外。 + 在潛艇內部,船員受到自身主動聲納的保護。然而,一旦船體破裂,水流進入,這種保護就消失了。 + 如果船體破裂,請關閉主動聲納。如果工程師的耳膜破裂,他們將很難修復洩漏。 + 在潛艇附近潛水時要小心。單次聲納脉冲可能導致聽力損失、組織損傷,在極端情況下,還可能導致器官破裂和腦出血。 + 激活信標站時,建議帶上消聲潛水服。雖然不如潛艇的聲納強大,但信標發出的聲納脉冲仍可能造成嚴重傷害。 + 科達靈是唯一能夠挽救聲納引起的腦出血患者的方法。 + 曼納提取物可以暫時阻止聲納引起的腦出血進展。之後,科達靈是唯一的選擇。 + 如果患者體內已有曼納提取物的痕跡,不建議再次使用。 + 主動聲納啟用時,遠離壓載艙。聲波可以輕易地通過充滿水的管道傳播。 + 如果不及時治療,主動聲納引起的振動損傷可能導致神經損傷和受影響肌肉的橫紋肌溶解症。 + 隨著潛艇成為歐羅巴生活方式的一部分,醫學已經進步到可以治療獨特的聲納相關傷害。智能移植物用於穿孔器官,科達靈用於腦出血,曼納提取物用於組織損傷。 + + 潛艇聲納 + + 信標聲納 + + 聲波創傷 + 患者的耳膜已被穿孔,導致出血和耳鳴。 + 你的耳朵在嗡鳴並流血,感到頭暈目眩。 + 耳源性死亡 + 你因耳朵大出血而死亡。 + + 振動損傷 + 患者因強烈的聲納振動而導致循環系統輕微損傷。 + 患者的動脈、神經和肌肉受到嚴重損傷。 + 患者的內部組織支離破碎。動脈、神經、肌肉和骨骼都受到毀滅性損傷。 + 你全身感到鈍痛。皮膚刺痛,好像被針扎了一樣。 + 你的四肢麻木,全身感到針刺般的劇痛。 + 你感覺不到四肢。你只感到劇烈的疼痛,好像身體的每個細胞都被撕裂了。 + 災難性內部損傷 + 你的內臟被撕裂了。 + + 神經損傷 + 患者的神經因振動而受損。日常任務變得更加困難。 + 你的手感到麻木,笨拙導致工作效率降低。 + + 橫紋肌溶解症 + 患者的肌肉開始分解並流入血液。 + 患者的大部分肌肉已壞死,危險量的蛋白質正在流入血液。 + 你感到無力,腿部腫脹疼痛。 + 你的腿感覺非常虛弱。行走幾乎不可能,疼痛難以忍受。 + 腎衰竭 + 你的肌肉釋放了致命量的蛋白質進入血液。 + + 肺破裂 + 患者的肺因聲納振動而破裂。 + 患者的肺因極端振動而被撕裂,導致缺氧症和高概率窒息。 + 胸部有刺痛感。呼吸變得更加困難。 + 你幾乎無法在咳血之間呼吸,每次吸氣都伴隨著劇痛。 + 溺死在自己的血液中 + 由於嚴重的肺損傷,你溺死在自己的血液中。 + + 腦出血 + 患者的大腦因接觸主動聲納而出血。幸運的是,似乎沒有惡化。 + 患者大腦的大部分區域已經融化成漿糊。大腦正在自己的血液中溺水,而且情況正在惡化。 + 患者的大腦已被主動聲納融化。 + 你的視線模糊,思維感到混沌。 + 你無法思考。你看到閃光並嚐到金屬味。你想尖叫,但做不到。你正在失去所有運動功能的控制,現實正在慢慢消逝。 + 腦死亡 + 你的大腦被主動聲納融化了。 + + 曼納影響 + 這個肢體正在受到曼納提取物的治療影響。 + 你感到皮膚下有輕微的壓力和舒適的溫暖。 + + 曼納過量 + 患者血液中含有危險量的曼納。 + 你感覺棒極了。 + 在狂喜中死亡 + 你成功了,歡迎來到天堂。 + + 光視症 + 患者正經歷視覺異常,表現為閃爍的光和明亮的閃光。 + 燈光似乎在閃爍,你是不是看到了什麼?明亮的閃光充滿了你的周邊視野。肯定有什麼不對勁。 + + 共濟失調 + 患者的小腦受到嚴重損傷,導致不自主肌肉痙攣和糟糕的協調能力。 + 你的肌肉似乎有自己的想法。你不斷地毫無預警地向前傾倒,當你試圖行走時,最後總是回到原點。 + + 失語症 + 患者的布洛卡區受損,無法用完整的句子說話。 + 你無法完成基本的句子,形成單詞極其困難,有時會變成不連貫的咕噥。 + + 視神經炎 + 患者的枕葉嚴重受損,周期性地導致失明和方向感喪失。 + 你的視線周期性地被黑暗籠罩。這是終結嗎? + + 曼納提取物 + 神奇液體,將人類血紅蛋白與外星等離子體融合,利用歐羅巴水下居民的天然恢復力和癒合特性。用於治療肌肉和神經系統的內部損傷,能夠暫時停止腦出血。需要注意的是,重複使用會產生遞減效果,並有過量風險。 + 科達靈 + 一種強效的止痛和減壓藥物混合物,伴有一系列嚴重的副作用。通常作為治療腦出血的最後手段注射到顱骨內。 +警告:在健康的大腦環境中使用可能導致顱內壓力危險增加。 + 智能移植物 + 遺傳工程改造的結締組織,繼承患者的DNA以刺激複雜解剖系統的再生。通常用於修復穿孔器官。 + + 消聲潛水服 + 一種隱形、輕量級的潛水服,設計用於吸收主動聲納的聲波,配備消聲板。它提供輕微的傷害保護,可以承受高達6,000米的壓力。 + 導航遙控器 + 一種手持設備,可用於遠程控制潛艇的聲納和引擎。 + + 真實聲納設置 + 音量設置 + 空氣脉冲音量 + 水中脉冲音量 + 潛水服脉冲音量 + 耳鳴音量 + 失真音量 + 網絡設置 - 僅客戶端(需要在控制台輸入"cl_reloadlua") + 低延遲模式(實驗性) + 消除由高服務器延遲引起的延遲。如果服務器配置選項不同,可能會導致視覺錯誤或不同步。 + 遊戲設置 - 僅主機 + 遊戲設置 + 聲納範圍(僅單人遊戲) + 聲納傷害(非線性) + 潛艇聲納 + 啟用導航終端的功能。 + 信標聲納 + 啟用聲納監視器的功能。 + 穿梭機聲納 + 啟用穿梭機終端的功能。 + 敵方聲納 + 啟用由NPC控制的潛艇的聲納信號。 + 自定義聲納 + 啟用自定義終端的功能。禁用可能會提高性能。 + 目標生物 + 啟用對所有非人類生物的傷害。 + 目標玩家 + 啟用對玩家的傷害。 + 目標機器人 + 啟用對機器人的傷害。 + 生物船體檢測 + 生物的準確聲納命中檢測。禁用可能會提高性能。 + 人類船體檢測 + 人類的準確聲納命中檢測,例如,你是否希望人類在壓載艙中受到保護? + 聲納影響視覺強度 + 聲納移動速度懲罰 + 其他視覺效果(腦出血、科達靈等):\n標準 + 其他視覺效果(腦出血、科達靈等):\n降低 + 其他視覺效果(腦出血、科達靈等):\n禁用 + 忽略的玩家名稱 + 忽略的角色ID + 潛水服抗性 + 聲納終端 + (需要啟用"自定義聲納"選項) + 重置 + 重置全部 + 無效輸入 + 關閉 + + 我需要消聲潛水裝備! + 我需要消聲潛水服才能在聲納開啟時進行修理! + 需要找到消聲潛水服! + 我找不到消聲潛水服!關掉聲納! + 沒有消聲潛水服!我不進去! + 聲納關閉之前我不進去! + 我沒有防護裝備!關掉聲納! + 聲納關閉之前我無法進行修理! + 關掉聲納! + 那該死的聲納讓我耳朵流血了! + 關掉聲納! + 我被聲納困住了! + 天哪,這聲納太響了! + 我在水裡,關閉聲納! + 天啊,關閉聲納! + 誰來關掉聲納! + \ No newline at end of file diff --git a/Real Sonar/Localisation/Info_Turkish.xml b/Real Sonar/Localisation/Info_Turkish.xml new file mode 100644 index 0000000..c6dda37 --- /dev/null +++ b/Real Sonar/Localisation/Info_Turkish.xml @@ -0,0 +1,175 @@ + + + Aktif sonarın ping yoğunluğu, dönüştürücülerin etrafındaki suyu kaynatacak kadar güçlüdür. + Bir denizaltının etrafında çalışırken anekoyik dalış kıyafeti giymeniz önerilir. Tipik bir dalış kıyafeti sizi aktif sonardan korumayacaktır. + Bir denizaltının aktif sonarı 235 desibele ulaşabilir, bu bir jet motorundan yaklaşık 724 kat daha yüksek ve 3.16 milyar kat daha yoğun bir ses şiddetidir. + Ses dalgaları suda dört kat daha uzağa yayılır. Bir denizaltının aktif sonarından gelen pingler gibi düşük frekanslı sesler daha da uzağa nüfuz eder. + Ses sudan havaya yayıldığında, yoğunluğu 80 desibel (256 kat daha sessiz) azalır. Bu, denizaltının anekoyik kaplı gövdesiyle birlikte, denizcileri aktif sonardan korur. + Denizaltı gövdeleri, aktif sonarı emmek ve gemi içinden yayılan sesleri zayıflatmak için tasarlanmış, binlerce küçük boşluk içeren kauçuk karolardan oluşan anekoyik karolarla kaplanmıştır. + Yakın mesafede, aktif sonar pinginin yoğunluğu organları yırtacak ve iç kanamaya neden olacak kadar güçlüdür. + Aktif sonarı etkinleştirmeden önce mürettebatınızdan hiçbirinin gövdenin güvenliğinin dışında olmadığından emin olun. + Bir denizaltının duvarları içinde, mürettebat kendi aktif sonarlarından korunur. Ancak, gövde delinip su içeri aktığında bu koruma ortadan kalkar. + Gövde delinirse aktif sonarı kapatın. Kulak zarları yırtılmışsa mühendislerinizin sızıntıyı onarması zor olacaktır. + Bir denizaltının yakınında dalış yaparken dikkatli olun. Tek bir sonar pingi işitme kaybına, doku hasarına ve aşırı durumlarda organ yırtılmasına ve beyin kanamasına neden olabilir. + İşaret istasyonlarını etkinleştirirken anekoyik dalış kıyafeti getirmeniz önerilir. Bir denizaltınınki kadar güçlü olmasa da, bir işaretçiden gelen sonar pingi hala ciddi yaralanmalara neden olabilir. + Cortizide, bir hastayı sonarın neden olduğu beyin kanamasından kurtarmanın tek yoludur. + Manna özütü, sonarın neden olduğu bir beyin kanamasının ilerlemesini geçici olarak durdurabilir. Bundan sonra, Cortizide tek seçenektir. + Hastanın sisteminde zaten Manna Özütü izleri varsa, ek doz uygulamak tavsiye edilmez. + Aktif sonar etkinken balast tanklarından uzak durun. Ses dalgaları, su dolu borulardan kolayca yayılabilir. + Tedavi edilmezse, aktif sonardan kaynaklanan titreşim hasarı, etkilenen kaslarda sinir hasarına ve rabdomiyolize neden olabilir. + Denizaltılar Europa'da bir yaşam tarzı haline geldiğinden, tıp benzersiz sonarla ilgili yaralanmaları tedavi etmek için ilerlemiştir. Delinmiş organlar için akıllı greftler, beyin kanamaları için Cortizide ve doku hasarı için Manna Özütü. + + Denizaltı sonarı + + İşaret istasyonu sonarı + + Akustik travma + Hastanın kulak zarları delinmiş, kanamaya ve kulak çınlamasına neden olmuştur. + Kulaklarınız çınlıyor ve kan damlıyor, kendinizi sersem ve kafası karışmış hissediyorsunuz. + Otojenik ölüm + Kulaklarınızdan kan kaybederek öldünüz. + + Titreşim hasarı + Hasta, yoğun sonar titreşimlerinin neden olduğu dolaşım sisteminde hafif hasardan muzdarip. + Hasta, atardamarlarında, sinirlerinde ve kaslarında ciddi hasar görmüş. + Hastanın içi paramparça. Atardamarlarında, sinirlerinde, kaslarında ve kemiklerinde yıkıcı hasar var. + Vücudunuzun her yerinde künt bir ağrı hissediyorsunuz. Cildiniz karıncalanıyor sanki iğne batıyormuş gibi. + Uzuvlarınız uyuşmuş ve vücudunuzun her yerinde iğne büyüklüğünde keskin ağrılar hissediyorsunuz. + Uzuvlarınızı hissedemiyorsunuz. Hissettiğiniz tek şey, vücudunuzdaki her hücrenin paramparça edilmiş gibi dayanılmaz bir acı. + Felaket düzeyinde iç hasar + İç organlarınız parçalandı. + + Sinir hasarı + Hastanın sinirleri titreşimlerden zarar görmüş. Günlük görevler daha zor hale gelmiş. + Elleriniz uyuşmuş hissediyor, sakarlığınız daha az verimli çalışmanıza neden oluyor. + + Rabdomiyoliz + Hastanın kasları parçalanmaya başlamış ve kan dolaşımına dökülüyor. + Hastanın kaslarının çoğu nekroza uğramış ve tehlikeli miktarda protein kan dolaşımına dökülüyor. + Kendinizi halsiz hissediyorsunuz, bacaklarınız şişmiş ve ağrıyor. + Bacaklarınız çok zayıf hissediyor. Yürümek neredeyse imkansız ve acı ölçülemez boyutta. + Böbrek yetmezliği + Kaslarınız kan dolaşımınıza ölümcül miktarda protein saldı. + + Akciğer yırtılması + Hastanın akciğerleri sonar titreşimlerinden yırtılmış. + Hastanın akciğerleri aşırı titreşimler nedeniyle parçalanmış, hipoksemi ve yüksek boğulma olasılığına yol açmış. + Göğsünüzde keskin bir ağrı var. Nefes almak daha zor. + Kan öksürürken zor nefes alabiliyorsunuz, her nefes alışınız acı veriyor. + Kendi kanında boğuldu + Ciddi akciğer hasarı nedeniyle kendi kanınızda boğuldunuz. + + Beyin kanaması + Hastanın beyni aktif sonara maruz kalmaktan kanıyor. Neyse ki daha kötüye gitmiyor gibi görünüyor. + Hastanın beyninin büyük kısımları çamura dönüşmüş. Beyin kendi kanında boğuluyor ve durum giderek kötüleşiyor. + Hastanın beyni aktif sonar tarafından eritilmiş. + Görüşünüz bulanık ve zihniniz sisli hissediyor. + Düşünemiyorsunuz. Yanıp sönen ışıklar görüyor ve metal tadı alıyorsunuz. Çığlık atmak istiyorsunuz ama yapamıyorsunuz. Tüm motor fonksiyonlarınızın kontrolünü kaybediyorsunuz ve gerçeklik yavaşça kayıp gidiyor. + Beyin ölümü + Beyniniz aktif sonar tarafından eritildi. + + Manna etkisi + Bu uzuv Manna Özütünün iyileştirici etkisi altında. + Cildin altında nazik bir basınç ve rahatlatıcı bir sıcaklık hissediyorsunuz. + + Manna aşırı dozu + Hastanın kanında tehlikeli miktarda Manna var. + Kendinizi harika hissediyorsunuz. + Coşku içinde öldü + Başardınız, cennete hoş geldiniz. + + Fotopsi + Hasta, titreşen ışıklar ve parlak flaşlar şeklinde görsel anomaliler yaşıyor. + Işıklar titreşiyor gibi görünüyor, bir şeyler mi görüyorsunuz? Görüş alanınızın kenarlarını ışık flaşları dolduruyor. Kesinlikle bir şeyler yanlış. + + Ataksi + Hastanın beyinciği felç olmuş, istemsiz kas spazmlarına ve korkunç koordinasyona yol açıyor. + Kaslarınızın kendi aklı varmış gibi görünüyor. Uyarı olmadan sürekli öne doğru sendeliyorsunuz ve yürümeye çalıştığınızda, başladığınız yere geri dönüyorsunuz. + + Afazi + Hasta, beynin Broca bölgesinde hasar almış, tam cümleler kurabilme yeteneğini kaybetmiş. + Basit cümleleri bile tamamlayamıyor ve kelime oluşturmakta aşırı zorluk çekiyorsunuz, bazen anlamsız mırıldanmalara başvuruyorsunuz. + + Optik nörit + Hastanın oksipital lobu ciddi şekilde hasar görmüş, periyodik olarak hastayı kör ediyor ve yönünü kaybettiriyor. + Görüşünüz periyodik olarak karanlıkla kaplanıyor. Bu son mu? + + Manna Özütü + İnsan hemoglobinlerini yabancı plazma ile birleştirerek Europa'nın sualtı sakinlerinin doğal dayanıklılığını ve iyileştirici özelliklerini kullanan mucizevi sıvı. Kas ve sinir sistemindeki iç hasarı tedavi etmek için kullanılır ve geçici olarak beyin kanamasını durdurabilir. Tekrarlanan kullanımın azalan getiriler ürettiği ve aşırı doz riskine yol açtığı unutulmamalıdır. + Cortizide + Bir dizi nahoş yan etkiye sahip güçlü bir ağrı ve basınç giderici ilaç karışımı. Genellikle beyin kanamasını tedavi etmek için son çare olarak kafatasına enjekte edilir. +Uyarı: Sağlıklı bir beyin ortamına uygulanması kafatasında tehlikeli bir basınç artışına neden olabilir. + Akıllı Greft + Karmaşık anatomik sistemlerin yenilenmesini uyarmak için hastanın DNA'sını miras alan genetik olarak mühendislik ürünü bağ dokusu. Genellikle delinmiş organları onarmak için kullanılır. + + Anekoyik Dalış Kıyafeti + Anekoyik kaplamasıyla aktif sonarın ses dalgalarını emmek için tasarlanmış gizli, hafif bir kıyafet. Hasara karşı küçük bir koruma sağlar ve 6.000 metreye kadar basınca dayanabilir. + Seyir Uzaktan Kumandası + Denizaltının sonarını ve motorlarını uzaktan kontrol etmek için kullanılabilen el cihazı. + + Gerçek Sonar Ayarları + Ses Ayarları + Hava Ping Sesi + Su Ping Sesi + Kıyafet Ping Sesi + Kulak Çınlaması Sesi + Distorsiyon Sesi + Ağ Ayarları - Sadece İstemci (Konsolda "cl_reloadlua" gerektirir) + Düşük Gecikme Modu (Deneysel) + Sunucuya yüksek ping'den kaynaklanan gecikmeyi ortadan kaldırır. Sunucu farklı yapılandırma seçeneklerine sahipse görsel hatalara veya eşzamansızlığa neden olabilir. + Oynanış Ayarları - Sadece Sunucu + Oynanış Ayarları + Sonar Menzili (Sadece tek oyunculu) + Sonar Hasarı (Doğrusal olmayan) + Denizaltı Sonarı + Seyir Terminallerinin işlevselliğini etkinleştirir. + İşaret İstasyonu Sonarı + Sonar Monitörlerinin işlevselliğini etkinleştirir. + Mekik Sonarı + Mekik Terminallerinin işlevselliğini etkinleştirir. + Düşman Sonarı + NPC kontrollü denizaltılardan gelen sonar pinglerini etkinleştir. + Özel Sonar + Özel terminaller için işlevselliği etkinleştirir. Devre dışı bırakmak performansı artırabilir. + Canlıları Hedefle + İnsan olmayan tüm canlılara hasar vermeyi etkinleştirir. + Oyuncuları Hedefle + Oyunculara hasar vermeyi etkinleştirir. + Botları Hedefle + Botlara hasar vermeyi etkinleştirir. + Canlı Gövde Algılama + Canlılar için doğru sonar vuruş algılama. Devre dışı bırakmak performansı artırabilir. + İnsan Gövde Algılama + İnsanlar için doğru sonar vuruş algılama, örneğin insanların balast tanklarında korunmasını istiyor musunuz? + Sonar Etki Görsel Yoğunluğu + Sonar Hareket Hızı Cezası + Diğer Görseller (Beyin kanaması, cortizide, vb.):\nStandart + Diğer Görseller (Beyin kanaması, cortizide, vb.):\nAzaltılmış + Diğer Görseller (Beyin kanaması, cortizide, vb.):\nDevre Dışı + Yoksayılan Oyuncu İsimleri + Yok Sayılan Karakter ID'leri + Dalış Kıyafeti Dirençleri + Sonar Terminalleri + ("Özel Sonar" seçeneğinin etkinleştirilmesi gerekir) + Sıfırla + Tümünü Sıfırla + Geçersiz Giriş + Kapat + + Anekoyik dalış kıyafetine ihtiyacım var! + Sonar açıkken tamirat yapmak için anekoyik kıyafete ihtiyacım var! + Anekoyik kıyafet bulmam lazım! + Anekoyik kıyafet bulamıyorum! Sonarı kapatın! + Anekoyik kıyafet yok! Oraya girmiyorum! + Sonar kapanana kadar oraya girmiyorum! + Korumam yok! Sonarı kapatın! + Sonar kapanana kadar tamirat yapamam! + Sonarı kapatın! + O lanet sonar yüzünden kulaklarım kanıyor! + Sonarı kapatın! + Sonara yakalandım! + Aman Tanrım, bu sonar çok gürültülü! + Suyun içindeyim, sonarı devre dışı bırakın! + Aman Tanrım, sonarı devre dışı bırakın! + Birisi sonarı kapatsın! + \ No newline at end of file diff --git a/Real Sonar/Lua/Autorun/init.lua b/Real Sonar/Lua/Autorun/init.lua new file mode 100644 index 0000000..64fbc81 --- /dev/null +++ b/Real Sonar/Lua/Autorun/init.lua @@ -0,0 +1,31 @@ +RealSonar = {} +RealSonar.Path = table.pack(...)[1] +RealSonar.sonarItems = {} +RealSonar.EnemySub = nil +RealSonar.LITE = false + +-- Load config. +dofile(RealSonar.Path .. "/Lua/loadconfig.lua") + +-- Shared. +dofile(RealSonar.Path .. "/Lua/anechoicsuit.lua") + +-- Server-side / Singleplayer. +if (Game.IsMultiplayer and SERVER) or not Game.IsMultiplayer or RealSonar.Config.LowLatencyMode then + dofile(RealSonar.Path .. "/Lua/functions.lua") + dofile(RealSonar.Path .. "/Lua/sonarping.lua") + dofile(RealSonar.Path .. "/Lua/roundstart.lua") + dofile(RealSonar.Path .. "/Lua/servercontrol.lua") + dofile(RealSonar.Path .. "/Lua/cortizideoverride.lua") + dofile(RealSonar.Path .. "/Lua/networkmessages.lua") + dofile(RealSonar.Path .. "/Lua/think.lua") + if RealSonar.LITE == false then + dofile(RealSonar.Path .. "/Lua/aiobjectives.lua") + end +end + +-- Client-side / Singleplayer. +if SERVER then return end +dofile(RealSonar.Path .. "/Lua/soundvolume.lua") +dofile(RealSonar.Path .. "/Lua/stopsounds.lua") +dofile(RealSonar.Path .. "/Lua/menu.lua") \ No newline at end of file diff --git a/Real Sonar/Lua/aiobjectives.lua b/Real Sonar/Lua/aiobjectives.lua new file mode 100644 index 0000000..0549e88 --- /dev/null +++ b/Real Sonar/Lua/aiobjectives.lua @@ -0,0 +1,71 @@ +-- Makes bots try to get an anechoic suit before repairing leaks when in dangerous range of an active sonar. +Hook.Patch( + "Barotrauma.AIObjectiveGetItem", + ".ctor", + { + "Barotrauma.Character", + "Barotrauma.Identifier", + "Barotrauma.AIObjectiveManager", + "System.Boolean", + "System.Boolean", + "System.Single", + "System.Boolean", + }, + function(instance, ptable) + + local objective = ptable["objectiveManager"].GetActiveObjective() + if tostring(objective) == "Barotrauma.AIObjectiveFindDivingGear" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(ptable["character"]) and RealSonar.hullBreached(ptable["character"]) then + ptable["identifierOrTag"] = "anechoic" + end +end, Hook.HookMethodType.Before) + + +-- Replace messages with custom ones relating to the situation. +Hook.Patch( + "Barotrauma.Character", + "Speak", + function(instance, ptable) + + if tostring(ptable["identifier"]) == "getdivinggear" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(instance) and RealSonar.hullBreached(instance) then + ptable["message"] = TextManager.Get("dialoggetanechoicsuit").Value + + elseif tostring(ptable["identifier"]) == "dialogcannotreachleak" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(instance) and RealSonar.hullBreached(instance) then + ptable["delay"] = Single(2) + ptable["message"] = TextManager.Get("dialogcantfindanechoicsuit").Value + end +end, Hook.HookMethodType.Before) + + +-- Prevent bots from treating vibrationdamage/muscledamage with more than one manna extract at a time. +Hook.Patch( + "Barotrauma.CharacterHealth", + "GetPredictedStrength", + { + "Barotrauma.Affliction", + "System.Single", + "Barotrauma.Limb" + }, + function(instance, ptable) + + if ptable["affliction"].Prefab.Identifier == "vibrationdamage" or ptable["affliction"].Prefab.Identifier == "muscledamage" then + local vibrationdamage = false + local muscledamage = false + local mannainfluence = false + local afflictions = instance.GetAllAfflictions() + + for affliction in afflictions do + if affliction.Prefab.Identifier == "vibrationdamage" then + vibrationdamage = true + elseif affliction.Prefab.Identifier == "mannainfluence" then + mannainfluence = true + elseif affliction.Prefab.Identifier == "muscledamage" then + muscledamage = true + end + end + + if mannainfluence and vibrationdamage or mannainfluence and muscledamage then + ptable.PreventExecution = true + return 0 + end + end +end, Hook.HookMethodType.Before) \ No newline at end of file diff --git a/Real Sonar/Lua/anechoicsuit.lua b/Real Sonar/Lua/anechoicsuit.lua new file mode 100644 index 0000000..ff5acee --- /dev/null +++ b/Real Sonar/Lua/anechoicsuit.lua @@ -0,0 +1,23 @@ +-- Note: This hook is not called if the diving suit is dragged and dropped out of the equipped slot. +-- This doesn't really matter because the paramaters will be corrected on the next interaction with an item. + +Hook.Add("item.equip", "updateAnechoicParams", function(item, character) + if character.Params.hideInSonar == false then + local suit = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + if suit and suit.Prefab.Identifier.Value == "anechoicdivingsuit" then + character.Params.hideInSonar = true + character.Params.HideInThermalGoggles = true + character.Params.Noise = 80 + character.Params.Visibility = 40 + end + else + local suit = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + -- Reset to default values if no longer wearing the suit. + if not suit or suit.Prefab.Identifier.Value ~= "anechoicdivingsuit" then + character.Params.hideInSonar = false + character.Params.HideInThermalGoggles = false + character.Params.Noise = 150 + character.Params.Visibility = 150 + end + end +end) \ No newline at end of file diff --git a/Real Sonar/Lua/cortizideoverride.lua b/Real Sonar/Lua/cortizideoverride.lua new file mode 100644 index 0000000..88319ca --- /dev/null +++ b/Real Sonar/Lua/cortizideoverride.lua @@ -0,0 +1,7 @@ +local fx_preset +Hook.Add("item.applyTreatment", "fxcontrol", function(item, usingCharacter, targetCharacter, limb) + if item.Prefab.Identifier == "cortizide" and limb == targetCharacter.AnimController.GetLimb(LimbType.Head) then + fx_preset = RealSonar.getVFXPresetString() + RealSonar.GiveAffliction(targetCharacter, string.format("cortizideinjection%s", fx_preset), 1) + end +end) \ No newline at end of file diff --git a/Real Sonar/Lua/defaultconfig.lua b/Real Sonar/Lua/defaultconfig.lua new file mode 100644 index 0000000..ecdd900 --- /dev/null +++ b/Real Sonar/Lua/defaultconfig.lua @@ -0,0 +1,72 @@ +local config = {} + +-- Cosmetic. +config.WaterPingVolume = 1 +config.SuitPingVolume = 1 +config.AirPingVolume = 1 +config.TinnitusVolume = 1 +config.DistortionVolume = 1 +config.ImpactVisuals = 1 +config.VFXPreset = 2 + +-- Gameplay. +config.SonarRange = 1 +config.SonarDamage = 1 +config.SonarSlow = 1 +config.SubmarineSonar = true +config.BeaconSonar = true +config.ShuttleSonar = true +config.EnemySonar = true +config.CustomSonar = false +config.CreatureDamage = true +config.PlayerDamage = true +config.BotDamage = true +config.HumanHullDetection = true +config.CreatureHullDetection = true +config.LowLatencyMode = false + +config.SonarTerminals = {} +config.SonarTerminals["navterminal"] = {} +config.SonarTerminals["navterminal"]["damage"] = "high" +config.SonarTerminals["navterminal"]["sounds"] = "default" +config.SonarTerminals["navterminal"]["range"] = 12000 +config.SonarTerminals["shuttlenavterminal"] = {} +config.SonarTerminals["shuttlenavterminal"]["damage"] = "medium" +config.SonarTerminals["shuttlenavterminal"]["sounds"] = "shuttle" +config.SonarTerminals["shuttlenavterminal"]["range"] = 10000 +config.SonarTerminals["sonarmonitor"] = {} +config.SonarTerminals["sonarmonitor"]["damage"] = "low" +config.SonarTerminals["sonarmonitor"]["sounds"] = "default" +config.SonarTerminals["sonarmonitor"]["range"] = 8000 + +config.IgnoredPlayers = {} + +config.IgnoredCharacters = {} + +config.WearableProtections = {} +config.WearableProtections["anechoicdivingsuit"] = {} +config.WearableProtections["anechoicdivingsuit"]["damageMultiplier"] = 0.4 +config.WearableProtections["anechoicdivingsuit"]["anechoic"] = true +config.WearableProtections["divingsuit"] = {} +config.WearableProtections["divingsuit"]["damageMultiplier"] = 0.1 +config.WearableProtections["divingsuit"]["anechoic"] = false +config.WearableProtections["abyssdivingsuit"] = {} +config.WearableProtections["abyssdivingsuit"]["damageMultiplier"] = 0.2 +config.WearableProtections["abyssdivingsuit"]["anechoic"] = false +config.WearableProtections["combatdivingsuit"] = {} +config.WearableProtections["combatdivingsuit"]["damageMultiplier"] = 0.05 +config.WearableProtections["combatdivingsuit"]["anechoic"] = false +config.WearableProtections["respawndivingsuit"] = {} +config.WearableProtections["respawndivingsuit"]["damageMultiplier"] = 0.1 +config.WearableProtections["respawndivingsuit"]["anechoic"] = false +config.WearableProtections["pucs"] = {} +config.WearableProtections["pucs"]["damageMultiplier"] = 0.25 +config.WearableProtections["pucs"]["anechoic"] = false +config.WearableProtections["exosuit"] = {} +config.WearableProtections["exosuit"]["damageMultiplier"] = 0.9 +config.WearableProtections["exosuit"]["anechoic"] = true +config.WearableProtections["clownexosuit"] = {} +config.WearableProtections["clownexosuit"]["damageMultiplier"] = 0.9 +config.WearableProtections["clownexosuit"]["anechoic"] = true + +return config \ No newline at end of file diff --git a/Real Sonar/Lua/easysettings.lua b/Real Sonar/Lua/easysettings.lua new file mode 100644 index 0000000..cd2ac47 --- /dev/null +++ b/Real Sonar/Lua/easysettings.lua @@ -0,0 +1,139 @@ +-- This code was adapted from EvilFactory's LuaAudioOverhaul mod. +-- https://steamcommunity.com/sharedfiles/filedetails/?id=2868921484 + +local easySettings = {} +local configPath = RealSonar.Path .. "/config.json" +easySettings.Settings = {} +easySettings.needRangeUpdate = false +easySettings.needSonarItemsUpdate = false +easySettings.needWearableProtectionsUpdate = false + +local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent") + +local function GetChildren(comp) + local tbl = {} + for value in comp.GetAllChildren() do + table.insert(tbl, value) + end + return tbl +end + +Hook.Patch("Barotrauma.GUI", "TogglePauseMenu", {}, function () + if GUI.GUI.PauseMenuOpen then + local frame = GUI.GUI.PauseMenu + + local list = GetChildren(GetChildren(frame)[2])[1] + + for key, value in pairs(easySettings.Settings) do + local button = GUI.Button(GUI.RectTransform(Vector2(1, 0.1), list.RectTransform), value.Name, GUI.Alignment.Center, "GUIButtonSmall") + + button.OnClicked = function () + value.OnOpen(frame) + end + end + -- The else block runs on menu close. + else + if Game.IsMultiplayer then + local message = Networking.Start("reloadserverconfig") + Networking.Send(message) + end + + if easySettings.needSonarItemsUpdate then + if Game.IsMultiplayer then + local message = Networking.Start("getsonaritems") + Networking.Send(message) + else + RealSonar.getSonarItems() + end + easySettings.needSonarItemsUpdate = false + end + + if easySettings.needWearableProtectionsUpdate then + if Game.IsMultiplayer then + local message = Networking.Start("setitemtags") + Networking.Send(message) + else + RealSonar.setItemTags() + end + easySettings.needWearableProtectionsUpdate = false + end + + if not Game.IsMultiplayer and easySettings.needRangeUpdate then + RealSonar.setSonarRanges() + easySettings.needRangeUpdate = false + end + end +end, Hook.HookMethodType.After) + +easySettings.SaveTable = function (path, tbl) + File.Write(path, json.serialize(tbl)) +end +easySettings.LoadTable = function (path) + if not File.Exists(path) then + return {} + end + + return json.parse(File.Read(path)) +end + +easySettings.AddMenu = function (name, onOpen) + table.insert(easySettings.Settings, {Name = name, OnOpen = onOpen}) +end + +easySettings.BasicList = function (parent, size) + local menuContent = GUI.Frame(GUI.RectTransform(size or Vector2(0.3, 0.5), parent.RectTransform, GUI.Anchor.Center)) + local menuList = GUI.ListBox(GUI.RectTransform(Vector2(0.9, 0.8), menuContent.RectTransform, GUI.Anchor.Center)) + + easySettings.CloseButton(menuContent) + easySettings.ResetButton(menuContent) + + return menuList +end + +easySettings.Slider = function (parent, min, max, onSelected, value) + local scrollBar = GUI.ScrollBar(GUI.RectTransform(Vector2(1, 0.1), parent.RectTransform), 0.1, nil, "GUISlider") + scrollBar.Range = Vector2(min, max) + scrollBar.BarScrollValue = value or max / 2 + scrollBar.OnMoved = function () + onSelected(scrollBar.BarScrollValue) + end + + return scrollBar +end + +easySettings.TickBox = function (parent, text, onSelected, state) + if state == nil then state = true end + + local tickBox = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), parent.RectTransform), text) + tickBox.Selected = state + tickBox.OnSelected = function () + onSelected(tickBox.State == GUIComponent.ComponentState.Selected) + end + + return tickBox +end + +easySettings.CloseButton = function (parent) + local button = GUI.Button(GUI.RectTransform(Vector2(0.5, 0.05), parent.RectTransform, GUI.Anchor.BottomRight), TextManager.Get("close").Value, GUI.Alignment.Center, "GUIButton") + + button.OnClicked = function () + GUI.GUI.TogglePauseMenu() + end + + return button +end + +easySettings.ResetButton = function (parent) + local button = GUI.Button(GUI.RectTransform(Vector2(0.5, 0.05), parent.RectTransform, GUI.Anchor.BottomLeft), TextManager.Get("resetalldefault").Value, GUI.Alignment.Center, "GUIButton") + + button.OnClicked = function () + RealSonar.Config = dofile(RealSonar.Path .. "/Lua/defaultconfig.lua") + File.Write(configPath, json.serialize(RealSonar.Config)) + easySettings.needRangeUpdate = true + GUI.GUI.TogglePauseMenu() + end + + return button +end + +return easySettings \ No newline at end of file diff --git a/Real Sonar/Lua/functions.lua b/Real Sonar/Lua/functions.lua new file mode 100644 index 0000000..8a85bf7 --- /dev/null +++ b/Real Sonar/Lua/functions.lua @@ -0,0 +1,555 @@ +LuaUserData.RegisterType("Barotrauma.DamageModifier") +LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.Items.Components.Sonar"], "pingDirection") + +-- Returns true if there is a valid path from a hull breach to the character. +function RealSonar.pathToBreach(character) + + -- Creature damage. + if not RealSonar.Config.CreatureDamage and not character.isHuman then + return false + end + + -- Player damage. + if not RealSonar.Config.PlayerDamage and character.isPlayer then + return false + end + + -- Bot damage. + if not RealSonar.Config.BotDamage and character.isBot then + return false + end + + -- Returns false for ignored players. + if character.isPlayer then + for name in RealSonar.Config.IgnoredPlayers do + if name == character.name then + return false + end + end + end + + -- Returns false for ignored characters. + for identifier in RealSonar.Config.IgnoredCharacters do + if identifier == character.Prefab.Identifier.Value then + return false + end + end + + -- Returns true for characters outside. + if not character.AnimController.currentHull then + return true + end + + -- Creature hull detection. + if not RealSonar.Config.CreatureHullDetection and not character.isHuman and character.InWater then + return true + end + + -- Human hull detection. + if not RealSonar.Config.HumanHullDetection and character.isHuman and character.InWater then + return true + end + + -- This code looks absolutely atrocious. It's so bad that I'm afraid to go near it to refactor it. + local hulls = character.AnimController.currentHull.GetConnectedHulls(true, 100, true) + local hullCount = 0 + local waterFilledHulls = 0 + for hull in hulls do + hullCount = hullCount + 1 + if hull.WaterPercentage >= 50 then + waterFilledHulls = waterFilledHulls + 1 + end + for gap in hull.ConnectedGaps do + -- If breach is external, more than 40% open, and water level is above the lower boundary of the gap . + if gap.IsRoomToRoom == false and gap.open >= 0.4 and hull.Surface + hull.WaveY[#hull.WaveY - 1] > gap.rect.Y - gap.Size then + -- If character position is below the gap. + if character.Position.Y < gap.rect.Y - gap.Size then + -- If the majority of the connected hulls are filled with water. + if waterFilledHulls >= hullCount - 1 then + return true + end + else + return true + end + end + end + end + return false +end + +-- Returns true if there's a mild external hull breach in the character's structure. +function RealSonar.hullBreached(character) + if not character.AnimController.currentHull then + return true + end + local hulls = character.AnimController.currentHull.GetConnectedHulls(true, 100, false) + for hull in hulls do + for gap in hull.ConnectedGaps do + if gap.IsRoomToRoom == false and gap.open >= 0.4 then + return true + end + end + end + return false +end + +-- Returns the distance between two points in 2D space. +function RealSonar.distanceBetween(point1, point2) + local xd = point1.X - point2.X + local yd = point1.Y - point2.Y + return math.sqrt(xd*xd + yd*yd) +end + +-- Returns true if the character is dangerously close to any active sonar source. +-- Ideally this checks if the gap is in range instead of the character, but I can't find a way to pass it in. +function RealSonar.characterInSonarRange(character) + local inSonar = false + local sonar + for item in RealSonar.sonarItems do + sonar = item.GetComponentString("Sonar") + if tostring(sonar.currentMode) == "Active" and sonar.Voltage > sonar.minVoltage and RealSonar.distanceBetween(item.worldPosition, character.worldPosition) <= sonar.Range * 0.75 then + if sonar.UseDirectionalPing then + if RealSonar.inDirectionalSector(character, item) then + inSonar = true + break + end + else + inSonar = true + break + end + end + end + return inSonar +end + +-- Returns true if the charcter is inside the direction ping sector. +function RealSonar.inDirectionalSector(character, item) + local sonar = item.GetComponentString("Sonar") + + local px, py = character.worldPosition.X, character.worldPosition.Y + local cx, cy = item.Submarine.WorldPosition.X, item.Submarine.WorldPosition.Y + local r = sonar.Range + local theta = math.atan2(-sonar.pingDirection.Y, sonar.pingDirection.X) * 180 / math.pi + + local dx = px - cx + local dy = py - cy + local angle = math.atan2(dy, dx) * 180 / math.pi + + if angle < 0 then + angle = angle + 360 + end + + local angle_diff = math.abs(angle - theta) + if angle_diff <= 15 or angle_diff >= 345 then + local dist = math.sqrt((px - cx)^2 + (py - cy)^2) + if dist <= r then + return true + end + end + + return false +end + +function RealSonar.getSonarResistanceData(character) + local resistanceData = {} + local damageModifier = 1 + local muffleSonar = false + + if not character or not character.Inventory then + table.insert(resistanceData, damageModifier) + table.insert(resistanceData, muffleSonar) + return resistanceData + end + + local outerClothes = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes) + local innerClothes = character.Inventory.GetItemInLimbSlot(InvSlotType.InnerClothes) + local head = character.Inventory.GetItemInLimbSlot(InvSlotType.Head) + local equippedClothing = {} + if outerClothes then table.insert(equippedClothing, outerClothes) end + if innerClothes then table.insert(equippedClothing, innerClothes) end + if head then table.insert(equippedClothing, head) end + + local identifier + local wearable + local configOverride = false + for clothing in equippedClothing do + identifier = clothing.Prefab.Identifier.Value + wearable = clothing.GetComponentString("Wearable") + + -- Checking config. + for id, data in pairs(RealSonar.Config.WearableProtections) do + if id == identifier then + damageModifier = damageModifier - data["damageMultiplier"] + configOverride = true + if data["anechoic"] == true then + muffleSonar = true + end + break + end + end + + -- Checking items. + if not configOverride then + if clothing.HasTag("anechoic") then + muffleSonar = true + end + if wearable ~= nil then -- Prevents errors if the player equips a flashlight on their head etc. + for modifier in wearable.DamageModifiers do + if modifier.AfflictionTypes == "activesonar" then + damageModifier = damageModifier - (1 - modifier.DamageMultiplier) + end + end + end + end + configOverride = false + end + + -- Constraints. Having 2 be the max allows for negative protection values on diving suits up to -1.0 + if damageModifier < 0 then + damageModifier = 0 + elseif damageModifier > 2 then + damageModifier = 2 + end + + table.insert(resistanceData, damageModifier) + table.insert(resistanceData, muffleSonar) + return resistanceData +end + +function RealSonar.getTerminalFromSub(sub) + for terminal in RealSonar.sonarItems do + if terminal.Submarine == sub then + return terminal + end + end +end + +function RealSonar.isEnabledForTerminal(terminal_id) + if terminal_id == "navterminal" then + if RealSonar.Config.SubmarineSonar then + return true + else + return false + end + + elseif terminal_id == "sonarmonitor" then + if RealSonar.Config.BeaconSonar then + return true + else + return false + end + + elseif terminal_id =="shuttlenavterminal" then + if RealSonar.Config.ShuttleSonar then + return true + else + return false + end + elseif RealSonar.Config.SonarTerminals[terminal_id] then + if RealSonar.Config.CustomSonar then + return true + else + return false + end + -- The default return value is true because all terminals should be enabled by default. + else + return true + end +end + +function RealSonar.getSonarItems() + RealSonar.sonarItems = {} + for item in Item.RepairableItems do + local item_id = item.Prefab.Identifier.Value + + for terminal_id in pairs(RealSonar.Config.SonarTerminals) do + if item_id == terminal_id then + table.insert(RealSonar.sonarItems, item) + end + end + end +end + +function RealSonar.getCaptain(sub) + for _, character in pairs(Character.CharacterList) do + if character.isHuman and character.Submarine == sub and character.IsCaptain then + return character + end + end +end + +function RealSonar.getVFXPresetString() + if RealSonar.Config.VFXPreset == 2 then + return "" + elseif RealSonar.Config.VFXPreset == 1 then + return "lowfx" + else + return "nofx" + end +end + +-- General reminder: It might be worth globally changing the naming convention of "", "shuttle", and "beacon" to match "high", "medium", "low" +function RealSonar.getTerminalType(terminal_id) + local damagePreset = "high" + + if RealSonar.Config.SonarTerminals[terminal_id] then + damagePreset = RealSonar.Config.SonarTerminals[terminal_id]["damage"] + end + + local terminal_type = "" + if damagePreset == "medium" then + terminal_type = "shuttle" + elseif damagePreset == "low" then + terminal_type = "beacon" + end + return terminal_type +end + +function RealSonar.getEnemySub() + RealSonar.EnemySub = nil + if Submarine.MainSubs[2] then + local sub = Submarine.MainSubs[2] + RealSonar.EnemySub = {} + RealSonar.EnemySub.terminal = RealSonar.getTerminalFromSub(sub) + RealSonar.EnemySub.sonar = RealSonar.EnemySub.terminal.GetComponentString("Sonar") + RealSonar.EnemySub.captain = RealSonar.getCaptain(sub) + end +end + +function RealSonar.updateEnemySonarMode() + local terminal = RealSonar.EnemySub.terminal + local sonar = RealSonar.EnemySub.sonar + local captain = RealSonar.EnemySub.captain + if tostring(sonar.currentMode) == "Passive" and captain and not captain.IsUnconscious and not captain.isDead and RealSonar.distanceBetween(captain.WorldPosition, terminal.WorldPosition) < 700 and not RealSonar.hullBreached(captain) then + sonar.currentMode = 0 + if Game.IsMultiplayer then + terminal.CreateServerEvent(Components.Sonar, sonar) + end + return math.random(1,3) + elseif tostring(sonar.currentMode) == "Active" and captain and not captain.IsUnconscious and not captain.isDead then + sonar.currentMode = 1 + if Game.IsMultiplayer then + terminal.CreateServerEvent(Components.Sonar, sonar) + end + end + return math.random(6,12) +end + +function RealSonar.setSonarRanges() + if Game.IsMultiplayer then return end + local defaultRange = 12000 + local terminal_id + local sonar + for terminal in RealSonar.sonarItems do + terminal_id = terminal.Prefab.Identifier.Value + + if RealSonar.Config.SonarTerminals[terminal_id] then + defaultRange = RealSonar.Config.SonarTerminals[terminal_id]["range"] + end + + sonar = terminal.GetComponentString("Sonar") + sonar.Range = defaultRange * RealSonar.Config.SonarRange + --if Game.IsMultiplayer then terminal.CreateServerEvent(Components.Sonar, sonar) end + end +end + +-- This function adds the "anechoic" tag to specified items in the config file. +-- Allowing bots to wear these items while doing repairs with the sonar on. +function RealSonar.setItemTags() + local property + for item in Item.ItemList do + for id, data in pairs(RealSonar.Config.WearableProtections) do + if item.Prefab.Identifier.Value == id and data["anechoic"] then + item.AddTag("anechoic") + if Game.IsMultiplayer then + property = item.SerializableProperties[Identifier("Tags")] + Networking.CreateEntityEvent(item, Item.ChangePropertyEventData(property, item)) + end + end + end + end +end + +-- This function corrects the brain hemorrhage and serversidelua afflictions. +function RealSonar.updateAfflictions() + local brainHemorrhages + local hasServerSideLua + local fx_preset = RealSonar.getVFXPresetString() + for _, character in pairs(Character.CharacterList) do + brainHemorrhages = {} + hasServerSideLua = false + + for affliction in character.CharacterHealth.GetAllAfflictions() do + if (character.isHuman and not character.isDead) and (affliction.Prefab.Identifier.Value == "brainhemorrhage" or affliction.Prefab.Identifier.Value == "brainhemorrhagelowfx" or affliction.Prefab.Identifier == "brainhemorrhagenofx") then + table.insert(brainHemorrhages, affliction) + end + + if affliction.Prefab.Identifier.Value == "serversidelua" then + hasServerSideLua = true + end + end + + for _, brainHemorrhage in pairs(brainHemorrhages) do + if brainHemorrhage.Prefab.Identifier.Value ~= string.format("brainhemorrhage%s", fx_preset) then + RealSonar.GiveAfflictionHead(character, string.format("brainhemorrhage%s", fx_preset), brainHemorrhage.Strength) + brainHemorrhage.Strength = 0 + end + end + + if not hasServerSideLua then + RealSonar.SetAffliction(character, "serversidelua", 1) + end + end + return 2 +end + +function RealSonar.GiveAffliction(character, identifier, strength) + local prefab = AfflictionPrefab.Prefabs[identifier] + local affliction = prefab.Instantiate(strength) + character.CharacterHealth.ApplyAffliction(character.AnimController.GetLimb(LimbType.Torso), affliction, true) +end + +function RealSonar.SetAffliction(character, identifier, strength) + local prefab = AfflictionPrefab.Prefabs[identifier] + local affliction = prefab.Instantiate(strength) + character.CharacterHealth.ApplyAffliction(character.AnimController.GetLimb(LimbType.Torso), affliction, false) +end + +function RealSonar.GiveAfflictionHead(character, identifier, strength) + local prefab = AfflictionPrefab.Prefabs[identifier] + local affliction = prefab.Instantiate(strength) + character.CharacterHealth.ApplyAffliction(character.AnimController.GetLimb(LimbType.Head), affliction, true) +end + +-- Nav terminal sounds. +function RealSonar.airSounds(character, strength) + if strength > 95 then + RealSonar.GiveAffliction(character, "sonarPingAirClose", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingAirMedium", 1) + else + RealSonar.GiveAffliction(character, "sonarPingAirFar", 1) + end +end +function RealSonar.airSoundsDirectional(character, strength) + if strength > 95 then + RealSonar.GiveAffliction(character, "sonarPingAirCloseDirectional", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingAirMediumDirectional", 1) + else + RealSonar.GiveAffliction(character, "sonarPingAirFarDirectional", 1) + end +end + +function RealSonar.waterSounds(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingWaterVeryClose", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingWaterClose", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingWaterMedium", 1) + else + RealSonar.GiveAffliction(character, "SonarPingWaterFar", 1) + end +end +function RealSonar.waterSoundsDirectional(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingWaterVeryCloseDirectional", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingWaterCloseDirectional", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingWaterMediumDirectional", 1) + else + RealSonar.GiveAffliction(character, "SonarPingWaterFarDirectional", 1) + end +end + +function RealSonar.suitSounds(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingSuitVeryClose", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingSuitClose", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingSuitMedium", 1) + else + RealSonar.GiveAffliction(character, "SonarPingSuitFar", 1) + end +end +function RealSonar.suitSoundsDirectional(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingSuitVeryCloseDirectional", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingSuitCloseDirectional", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingSuitMediumDirectional", 1) + else + RealSonar.GiveAffliction(character, "SonarPingSuitFarDirectional", 1) + end +end + + +-- Shuttle sounds +function RealSonar.airSoundsShuttle(character, strength) + if strength > 95 then + RealSonar.GiveAffliction(character, "sonarPingAirCloseShuttle", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingAirMediumShuttle", 1) + else + RealSonar.GiveAffliction(character, "sonarPingAirFarShuttle", 1) + end +end +function RealSonar.airSoundsShuttleDirectional(character, strength) + if strength > 95 then + RealSonar.GiveAffliction(character, "sonarPingAirCloseShuttleDirectional", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingAirMediumShuttleDirectional", 1) + else + RealSonar.GiveAffliction(character, "sonarPingAirFarShuttleDirectional", 1) + end +end + +function RealSonar.waterSoundsShuttle(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingWaterVeryCloseShuttle", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingWaterCloseShuttle", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingWaterMediumShuttle", 1) + else + RealSonar.GiveAffliction(character, "SonarPingWaterFarShuttle", 1) + end +end +function RealSonar.waterSoundsShuttleDirectional(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingWaterVeryCloseShuttleDirectional", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingWaterCloseShuttleDirectional", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingWaterMediumShuttleDirectional", 1) + else + RealSonar.GiveAffliction(character, "SonarPingWaterFarShuttleDirectional", 1) + end +end + +function RealSonar.suitSoundsShuttle(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingSuitVeryCloseShuttle", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingSuitCloseShuttle", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingSuitMediumShuttle", 1) + else + RealSonar.GiveAffliction(character, "SonarPingSuitFarShuttle", 1) + end +end +function RealSonar.suitSoundsShuttleDirectional(character, strength) + if strength > 75 then + RealSonar.GiveAffliction(character, "sonarPingSuitVeryCloseShuttleDirectional", 1) + elseif strength > 50 then + RealSonar.GiveAffliction(character, "sonarPingSuitCloseShuttleDirectional", 1) + elseif strength > 25 then + RealSonar.GiveAffliction(character, "sonarPingSuitMediumShuttleDirectional", 1) + else + RealSonar.GiveAffliction(character, "SonarPingSuitFarShuttleDirectional", 1) + end +end \ No newline at end of file diff --git a/Real Sonar/Lua/loadconfig.lua b/Real Sonar/Lua/loadconfig.lua new file mode 100644 index 0000000..13c0dbb --- /dev/null +++ b/Real Sonar/Lua/loadconfig.lua @@ -0,0 +1,76 @@ +local configPath = RealSonar.Path .. "/config.json" +local defaultConfig = dofile(RealSonar.Path .. "/Lua/defaultconfig.lua") + +if not File.Exists(configPath) then + -- Create config with default values. + RealSonar.Config = defaultConfig + File.Write(configPath, json.serialize(RealSonar.Config)) +else + -- Load config. + RealSonar.Config = json.parse(File.Read(configPath)) + + -- Limit values in the case they are manually edited. + if RealSonar.Config.SonarRange > 1.91 then + RealSonar.Config.SonarRange = 1.91 + elseif RealSonar.Config.SonarRange < 0.1 then + RealSonar.Config.SonarRange = 0.1 + end + if RealSonar.Config.SonarDamage > 2 then + RealSonar.Config.SonarDamage = 2 + elseif RealSonar.Config.SonarDamage < 0 then + RealSonar.Config.SonarDamage = 0 + end + if RealSonar.Config.SonarSlow > 1.5 then + RealSonar.Config.SonarSlow = 1.5 + elseif RealSonar.Config.SonarSlow < 0.5 then + RealSonar.Config.SonarSlow = 0.5 + end + if RealSonar.Config.ImpactVisuals > 2 then + RealSonar.Config.ImpactVisuals = 2 + elseif RealSonar.Config.ImpactVisuals < 0 then + RealSonar.Config.ImpactVisuals = 0 + end + RealSonar.Config.VFXPreset = math.floor(RealSonar.Config.VFXPreset) + if RealSonar.Config.VFXPreset > 2 then + RealSonar.Config.VFXPreset = 2 + elseif RealSonar.Config.VFXPreset < 0 then + RealSonar.Config.VFXPreset = 0 + end + + -- Add missing values. + for key, value in pairs(defaultConfig) do + if RealSonar.Config[key] == nil then + RealSonar.Config[key] = value + end + end + + -- In case someone deletes the three default terminals. + -- The reason I am not adding them in the same manner as the package specific ignored characters below is + -- because I still want people to be able to edit the values of the terminals, just not delete them. + if not RealSonar.Config.SonarTerminals["navterminal"] then + RealSonar.Config.SonarTerminals["navterminal"] = defaultConfig.SonarTerminals["navterminal"] + end + if not RealSonar.Config.SonarTerminals["shuttlenavterminal"] then + RealSonar.Config.SonarTerminals["shuttlenavterminal"] = defaultConfig.SonarTerminals["shuttlenavterminal"] + end + if not RealSonar.Config.SonarTerminals["sonarmonitor"] then + RealSonar.Config.SonarTerminals["sonarmonitor"] = defaultConfig.SonarTerminals["sonarmonitor"] + end +end + +-- Package specific changes. +for package in ContentPackageManager.EnabledPackages.All do + -- Real Sonar LITE. + if tostring(package.UgcId) == "2938034581" then + RealSonar.LITE = true + -- Undersea Horrors or Barotraumatic Creature Pack. + elseif tostring(package.UgcId) == "2667451351" or tostring(package.UgcId) == "2831987252" then + table.insert(RealSonar.Config.IgnoredCharacters, "Mine") + table.insert(RealSonar.Config.IgnoredCharacters, "Minedetached") + table.insert(RealSonar.Config.IgnoredCharacters, "Minesmall") + table.insert(RealSonar.Config.IgnoredCharacters, "Minemission") + table.insert(RealSonar.Config.IgnoredCharacters, "Minedetachedmission") + table.insert(RealSonar.Config.IgnoredCharacters, "Minesmallmission") + table.insert(RealSonar.Config.IgnoredCharacters, "DeadnoughtHomingshell") + end +end \ No newline at end of file diff --git a/Real Sonar/Lua/menu.lua b/Real Sonar/Lua/menu.lua new file mode 100644 index 0000000..32fe548 --- /dev/null +++ b/Real Sonar/Lua/menu.lua @@ -0,0 +1,300 @@ +local easySettings = dofile(RealSonar.Path .. "/Lua/easysettings.lua") +local MultiLineTextBox = dofile(RealSonar.Path .. "/Lua/multilinetextbox.lua") +local configPath = RealSonar.Path .. "/config.json" +local defaultConfig = dofile(RealSonar.Path .. "/Lua/defaultconfig.lua") + +local function CommaStringToTable(str) + local tbl = {} + + for word in string.gmatch(str, '([^,]+)') do + table.insert(tbl, word:match("^%s*(.-)%s*$")) -- Trim leading and trailing whitespace + end + + return tbl +end + +local function formatJsonTextBlock(str) + local pattern = "},\"" + local replacement = "},\n\"" + + -- Add newline after first character and before last character + if #str > 1 then + str = str:sub(1, 1) .. "\n" .. str:sub(2, -2) .. "\n" .. str:sub(-1) + end + + return string.gsub(str, pattern, replacement) +end + + +easySettings.AddMenu(TextManager.Get("realsonarsettings").Value, function (parent) + local list = easySettings.BasicList(parent) + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("volumesettings").Value, nil, nil, GUI.Alignment.Center) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.AirPingVolume = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("airpingvolume").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.AirPingVolume) + textBlock.Text = string.format("%s %s%%", TextManager.Get("airpingvolume").Value, math.floor(slider.BarScrollValue * 100)) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.WaterPingVolume = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("waterpingvolume").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.WaterPingVolume) + textBlock.Text = string.format("%s %s%%", TextManager.Get("waterpingvolume").Value, math.floor(slider.BarScrollValue * 100)) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.SuitPingVolume = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("suitpingvolume").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.SuitPingVolume) + textBlock.Text = string.format("%s %s%%", TextManager.Get("suitpingvolume").Value, math.floor(slider.BarScrollValue * 100)) + + if RealSonar.LITE == false then + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.TinnitusVolume = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("tinnitusvolume").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.TinnitusVolume) + textBlock.Text = string.format("%s %s%%", TextManager.Get("tinnitusvolume").Value, math.floor(slider.BarScrollValue * 100)) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.DistortionVolume = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("distortionvolume").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.DistortionVolume) + textBlock.Text = string.format("%s %s%%", TextManager.Get("distortionvolume").Value, math.floor(slider.BarScrollValue * 100)) + end + + if Game.IsMultiplayer then + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("networksettings").Value, nil, nil, GUI.Alignment.Center) + local tick = easySettings.TickBox(list.Content, TextManager.Get("lowlatencymode"), function (state) + RealSonar.Config.LowLatencyMode = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.LowLatencyMode) + tick.ToolTip = TextManager.Get("lowlatencymodetooltip") + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("gameplaysettingsserver").Value, nil, nil, GUI.Alignment.Center) + else + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("gameplaysettingsclient").Value, nil, nil, GUI.Alignment.Center) + end + + if RealSonar.LITE == false then + local tick = easySettings.TickBox(list.Content, TextManager.Get("submarinesonar"), function (state) + RealSonar.Config.SubmarineSonar = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.SubmarineSonar) + tick.ToolTip = TextManager.Get("submarinesonartooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("beaconsonar"), function (state) + RealSonar.Config.BeaconSonar = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.BeaconSonar) + tick.ToolTip = TextManager.Get("beaconsonartooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("shuttlesonar"), function (state) + RealSonar.Config.ShuttleSonar = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.ShuttleSonar) + tick.ToolTip = TextManager.Get("shuttlesonartooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("enemysonar"), function (state) + RealSonar.Config.EnemySonar = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.EnemySonar) + tick.ToolTip = TextManager.Get("enemysonartooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("customsonar"), function (state) + RealSonar.Config.CustomSonar = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.CustomSonar) + tick.ToolTip = TextManager.Get("customsonartooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("targetcreatures"), function (state) + RealSonar.Config.CreatureDamage = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.CreatureDamage) + tick.ToolTip = TextManager.Get("targetcreaturestooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("targetbots"), function (state) + RealSonar.Config.BotDamage = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.BotDamage) + tick.ToolTip = TextManager.Get("targetbotstooltip") + end + + local tick = easySettings.TickBox(list.Content, TextManager.Get("targetplayers"), function (state) + RealSonar.Config.PlayerDamage = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.PlayerDamage) + tick.ToolTip = TextManager.Get("targetplayerstooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("humanhulldetection"), function (state) + RealSonar.Config.HumanHullDetection = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.HumanHullDetection) + tick.ToolTip = TextManager.Get("humanhulldetectiontooltip") + + local tick = easySettings.TickBox(list.Content, TextManager.Get("creaturehulldetection"), function (state) + RealSonar.Config.CreatureHullDetection = state + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.CreatureHullDetection) + tick.ToolTip = TextManager.Get("creaturehulldetectiontooltip") + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local rangeStartingValue = RealSonar.Config.SonarRange + local slider = easySettings.Slider(list.Content, 0.1, 1.91, function (value) + RealSonar.Config.SonarRange = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarrange").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + if RealSonar.Config.SonarRange ~= rangeStartingValue then + easySettings.needRangeUpdate = true + else + easySettings.needRangeUpdate = false + end + + end, RealSonar.Config.SonarRange) + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarrange").Value, math.floor(slider.BarScrollValue * 100)) + + if RealSonar.LITE == false then + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.SonarDamage = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonardamage").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.SonarDamage) + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonardamage").Value, math.floor(slider.BarScrollValue * 100)) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0.5, 1.5, function (value) + RealSonar.Config.SonarSlow = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarslow").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.SonarSlow) + textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarslow").Value, math.floor(slider.BarScrollValue * 100)) + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.ImpactVisuals = math.floor(value * 100)/100 + textBlock.Text = string.format("%s %s%%", TextManager.Get("impactvisuals").Value, math.floor(value * 100)) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.ImpactVisuals) + textBlock.Text = string.format("%s %s%%", TextManager.Get("impactvisuals").Value, math.floor(slider.BarScrollValue * 100)) + + local title + if RealSonar.Config.VFXPreset == 2 then + title = "defaultfx" + elseif RealSonar.Config.VFXPreset == 1 then + title = "lowfx" + elseif RealSonar.Config.VFXPreset >= 0 then + title = "nofx" + end + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center) + local slider = easySettings.Slider(list.Content, 0, 2, function (value) + RealSonar.Config.VFXPreset = math.floor(value + 0.5) + if RealSonar.Config.VFXPreset == 2 then + title = "defaultfx" + elseif RealSonar.Config.VFXPreset == 1 then + title = "lowfx" + elseif RealSonar.Config.VFXPreset >= 0 then + title = "nofx" + end + textBlock.Text = string.format("%s", TextManager.Get(title).Value) + easySettings.SaveTable(configPath, RealSonar.Config) + end, RealSonar.Config.VFXPreset) + textBlock.Text = string.format("%s", TextManager.Get(title).Value) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("ignoredplayers").Value, nil, nil, GUI.Alignment.Center, true) + local ignoredPlayers = MultiLineTextBox(list.Content.RectTransform, "", 0.1) + ignoredPlayers.Text = table.concat(RealSonar.Config.IgnoredPlayers, ", ") + ignoredPlayers.OnTextChangedDelegate = function (textBox) + RealSonar.Config.IgnoredPlayers = CommaStringToTable(textBox.Text) + easySettings.SaveTable(configPath, RealSonar.Config) + end + + GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("ignoredcharacters").Value, nil, nil, GUI.Alignment.Center, true) + local ignoredCharacters = MultiLineTextBox(list.Content.RectTransform, "", 0.1) + ignoredCharacters.Text = table.concat(RealSonar.Config.IgnoredCharacters, ", ") + ignoredCharacters.OnTextChangedDelegate = function (textBox) + RealSonar.Config.IgnoredCharacters = CommaStringToTable(textBox.Text) + easySettings.SaveTable(configPath, RealSonar.Config) + end + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("wearableprotections").Value, nil, nil, GUI.Alignment.Center, true) + local wearableProtections = MultiLineTextBox(list.Content.RectTransform, "", 0.2) + local startingWearables = 0 + local newWearables = 0 + for _ in RealSonar.Config.WearableProtections do + startingWearables = startingWearables + 1 + end + wearableProtections.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.WearableProtections)) + wearableProtections.OnTextChangedDelegate = function (textBox) + if pcall(json.parse, textBox.Text) then + RealSonar.Config.WearableProtections = json.parse(textBox.Text) + easySettings.SaveTable(configPath, RealSonar.Config) + textBlock.Text = TextManager.Get("wearableprotections").Value + for _ in RealSonar.Config.SonarTerminals do + newWearables = newWearables + 1 + end + if newWearables > startingWearables then + easySettings.needWearableProtectionsUpdate = true + end + else + textBlock.Text = string.format("%s (%s)", TextManager.Get("wearableprotections").Value, TextManager.Get("invalidinput").Value) + end + end + local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform), TextManager.Get("resetdefault").Value, GUI.Alignment.Center, "GUIButtonSmall") + btn.OnClicked = function () + RealSonar.Config.WearableProtections = defaultConfig.WearableProtections + File.Write(configPath, json.serialize(RealSonar.Config)) + wearableProtections.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.WearableProtections)) + end + + local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center, true) + local sonarTerminals = MultiLineTextBox(list.Content.RectTransform, "", 0.2) + local warningText = "" + local startingTerminals = 0 + local newTerminals = 0 + for _ in RealSonar.Config.SonarTerminals do + startingTerminals = startingTerminals + 1 + end + + if not RealSonar.Config.CustomSonar then + warningText = TextManager.Get("requirescustomsonar").Value + end + textBlock.Text = string.format("%s %s", TextManager.Get("sonarterminals").Value, warningText) + sonarTerminals.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.SonarTerminals)) + sonarTerminals.OnTextChangedDelegate = function (textBox) + if pcall(json.parse, textBox.Text) then + RealSonar.Config.SonarTerminals = json.parse(textBox.Text) + easySettings.SaveTable(configPath, RealSonar.Config) + textBlock.Text = string.format("%s %s",TextManager.Get("sonarterminals").Value, warningText) + easySettings.needRangeUpdate = true + for _ in RealSonar.Config.SonarTerminals do + newTerminals = newTerminals + 1 + end + if newTerminals > startingTerminals then + easySettings.needSonarItemsUpdate = true + end + else + textBlock.Text = string.format("%s %s (%s)", TextManager.Get("sonarterminals").Value, warningText, TextManager.Get("invalidinput").Value) + end + end + + local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform), TextManager.Get("resetdefault").Value, GUI.Alignment.Center, "GUIButtonSmall") + btn.OnClicked = function () + RealSonar.Config.SonarTerminals = defaultConfig.SonarTerminals + File.Write(configPath, json.serialize(RealSonar.Config)) + sonarTerminals.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.SonarTerminals)) + easySettings.needRangeUpdate = true + end + +end) \ No newline at end of file diff --git a/Real Sonar/Lua/multilinetextbox.lua b/Real Sonar/Lua/multilinetextbox.lua new file mode 100644 index 0000000..a173023 --- /dev/null +++ b/Real Sonar/Lua/multilinetextbox.lua @@ -0,0 +1,50 @@ +-- This code was adapted from EvilFactory's Performance Fix mod. +-- https://steamcommunity.com/sharedfiles/filedetails/?id=2701251094 + +local function updateServerMessageScrollBasedOnCaret(textBox, listBox) + local caretY = textBox.CaretScreenPos.Y; + local bottomCaretExtent = textBox.Font.LineHeight * 1.5 + local topCaretExtent = -textBox.Font.LineHeight * 0.5 + + if caretY + bottomCaretExtent > listBox.Rect.Bottom then + listBox.ScrollBar.BarScroll + = (caretY - textBox.Rect.Top - listBox.Rect.Height + bottomCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + elseif (caretY + topCaretExtent < listBox.Rect.Top) then + listBox.ScrollBar.BarScroll + = (caretY - textBox.Rect.Top + topCaretExtent) + / (textBox.Rect.Height - listBox.Rect.Height) + end +end + +local function CreateMultiLineTextBox(rectransform, text, size) + local multineListBox = GUI.ListBox(GUI.RectTransform(Vector2(1, size or 0.2), rectransform)) + + local textBox = GUI.TextBox(GUI.RectTransform(Vector2(1, 1), multineListBox.Content.RectTransform), text, nil, nil, nil, true, "GUITextBoxNoBorder") + + textBox.add_OnSelected(function () + updateServerMessageScrollBasedOnCaret(textBox, multineListBox) + end) + + textBox.OnTextChangedDelegate = function () + local textSize = textBox.Font.MeasureString(textBox.WrappedText); + textBox.RectTransform.NonScaledSize = Point(textBox.RectTransform.NonScaledSize.X, math.max(multineListBox.Content.Rect.Height, textSize.Y + 10)) + multineListBox.UpdateScrollBarSize() + + return true; + end + + textBox.OnEnterPressed = function () + local str = textBox.Text + local caretIndex = textBox.CaretIndex + + textBox.Text = str:sub(1, caretIndex) .. "\n" .. str:sub(caretIndex + 1) + textBox.CaretIndex = caretIndex + 1 + + return true + end + + return textBox +end + +return CreateMultiLineTextBox \ No newline at end of file diff --git a/Real Sonar/Lua/networkmessages.lua b/Real Sonar/Lua/networkmessages.lua new file mode 100644 index 0000000..542b64c --- /dev/null +++ b/Real Sonar/Lua/networkmessages.lua @@ -0,0 +1,13 @@ +if not SERVER then return end + +Networking.Receive("reloadserverconfig", function(msg, sender) + dofile(RealSonar.Path .. "/Lua/loadconfig.lua") +end) + +Networking.Receive("getsonaritems", function(msg, sender) + RealSonar.getSonarItems() +end) + +Networking.Receive("setitemtags", function(msg, sender) + RealSonar.setItemTags() +end) \ No newline at end of file diff --git a/Real Sonar/Lua/roundstart.lua b/Real Sonar/Lua/roundstart.lua new file mode 100644 index 0000000..94bfdbb --- /dev/null +++ b/Real Sonar/Lua/roundstart.lua @@ -0,0 +1,15 @@ + +Hook.Add("roundStart", "getSonarItems", function() + RealSonar.getSonarItems() + RealSonar.setSonarRanges() + RealSonar.getEnemySub() + RealSonar.setItemTags() +end) + +-- Ensures certain features like AI Objectives and enemy sonar still work after reloading Lua mid-game. +Hook.Add("loaded", "getSonarItems", function() + RealSonar.getSonarItems() + RealSonar.setSonarRanges() + RealSonar.getEnemySub() + RealSonar.setItemTags() +end) diff --git a/Real Sonar/Lua/servercontrol.lua b/Real Sonar/Lua/servercontrol.lua new file mode 100644 index 0000000..f7cd27b --- /dev/null +++ b/Real Sonar/Lua/servercontrol.lua @@ -0,0 +1,36 @@ +-- The functions in this file apply and maintain the "serversidelua" affliction on all characters. +-- This affliction allows the server to control Real Sonar using Lua without causing desync for users without it. +-- Basically, client-side Lua is no longer needed to experience Real Sonar's advanced features, anyone can jump in. + +Hook.Patch( + "Barotrauma.DebugConsole", + "ExecuteCommand", + function(instance, ptable) + + local characterHealed = false + for word in string.gmatch(ptable["inputtedCommands"], "[^%s]+") do + if word == "revive" or word == "heal" then + characterHealed = true + end + end + if characterHealed then + RealSonar.updateAfflictions() + end +end, Hook.HookMethodType.After) + +if not (Game.IsMultiplayer and SERVER) or RealSonar.Config.LowLatencyMode then return end +Hook.Patch( + "Barotrauma.DebugConsole", + "ExecuteClientCommand", + function(instance, ptable) + + local characterHealed = false + for word in string.gmatch(ptable["command"], "[^%s]+") do + if word == "revive" or word == "heal" then + characterHealed = true + end + end + if characterHealed then + RealSonar.updateAfflictions() + end +end, Hook.HookMethodType.After) \ No newline at end of file diff --git a/Real Sonar/Lua/sonarping.lua b/Real Sonar/Lua/sonarping.lua new file mode 100644 index 0000000..92f64ff --- /dev/null +++ b/Real Sonar/Lua/sonarping.lua @@ -0,0 +1,230 @@ +-- It would technically be faster to patch the Barotrauma.Items.Components.Sonar.Use method. +-- But doing so would not allow me to stop the default ping sound from playing. +Hook.Patch( + "Barotrauma.Item", "Use", function(instance, ptable) + if not RealSonar.Config.CustomSonar then + return + end + local instance_sonar = instance.GetComponentString("Sonar") + for terminal in RealSonar.sonarItems do + if terminal.GetComponentString("Sonar") == instance_sonar and tostring(instance_sonar.CurrentMode) == "Active" then + if instance_sonar.UseDirectionalPing then + Hook.Call("sonarPingDirectional", nil, nil, terminal) + else + Hook.Call("sonarPing", nil, nil, terminal) + end + -- Prevent default ping sound from playing. + ptable.PreventExecution = true + end + end +end, Hook.HookMethodType.Before) + +Hook.Add("sonarPing", "sonarPing", function(effect, deltaTime, item, targets, worldPosition) + local terminal_id = item.Prefab.Identifier.Value + local sonar = item.GetComponentString("Sonar") + + -- deltaTime being passed in means that the hook was called from XML + if RealSonar.Config.CustomSonar and deltaTime then + + -- If the terminal is registered cancel the XML status effect. + if RealSonar.Config.SonarTerminals[terminal_id] then + return true + + -- Otherwise, add the terminal to the config. + else + RealSonar.Config.SonarTerminals[terminal_id] = {} + RealSonar.Config.SonarTerminals[terminal_id]["damage"] = "high" + RealSonar.Config.SonarTerminals[terminal_id]["sounds"] = "default" + RealSonar.Config.SonarTerminals[terminal_id]["range"] = sonar.Range + table.insert(RealSonar.sonarItems, item) + print("Real Sonar: Automatically added '", terminal_id, "' to config with default values.") + end + end + + local distance + local amount + local terminal_type + local sonarResistanceData + local damageMultiplier + local muffleSonar + + -- Select correct sound-playing function. + local soundPreset = "default" + if RealSonar.Config.SonarTerminals[terminal_id] then + soundPreset = RealSonar.Config.SonarTerminals[terminal_id]["sounds"] + end + local airSounds = RealSonar.airSounds + local waterSounds = RealSonar.waterSounds + local suitSounds = RealSonar.suitSounds + if soundPreset == "shuttle" then + airSounds = RealSonar.airSoundsShuttle + waterSounds = RealSonar.waterSoundsShuttle + suitSounds = RealSonar.suitSoundsShuttle + end + + + terminal_type = RealSonar.getTerminalType(terminal_id) + + for _, character in pairs(Character.CharacterList) do + distance = RealSonar.distanceBetween(item.worldPosition, character.worldPosition) + if distance < sonar.Range and not character.isDead then + + amount = (1 - distance / sonar.Range) * 100 + + -- Air sounds. + if not character.InWater or not RealSonar.isEnabledForTerminal(terminal_id) or not RealSonar.pathToBreach(character) then + if character.isPlayer then + airSounds(character, amount) + end + + elseif RealSonar.isEnabledForTerminal(terminal_id) and RealSonar.pathToBreach(character) then + sonarResistanceData = RealSonar.getSonarResistanceData(character) + damageMultiplier = sonarResistanceData[1] + muffleSonar = sonarResistanceData[2] + + -- Damage. + RealSonar.GiveAffliction(character, string.format("activesonar%slua", terminal_type), (amount * damageMultiplier) * RealSonar.Config.SonarDamage) + + -- Stun & slow. + if character.isHuman and not muffleSonar then + RealSonar.GiveAffliction(character, string.format("sonarshakestun%s", terminal_type), (amount * damageMultiplier) * RealSonar.Config.ImpactVisuals) + RealSonar.SetAffliction(character, string.format("sonarslow%s", terminal_type), (amount * damageMultiplier) * RealSonar.Config.SonarSlow) + end + + -- Water sounds & impact visuals. + if not muffleSonar and character.isPlayer then + RealSonar.GiveAffliction(character, string.format("sonarvisuals%s", terminal_type), (amount * damageMultiplier) * RealSonar.Config.ImpactVisuals) + waterSounds(character, amount * damageMultiplier) + + -- Suit sounds. + elseif character.isPlayer then + suitSounds(character, amount) + end + + -- Bot messages. + if terminal_id ~= "sonarmonitor" and character.isBot and character.IsOnPlayerTeam and not character.IsUnconscious then + character.Speak(TextManager.Get("dialogturnoffsonar").Value, nil, 0.5, "dialogturnoffsonar", 5) + end + end + end + end + + -- Cancel the rest of the Status Effect. + return true +end) + + +Hook.Add("sonarPingDirectional", "sonarPingDirectional", function(effect, deltaTime, item, targets, worldPosition) + local terminal_id = item.Prefab.Identifier.Value + local sonar = item.GetComponentString("Sonar") + + -- deltaTime being passed in means that the hook was called from XML + if RealSonar.Config.CustomSonar and deltaTime then + + -- If the terminal is registered cancel the XML status effect. + if RealSonar.Config.SonarTerminals[terminal_id] then + return true + + -- Otherwise, add the terminal to the config. + else + RealSonar.Config.SonarTerminals[terminal_id] = {} + RealSonar.Config.SonarTerminals[terminal_id]["damage"] = "high" + RealSonar.Config.SonarTerminals[terminal_id]["sounds"] = "default" + RealSonar.Config.SonarTerminals[terminal_id]["range"] = sonar.Range + table.insert(RealSonar.sonarItems, item) + print("Real Sonar: Automatically added '", terminal_id, "' to config with default values.") + end + end + + local distance + local amount + local terminal_type + local sonarResistanceData + local damageMultiplier + local muffleSonar + + local soundRangeMultiplier = 2.0 + local inConeDamageMultiplier = 1.5 + local outConeDamageMultiplier = 0.6 + + -- Select correct sound-playing function. + local soundPreset = "default" + if RealSonar.Config.SonarTerminals[terminal_id] then + soundPreset = RealSonar.Config.SonarTerminals[terminal_id]["sounds"] + end + local airSoundsDirectional = RealSonar.airSoundsDirectional + local waterSoundsDirectional = RealSonar.waterSoundsDirectional + local suitSoundsDirectional = RealSonar.suitSoundsDirectional + local waterSounds = RealSonar.waterSounds + local suitSounds = RealSonar.suitSounds + if soundPreset == "shuttle" then + airSoundsDirectional = RealSonar.airSoundsShuttleDirectional + waterSoundsDirectional = RealSonar.waterSoundsShuttleDirectional + suitSoundsDirectional = RealSonar.suitSoundsShuttleDirectional + waterSounds = RealSonar.waterSoundsShuttle + suitSounds = RealSonar.suitSoundsShuttle + end + + terminal_type = RealSonar.getTerminalType(terminal_id) + + for _, character in pairs(Character.CharacterList) do + distance = RealSonar.distanceBetween(item.worldPosition, character.worldPosition) + if distance < sonar.Range and not character.isDead then + + amount = (1 - distance / sonar.Range) * 100 + + -- Air sounds. + if (not character.InWater or not RealSonar.isEnabledForTerminal(terminal_id) or not RealSonar.pathToBreach(character)) and character.isPlayer then + airSoundsDirectional(character, amount) + + elseif RealSonar.isEnabledForTerminal(terminal_id) and RealSonar.pathToBreach(character) then + sonarResistanceData = RealSonar.getSonarResistanceData(character) + damageMultiplier = sonarResistanceData[1] + muffleSonar = sonarResistanceData[2] + + -- Being aimed at. + if RealSonar.inDirectionalSector(character, item) then + -- Damage. + RealSonar.GiveAffliction(character, string.format("activesonar%slua", terminal_type), ((amount * damageMultiplier) * inConeDamageMultiplier) * RealSonar.Config.SonarDamage) + + -- Stun & slow. + if character.isHuman and not muffleSonar then + RealSonar.GiveAffliction(character, string.format("sonarshakestun%s", terminal_type), ((amount * damageMultiplier) * inConeDamageMultiplier) * RealSonar.Config.ImpactVisuals) + RealSonar.SetAffliction(character, string.format("sonarslow%s", terminal_type), ((amount * damageMultiplier) * inConeDamageMultiplier) * RealSonar.Config.SonarSlow) + end + + -- Water sounds & impact visuals. + if not muffleSonar and character.isPlayer then + RealSonar.GiveAffliction(character, string.format("sonarvisuals%s", terminal_type), ((amount * damageMultiplier) * inConeDamageMultiplier) * RealSonar.Config.ImpactVisuals) + waterSounds(character, (amount * damageMultiplier) * soundRangeMultiplier) + + -- Suit sounds. + elseif character.isPlayer then + suitSounds(character, (amount * damageMultiplier) * soundRangeMultiplier) + end + + -- Bot messages. + if terminal_id ~= "sonarmonitor" and character.isBot and character.IsOnPlayerTeam and not character.IsUnconscious then + character.Speak(TextManager.Get("dialogturnoffsonar").Value, nil, 0.5, "dialogturnoffsonar", 5) + end + -- Not being aimed at. + else + -- Damage. + RealSonar.GiveAffliction(character, string.format("activesonar%slua", terminal_type), ((amount * damageMultiplier) * outConeDamageMultiplier) * RealSonar.Config.SonarDamage) + + -- Water sounds. + if not muffleSonar and character.isPlayer then + waterSoundsDirectional(character, amount) + + -- Suit sounds. + elseif character.isPlayer then + suitSoundsDirectional(character, amount) + end + end + end + end + end + + -- Cancel the rest of the Status Effect. + return true +end) \ No newline at end of file diff --git a/Real Sonar/Lua/soundvolume.lua b/Real Sonar/Lua/soundvolume.lua new file mode 100644 index 0000000..9ff4213 --- /dev/null +++ b/Real Sonar/Lua/soundvolume.lua @@ -0,0 +1,36 @@ +Hook.Patch( + "Barotrauma.SoundPlayer", + "PlaySound", + { + "Barotrauma.Sounds.Sound", + "Microsoft.Xna.Framework.Vector2", + "System.Single", + "System.Single", + "System.Single", + "Barotrauma.Hull", + "System.Boolean", + "System.Boolean" + }, + function(instance, ptable) + + local sound = ptable["sound"] + local soundName = sound.filename + + if string.find(soundName,"sonarPingWater") or string.find(soundName,"sonarTailWater") then + ptable["volume"] = Single(ptable["volume"] * RealSonar.Config.WaterPingVolume) or ptable["volume"] + + elseif string.find(soundName,"sonarPingAir") or string.find(soundName,"sonarTailAir") then + ptable["volume"] = Single(ptable["volume"] * RealSonar.Config.AirPingVolume) or ptable["volume"] + + elseif string.find(soundName,"sonarPingSuit") or string.find(soundName,"sonarTailSuit") then + ptable["volume"] = Single(ptable["volume"] * RealSonar.Config.SuitPingVolume) or ptable["volume"] + end + + if string.find(soundName,"Tinnitus") then + ptable["volume"] = Single(ptable["volume"] * RealSonar.Config.TinnitusVolume) or ptable["volume"] + end + if string.find(soundName,"sonarDistortion") then + ptable["volume"] = Single(ptable["volume"] * RealSonar.Config.DistortionVolume) or ptable["volume"] + end + +end, Hook.HookMethodType.Before) \ No newline at end of file diff --git a/Real Sonar/Lua/stopsounds.lua b/Real Sonar/Lua/stopsounds.lua new file mode 100644 index 0000000..7b3c16e --- /dev/null +++ b/Real Sonar/Lua/stopsounds.lua @@ -0,0 +1,10 @@ +LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.Sounds.SoundManager"], "playingChannels") +Hook.Add("stop", "stopSounds", function() + for side in Game.SoundManager.playingChannels do + for channel in side do + if string.find(channel.ToString(), "Tinnitus") or string.find(channel.ToString(), "brainHemorrhageStage") then + channel.FadeOutAndDispose() + end + end + end +end) \ No newline at end of file diff --git a/Real Sonar/Lua/think.lua b/Real Sonar/Lua/think.lua new file mode 100644 index 0000000..b3486f8 --- /dev/null +++ b/Real Sonar/Lua/think.lua @@ -0,0 +1,22 @@ +local enemySonarCooldown = 5 * 60 +local updateAfflictionCooldown = 2 * 60 + +Hook.Add("think", "think", function() + if Game.Paused or not Game.RoundStarted then return end + + if RealSonar.EnemySub then + if enemySonarCooldown <= 0 then + if RealSonar.Config.EnemySonar and not RealSonar.EnemySub.captain.IsOnPlayerTeam then + enemySonarCooldown = RealSonar.updateEnemySonarMode() * 60 + else + enemySonarCooldown = 5 * 60 -- Check again in 5 seconds. + end + end + enemySonarCooldown = enemySonarCooldown - 1 + end + + if updateAfflictionCooldown <= 0 then + updateAfflictionCooldown = RealSonar.updateAfflictions() * 60 + end + updateAfflictionCooldown = updateAfflictionCooldown - 1 +end) \ No newline at end of file diff --git a/Real Sonar/Sounds/brainDeath.ogg b/Real Sonar/Sounds/brainDeath.ogg new file mode 100644 index 0000000..3fd2c0d --- /dev/null +++ b/Real Sonar/Sounds/brainDeath.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb43d4641a23d58d15373d3da2d5e92e8e603cb8f53c0097a4799f89640bd5bd +size 208213 diff --git a/Real Sonar/Sounds/brainHemorrhageStage1.ogg b/Real Sonar/Sounds/brainHemorrhageStage1.ogg new file mode 100644 index 0000000..7c8960e --- /dev/null +++ b/Real Sonar/Sounds/brainHemorrhageStage1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efab1794b458d585aaa1dad050ba15f696739fd4ee361945c55ad4a0236a73f0 +size 267723 diff --git a/Real Sonar/Sounds/brainHemorrhageStage2.ogg b/Real Sonar/Sounds/brainHemorrhageStage2.ogg new file mode 100644 index 0000000..eef3e36 --- /dev/null +++ b/Real Sonar/Sounds/brainHemorrhageStage2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da838d4ef5a48a18c45d80da1dcce58231bfbb3b82d00501bb3226ceaed63cc5 +size 310271 diff --git a/Real Sonar/Sounds/brainHemorrhageStage3.ogg b/Real Sonar/Sounds/brainHemorrhageStage3.ogg new file mode 100644 index 0000000..571a102 --- /dev/null +++ b/Real Sonar/Sounds/brainHemorrhageStage3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56583fe58fbfbc6ddd0af823bd1fcd711d061440d94bdaf3def4b84ef9bccc55 +size 351360 diff --git a/Real Sonar/Sounds/brainHemorrhageStage4.ogg b/Real Sonar/Sounds/brainHemorrhageStage4.ogg new file mode 100644 index 0000000..3f9552c --- /dev/null +++ b/Real Sonar/Sounds/brainHemorrhageStage4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c205efba8b2e51394c01948861d2da5f7d7a94ec24dbaedda268f8dd61a79cc1 +size 343476 diff --git a/Real Sonar/Sounds/brainHemorrhageStage5.ogg b/Real Sonar/Sounds/brainHemorrhageStage5.ogg new file mode 100644 index 0000000..798edd7 --- /dev/null +++ b/Real Sonar/Sounds/brainHemorrhageStage5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eb5f4489b1df8a4fc817a41c9f7091cfb4293a968153ceae28fd455e1a1d95d +size 304197 diff --git a/Real Sonar/Sounds/cortizideDeath.ogg b/Real Sonar/Sounds/cortizideDeath.ogg new file mode 100644 index 0000000..e08ca27 --- /dev/null +++ b/Real Sonar/Sounds/cortizideDeath.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c65117ab9abe3ce4ed8e569a45b5e11b37d1be717411908b7ca26bfbab2d8fd6 +size 228927 diff --git a/Real Sonar/Sounds/cortizideInjection.ogg b/Real Sonar/Sounds/cortizideInjection.ogg new file mode 100644 index 0000000..eaf695f --- /dev/null +++ b/Real Sonar/Sounds/cortizideInjection.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:228e8cbc340179db7a6009ce72acc358d283ab2002b0648e195fd5b3b643e920 +size 809640 diff --git a/Real Sonar/Sounds/female_cough1.ogg b/Real Sonar/Sounds/female_cough1.ogg new file mode 100644 index 0000000..6269041 --- /dev/null +++ b/Real Sonar/Sounds/female_cough1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c91759a0f7a56ee28413bbcb0f1f0adf41b551b96e8680fe79549047576bced2 +size 33453 diff --git a/Real Sonar/Sounds/female_cough2.ogg b/Real Sonar/Sounds/female_cough2.ogg new file mode 100644 index 0000000..0ecabed --- /dev/null +++ b/Real Sonar/Sounds/female_cough2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cead0333af444a5360b8aa0ea394608a6d8907eaadf2f6952b4b3ce6c655b92 +size 39077 diff --git a/Real Sonar/Sounds/female_cough3.ogg b/Real Sonar/Sounds/female_cough3.ogg new file mode 100644 index 0000000..68372fc --- /dev/null +++ b/Real Sonar/Sounds/female_cough3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9ce9f6758c8dbdbb5e07b2301fc1108638daa0990f1d5e3e8efdf48255e84d5 +size 48131 diff --git a/Real Sonar/Sounds/female_cough4.ogg b/Real Sonar/Sounds/female_cough4.ogg new file mode 100644 index 0000000..6c246c1 --- /dev/null +++ b/Real Sonar/Sounds/female_cough4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:629f161a1e6a74f9ab266c7979a6d260281b15cd9931a28423378a36e5a05b92 +size 39319 diff --git a/Real Sonar/Sounds/female_drown1.ogg b/Real Sonar/Sounds/female_drown1.ogg new file mode 100644 index 0000000..8d37f4b --- /dev/null +++ b/Real Sonar/Sounds/female_drown1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02fcbd9b705b59e5e74be7d2382e1ae61f71a5cafbbc066a7a2a813f3a23bef8 +size 8214 diff --git a/Real Sonar/Sounds/female_drown2.ogg b/Real Sonar/Sounds/female_drown2.ogg new file mode 100644 index 0000000..b09fb62 --- /dev/null +++ b/Real Sonar/Sounds/female_drown2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24e154a2b161aecf0d6dcb605efb9b1301ed80cbd5e6fdb908839a4ac2b2894c +size 8796 diff --git a/Real Sonar/Sounds/female_drown3.ogg b/Real Sonar/Sounds/female_drown3.ogg new file mode 100644 index 0000000..dee97fc --- /dev/null +++ b/Real Sonar/Sounds/female_drown3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f35d733f39836f463fbf5d64d32e7e75b65667a7d59e2abaa4ff8aba4f54e58a +size 8104 diff --git a/Real Sonar/Sounds/female_drown4.ogg b/Real Sonar/Sounds/female_drown4.ogg new file mode 100644 index 0000000..d11425e --- /dev/null +++ b/Real Sonar/Sounds/female_drown4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d7732fc89b4b04a2f09a7cb1899a33150f477bcb263c1b41c0710a2d693f93f +size 8041 diff --git a/Real Sonar/Sounds/female_drown5.ogg b/Real Sonar/Sounds/female_drown5.ogg new file mode 100644 index 0000000..a8430b1 --- /dev/null +++ b/Real Sonar/Sounds/female_drown5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bae3fd3fb7bb155811bf48fe21a46d23e50cc6ae1e5dd76489a3cce3977537f +size 8298 diff --git a/Real Sonar/Sounds/female_wheeze1.ogg b/Real Sonar/Sounds/female_wheeze1.ogg new file mode 100644 index 0000000..8f2a506 --- /dev/null +++ b/Real Sonar/Sounds/female_wheeze1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9e6c47087ebb91c6383b14fc6d863909f936012fa90583208a5fd3f4ab7aa94 +size 58518 diff --git a/Real Sonar/Sounds/female_wheeze2.ogg b/Real Sonar/Sounds/female_wheeze2.ogg new file mode 100644 index 0000000..ff22e16 --- /dev/null +++ b/Real Sonar/Sounds/female_wheeze2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a9239aadd7d1163586e175f066b43c16b6d2628b100f88daf13bd0cb5564185 +size 64026 diff --git a/Real Sonar/Sounds/female_wheeze3.ogg b/Real Sonar/Sounds/female_wheeze3.ogg new file mode 100644 index 0000000..07cb31c --- /dev/null +++ b/Real Sonar/Sounds/female_wheeze3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d59bdd838f69cb1ae4283e8cf6c14dc4c5c1d2418014e360b0593ba5577bd67 +size 67254 diff --git a/Real Sonar/Sounds/female_wheeze4.ogg b/Real Sonar/Sounds/female_wheeze4.ogg new file mode 100644 index 0000000..f43ba34 --- /dev/null +++ b/Real Sonar/Sounds/female_wheeze4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7320c64b141e7e536f090f6aa35092bece4081af3dbbbef3bb4bb11438020e +size 62587 diff --git a/Real Sonar/Sounds/female_wheeze5.ogg b/Real Sonar/Sounds/female_wheeze5.ogg new file mode 100644 index 0000000..d76a81c --- /dev/null +++ b/Real Sonar/Sounds/female_wheeze5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b10afaa13ef4729d51d9ea8da30e1f32ea3fcec012917cc2783793ad81d0f235 +size 56887 diff --git a/Real Sonar/Sounds/male_cough1.ogg b/Real Sonar/Sounds/male_cough1.ogg new file mode 100644 index 0000000..13e6a02 --- /dev/null +++ b/Real Sonar/Sounds/male_cough1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f0d04dc7424ad4c47e9f056161b896d04e48458a6db92befff48d708e2fe622 +size 37373 diff --git a/Real Sonar/Sounds/male_cough2.ogg b/Real Sonar/Sounds/male_cough2.ogg new file mode 100644 index 0000000..2387593 --- /dev/null +++ b/Real Sonar/Sounds/male_cough2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c863146b7af52dc5b94b5f38b8a9b550c9ca8323361b6b4c393e82f32349d5d3 +size 38477 diff --git a/Real Sonar/Sounds/male_cough3.ogg b/Real Sonar/Sounds/male_cough3.ogg new file mode 100644 index 0000000..e662eaf --- /dev/null +++ b/Real Sonar/Sounds/male_cough3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3b623b8ad29b7ea836a22364ec2e237a2cac45d08cd3a4cbc5e01e76f00b34e +size 42614 diff --git a/Real Sonar/Sounds/male_cough4.ogg b/Real Sonar/Sounds/male_cough4.ogg new file mode 100644 index 0000000..4ca1717 --- /dev/null +++ b/Real Sonar/Sounds/male_cough4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45504ac517bbafecb91a64e40374a4b7d7d7f14b07502c05d6b198a4d737125a +size 36365 diff --git a/Real Sonar/Sounds/male_drown1.ogg b/Real Sonar/Sounds/male_drown1.ogg new file mode 100644 index 0000000..7bb6d2c --- /dev/null +++ b/Real Sonar/Sounds/male_drown1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25d5a3182f6399521829a7037e678a7a3402933ef43c83f12de23590b26eacda +size 8371 diff --git a/Real Sonar/Sounds/male_drown2.ogg b/Real Sonar/Sounds/male_drown2.ogg new file mode 100644 index 0000000..5a5dd65 --- /dev/null +++ b/Real Sonar/Sounds/male_drown2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8067353bad12ee6b537653db506b4dc4cc97c91bbad277137d694d00b75a232d +size 7755 diff --git a/Real Sonar/Sounds/male_drown3.ogg b/Real Sonar/Sounds/male_drown3.ogg new file mode 100644 index 0000000..7a872c2 --- /dev/null +++ b/Real Sonar/Sounds/male_drown3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e631967d50a0e63a5da147eb7473c513491d929bd5a216d801516391612b982b +size 7394 diff --git a/Real Sonar/Sounds/male_drown4.ogg b/Real Sonar/Sounds/male_drown4.ogg new file mode 100644 index 0000000..713dcd2 --- /dev/null +++ b/Real Sonar/Sounds/male_drown4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c406dc37145260771aa646f842c21e7a1818e38e4a92724c7c9f576a14a8ed7 +size 6920 diff --git a/Real Sonar/Sounds/male_drown5.ogg b/Real Sonar/Sounds/male_drown5.ogg new file mode 100644 index 0000000..295ad3d --- /dev/null +++ b/Real Sonar/Sounds/male_drown5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b48fc105801f99c78197b0163cbe27722d263f5635dec3cc5bd1999bb19675ef +size 8541 diff --git a/Real Sonar/Sounds/male_wheeze1.ogg b/Real Sonar/Sounds/male_wheeze1.ogg new file mode 100644 index 0000000..7bdbead --- /dev/null +++ b/Real Sonar/Sounds/male_wheeze1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:684cfe2717742506b3aa366a35f11b0c5d7a243ee78292055a0210931a098a84 +size 81478 diff --git a/Real Sonar/Sounds/male_wheeze2.ogg b/Real Sonar/Sounds/male_wheeze2.ogg new file mode 100644 index 0000000..68838e7 --- /dev/null +++ b/Real Sonar/Sounds/male_wheeze2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c1e3406fda7b9468eea55491d7a1a9690b7e7c1275eaecd9e9277fdc0a64a8c +size 71411 diff --git a/Real Sonar/Sounds/male_wheeze3.ogg b/Real Sonar/Sounds/male_wheeze3.ogg new file mode 100644 index 0000000..b42e664 --- /dev/null +++ b/Real Sonar/Sounds/male_wheeze3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c81e5ba5ff67cb051e3600cca5d02025ef78d728f091f5ee9db5b993ae45157 +size 71463 diff --git a/Real Sonar/Sounds/male_wheeze4.ogg b/Real Sonar/Sounds/male_wheeze4.ogg new file mode 100644 index 0000000..3123082 --- /dev/null +++ b/Real Sonar/Sounds/male_wheeze4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c9deb43aaf6e1507744b887fa19966c3a5866828f05ed5e7e188e1b0b6bed08 +size 62544 diff --git a/Real Sonar/Sounds/male_wheeze5.ogg b/Real Sonar/Sounds/male_wheeze5.ogg new file mode 100644 index 0000000..e93771e --- /dev/null +++ b/Real Sonar/Sounds/male_wheeze5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ac96a5543f7daca59bb2ead4f4e00c4df333d59f78fca4014f458d709edb84f +size 72283 diff --git a/Real Sonar/Sounds/powerDown.ogg b/Real Sonar/Sounds/powerDown.ogg new file mode 100644 index 0000000..e8fdece --- /dev/null +++ b/Real Sonar/Sounds/powerDown.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f12699fd54b51cc216437fb1c291509354450e422714fb8d134c369871a8a93 +size 111715 diff --git a/Real Sonar/Sounds/smartGraft1.ogg b/Real Sonar/Sounds/smartGraft1.ogg new file mode 100644 index 0000000..593317d --- /dev/null +++ b/Real Sonar/Sounds/smartGraft1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87bf9e290fa32c402194fe7b5e98f7440c0431be87030b206bad7ce161de504a +size 43225 diff --git a/Real Sonar/Sounds/smartGraft2.ogg b/Real Sonar/Sounds/smartGraft2.ogg new file mode 100644 index 0000000..7e0d4fb --- /dev/null +++ b/Real Sonar/Sounds/smartGraft2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a2a6db1cdf0e3e49823b322479dd8cee28b8d0b9e9f9635ec31879c341721d0 +size 46441 diff --git a/Real Sonar/Sounds/smartGraft3.ogg b/Real Sonar/Sounds/smartGraft3.ogg new file mode 100644 index 0000000..2c0a9c7 --- /dev/null +++ b/Real Sonar/Sounds/smartGraft3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a0cdc1c32944d808a6b4afc08f4db6d304784d372f0692f87cf33584c440ead +size 68259 diff --git a/Real Sonar/Sounds/smartGraft4.ogg b/Real Sonar/Sounds/smartGraft4.ogg new file mode 100644 index 0000000..462275b --- /dev/null +++ b/Real Sonar/Sounds/smartGraft4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b28b0588cc748039638f137655d1d4b470d97dff98b81f384f50a77390572a3 +size 79481 diff --git a/Real Sonar/Sounds/sonarAmbience1.ogg b/Real Sonar/Sounds/sonarAmbience1.ogg new file mode 100644 index 0000000..e838e7b --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbience1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2634037731e2f596cc32130c0c9fc55dc2732be2a1baed8307104ed901c1efe5 +size 54806 diff --git a/Real Sonar/Sounds/sonarAmbience2.ogg b/Real Sonar/Sounds/sonarAmbience2.ogg new file mode 100644 index 0000000..03dc637 --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbience2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61ee4e33d248307f030f2cce5e0675f665e617749adb78ab032a840c21cbdedd +size 155535 diff --git a/Real Sonar/Sounds/sonarAmbience3.ogg b/Real Sonar/Sounds/sonarAmbience3.ogg new file mode 100644 index 0000000..c3dc63d --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbience3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:052d581551c5eecdd9edffad0e26bd8692edaf1af92e0afdbd48ef3a2dc0c914 +size 127589 diff --git a/Real Sonar/Sounds/sonarAmbienceShuttle1.ogg b/Real Sonar/Sounds/sonarAmbienceShuttle1.ogg new file mode 100644 index 0000000..2380f20 --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbienceShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16d0466e6d2759a8f9b5372dc132178be2aafc3f95a765f79b3d603fe236b06c +size 205019 diff --git a/Real Sonar/Sounds/sonarAmbienceShuttle2.ogg b/Real Sonar/Sounds/sonarAmbienceShuttle2.ogg new file mode 100644 index 0000000..06e3cb4 --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbienceShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17eccc4655fda9bdb95dc9fcaf0dba91385906bc8afd36520373ea07aa66849f +size 223529 diff --git a/Real Sonar/Sounds/sonarAmbienceShuttle3.ogg b/Real Sonar/Sounds/sonarAmbienceShuttle3.ogg new file mode 100644 index 0000000..6b9ea60 --- /dev/null +++ b/Real Sonar/Sounds/sonarAmbienceShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a720177246063b0f6bd6a0fe990a5dc7727e6474fb77825216ba2abecd7b6988 +size 283894 diff --git a/Real Sonar/Sounds/sonarDistortion1.ogg b/Real Sonar/Sounds/sonarDistortion1.ogg new file mode 100644 index 0000000..d57904d --- /dev/null +++ b/Real Sonar/Sounds/sonarDistortion1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f6e44d6a039073d2786202ff388e7788dcd9e858aa3cc00a256d9efc9f18ed0 +size 144390 diff --git a/Real Sonar/Sounds/sonarDistortion2.ogg b/Real Sonar/Sounds/sonarDistortion2.ogg new file mode 100644 index 0000000..f182f2f --- /dev/null +++ b/Real Sonar/Sounds/sonarDistortion2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bc8d3803b241644503da9893ff4c27da911c376d2577361dbb96084df3c0529 +size 91262 diff --git a/Real Sonar/Sounds/sonarDistortion3.ogg b/Real Sonar/Sounds/sonarDistortion3.ogg new file mode 100644 index 0000000..0f5c6ce --- /dev/null +++ b/Real Sonar/Sounds/sonarDistortion3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60572c459f8b14b7f29a4db90a17c40f6c61c18c7e3cd1f24ba70a1b98c2234d +size 110077 diff --git a/Real Sonar/Sounds/sonarDistortion4.ogg b/Real Sonar/Sounds/sonarDistortion4.ogg new file mode 100644 index 0000000..6efd51f --- /dev/null +++ b/Real Sonar/Sounds/sonarDistortion4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0b4eaee7705cd773b56f91aaca8816e196fce209f0d023ab9febd7e58b87569 +size 103034 diff --git a/Real Sonar/Sounds/sonarPingAirClose1.ogg b/Real Sonar/Sounds/sonarPingAirClose1.ogg new file mode 100644 index 0000000..a269722 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:098adedb2313ac7919ec90c9f0f7add540e8789f011e97e46537471c06dbb255 +size 48104 diff --git a/Real Sonar/Sounds/sonarPingAirClose1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirClose1_Directional.ogg new file mode 100644 index 0000000..c0e5dc5 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirClose1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1eef45562663d46689b7fc4f9ff7290d49f72961ec954e4eb39b7aced02cf60 +size 70182 diff --git a/Real Sonar/Sounds/sonarPingAirClose2.ogg b/Real Sonar/Sounds/sonarPingAirClose2.ogg new file mode 100644 index 0000000..92ac60c --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a21f1c36676e4e47f5cb54ff6a27c6950119d9918b3ebe04a8d5e5f5ad590fc7 +size 46926 diff --git a/Real Sonar/Sounds/sonarPingAirClose2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirClose2_Directional.ogg new file mode 100644 index 0000000..4cfdb7a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirClose2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b99784840eb512fd7cdbcf6528c4817ce110c07384ee94c586149fd2912ea56 +size 65586 diff --git a/Real Sonar/Sounds/sonarPingAirCloseShuttle1.ogg b/Real Sonar/Sounds/sonarPingAirCloseShuttle1.ogg new file mode 100644 index 0000000..4af8301 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efb16ea04ba157cf62fa8774b2ae7b7a551a95262f4d36b3e9cd63a27a866136 +size 45467 diff --git a/Real Sonar/Sounds/sonarPingAirCloseShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirCloseShuttle1_Directional.ogg new file mode 100644 index 0000000..e81fbfd --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirCloseShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77d68ac33df073177bb7296926c33205d0377dadbbe859a2933f4dd43ba057e8 +size 65784 diff --git a/Real Sonar/Sounds/sonarPingAirCloseShuttle2.ogg b/Real Sonar/Sounds/sonarPingAirCloseShuttle2.ogg new file mode 100644 index 0000000..d508493 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28afe0c163120a7025dcf14f4531adabfdf5a813e11fdba881af717c4c61e6a8 +size 45625 diff --git a/Real Sonar/Sounds/sonarPingAirCloseShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirCloseShuttle2_Directional.ogg new file mode 100644 index 0000000..10d6567 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirCloseShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bc50275acf0a2695dc9bdf31567df39243640fd926ef934a50ac89db911483c +size 64887 diff --git a/Real Sonar/Sounds/sonarPingAirFar1.ogg b/Real Sonar/Sounds/sonarPingAirFar1.ogg new file mode 100644 index 0000000..10a5b56 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22e12324b217a797f8f6a8b7dc47c14a58a84a0c58b8622eeddbbd6a05b622a4 +size 16954 diff --git a/Real Sonar/Sounds/sonarPingAirFar1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirFar1_Directional.ogg new file mode 100644 index 0000000..cf768c7 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b9f830da486b4d91e84dd03b878bbaa35afba6e7256ddf23de3a635613140b7 +size 16553 diff --git a/Real Sonar/Sounds/sonarPingAirFar2.ogg b/Real Sonar/Sounds/sonarPingAirFar2.ogg new file mode 100644 index 0000000..9a4e48e --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ad45a09a369d33d9f6f65eef8295c6974252d45b07d16887c3e07158f842b90 +size 18705 diff --git a/Real Sonar/Sounds/sonarPingAirFar2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirFar2_Directional.ogg new file mode 100644 index 0000000..8d1be4d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:975719816fc8e9d918e6ed585bc4a5a278d71f2e4fe5475e1f336d9d9023a996 +size 19058 diff --git a/Real Sonar/Sounds/sonarPingAirFar3.ogg b/Real Sonar/Sounds/sonarPingAirFar3.ogg new file mode 100644 index 0000000..5c45b83 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1abb342fe4855cbd4814bb1cae72e263f5a8b80ba6f64bc34939869e31efa64 +size 18833 diff --git a/Real Sonar/Sounds/sonarPingAirFar3_Directional.ogg b/Real Sonar/Sounds/sonarPingAirFar3_Directional.ogg new file mode 100644 index 0000000..d8ad5e8 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFar3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c34106c72eebc5cdb2016024beed8484fb81e9ab5d7bb729207aa3319cfc070 +size 19867 diff --git a/Real Sonar/Sounds/sonarPingAirFarShuttle1.ogg b/Real Sonar/Sounds/sonarPingAirFarShuttle1.ogg new file mode 100644 index 0000000..f46cc7c --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c0ca0ab6135b84672c9bece5f3257db702e50acb934d836d54759b0c222a613 +size 37082 diff --git a/Real Sonar/Sounds/sonarPingAirFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirFarShuttle1_Directional.ogg new file mode 100644 index 0000000..5a8f775 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fb46f65b2955270a0b87f96f3951cbf65446e5ea57fb12d8b1f0ae1353c92ec +size 52770 diff --git a/Real Sonar/Sounds/sonarPingAirFarShuttle2.ogg b/Real Sonar/Sounds/sonarPingAirFarShuttle2.ogg new file mode 100644 index 0000000..66ceada --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6d653118a8e2186b52fd966a99152767b41ad5309fde6839aa26a0b2c5c4f52 +size 36791 diff --git a/Real Sonar/Sounds/sonarPingAirFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirFarShuttle2_Directional.ogg new file mode 100644 index 0000000..6de16ca --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0468147dda5ed22ee76ff9075d2c0290d83349dd083003123b54a840588c927b +size 51812 diff --git a/Real Sonar/Sounds/sonarPingAirMedium1.ogg b/Real Sonar/Sounds/sonarPingAirMedium1.ogg new file mode 100644 index 0000000..9708142 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b418ae9081097ca37115aa70c170b88f1d96fa3bfff98381338769e792f2842 +size 14019 diff --git a/Real Sonar/Sounds/sonarPingAirMedium1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirMedium1_Directional.ogg new file mode 100644 index 0000000..863e40b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4fc79ab6c880efd49970e182f3ec2427aa44585946311de1a77810b352ddde8 +size 19305 diff --git a/Real Sonar/Sounds/sonarPingAirMedium2.ogg b/Real Sonar/Sounds/sonarPingAirMedium2.ogg new file mode 100644 index 0000000..8cd6a53 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67360c6166e60cb8fca114f5c33d9618096eb64f83f5f480ea6dfca894c0ab6e +size 15114 diff --git a/Real Sonar/Sounds/sonarPingAirMedium2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirMedium2_Directional.ogg new file mode 100644 index 0000000..c0c4fba --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42b1600f89e0217ccf937267cd0447f62200c0c21bc025b5b70d12fa382c5cbf +size 19808 diff --git a/Real Sonar/Sounds/sonarPingAirMediumShuttle1.ogg b/Real Sonar/Sounds/sonarPingAirMediumShuttle1.ogg new file mode 100644 index 0000000..7775148 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f58b4a7ed1a9b7dd2d983f48c62fbfeb7e6825d25c73affe5262460e9e369ea +size 50576 diff --git a/Real Sonar/Sounds/sonarPingAirMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingAirMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..7c81265 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6cc72249bd4cb913b477c882929ff89688ce18b86456b926a9212f72ad4288e +size 70504 diff --git a/Real Sonar/Sounds/sonarPingAirMediumShuttle2.ogg b/Real Sonar/Sounds/sonarPingAirMediumShuttle2.ogg new file mode 100644 index 0000000..00f878f --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ac174ff322f00dc33bdc4260418dc35d9c0e92f232dc5271c9ff5a69de44372 +size 49898 diff --git a/Real Sonar/Sounds/sonarPingAirMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingAirMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..774887a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingAirMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec5e1a32709fc6ccecef2bff652cbc3f5377e0e163f602e950a6e56a0456c229 +size 69711 diff --git a/Real Sonar/Sounds/sonarPingSuitClose1.ogg b/Real Sonar/Sounds/sonarPingSuitClose1.ogg new file mode 100644 index 0000000..f95cdd1 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b31ff942cfd11baadacab47efb5fb3ca765da5aa0d47b78911c3bd405805da5e +size 38039 diff --git a/Real Sonar/Sounds/sonarPingSuitClose2.ogg b/Real Sonar/Sounds/sonarPingSuitClose2.ogg new file mode 100644 index 0000000..a922fd4 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:133636486018d0af7792285eee66ff5913824a43ca67903c5fc18ec1f695b7a6 +size 38119 diff --git a/Real Sonar/Sounds/sonarPingSuitClose3.ogg b/Real Sonar/Sounds/sonarPingSuitClose3.ogg new file mode 100644 index 0000000..7b41443 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:897e120616f55ffacd72735e00c58a11dccbcd15ca9f1b62b8c4269aa7a55854 +size 38035 diff --git a/Real Sonar/Sounds/sonarPingSuitCloseShuttle1.ogg b/Real Sonar/Sounds/sonarPingSuitCloseShuttle1.ogg new file mode 100644 index 0000000..363c8d3 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e400f5918f4af8d16eb71317be5ff68471a6e37351f7c9e7a2eb248c54bd49d3 +size 42464 diff --git a/Real Sonar/Sounds/sonarPingSuitCloseShuttle2.ogg b/Real Sonar/Sounds/sonarPingSuitCloseShuttle2.ogg new file mode 100644 index 0000000..ff0936c --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0898d2fecda343b123f4f22a64255880ceb572af74ea653f3bd2cf9cb5a958ce +size 37708 diff --git a/Real Sonar/Sounds/sonarPingSuitCloseShuttle3.ogg b/Real Sonar/Sounds/sonarPingSuitCloseShuttle3.ogg new file mode 100644 index 0000000..2eb3724 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70098d16ac99f585842aace94d72dbcaa5a2e9a79924c65de6b4b1c41c0501eb +size 38574 diff --git a/Real Sonar/Sounds/sonarPingSuitFar1.ogg b/Real Sonar/Sounds/sonarPingSuitFar1.ogg new file mode 100644 index 0000000..7c3b8bf --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd0896de48a81eca899530d9c500284b6448cefd72a6a99c65db2d9b9125992b +size 37415 diff --git a/Real Sonar/Sounds/sonarPingSuitFar1_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFar1_Directional.ogg new file mode 100644 index 0000000..e39ddcf --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dfda1af77e0287dc5b1bb53e1b0cf53e4f4b549044814e36d36a0ef8fdb9a4f +size 43421 diff --git a/Real Sonar/Sounds/sonarPingSuitFar2.ogg b/Real Sonar/Sounds/sonarPingSuitFar2.ogg new file mode 100644 index 0000000..d4852ab --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c9a1a3d5270893c1e7d138b6e0a23f17f4fd5b4bf8ae2cfd01dbea34923e123 +size 39957 diff --git a/Real Sonar/Sounds/sonarPingSuitFar2_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFar2_Directional.ogg new file mode 100644 index 0000000..4a3d7e5 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bba2f62ccee5f55528e26e65f8d5b0e848fb4a6b293ce33d4110f79fdd20ff6e +size 42735 diff --git a/Real Sonar/Sounds/sonarPingSuitFar3.ogg b/Real Sonar/Sounds/sonarPingSuitFar3.ogg new file mode 100644 index 0000000..7b665f0 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e6dd6cca04f8129c26adbdadd5c3429a98fd0c6ed12d12159f8a64adb707e46 +size 40053 diff --git a/Real Sonar/Sounds/sonarPingSuitFar3_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFar3_Directional.ogg new file mode 100644 index 0000000..dfdadee --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFar3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:699cf21684ca92105244536099c3159ae44c16e48d1efddcd0e37f70fb70d1b2 +size 42904 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle1.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle1.ogg new file mode 100644 index 0000000..5710e53 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e33c9f0b865f11d68eeda1b089de3531cfb1b7b1bfe453a774292d2f890e0cf +size 38295 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle1_Directional.ogg new file mode 100644 index 0000000..57ac53a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e80a18f4f581b4d92674eb704f7ddad625cb804ce093e0981b596966e3f8a95d +size 63722 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle2.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle2.ogg new file mode 100644 index 0000000..00cb58e --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93a5d98c3202a7d293d3d703681b8ba6a83f02878afb1cb595eb8b72976e25eb +size 38054 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle2_Directional.ogg new file mode 100644 index 0000000..bdd8d2e --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c42fc0aaff543a63477997cbbc3c471c38d9c8611c499059288082598c400710 +size 61542 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle3.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle3.ogg new file mode 100644 index 0000000..59cb7c5 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12f26f1025e2744ab3bc3922a880f7d09a5073996ccd2f3ae78e64451954bb85 +size 38318 diff --git a/Real Sonar/Sounds/sonarPingSuitFarShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitFarShuttle3_Directional.ogg new file mode 100644 index 0000000..4840eb3 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitFarShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cedab5d5be6bbcbbcbebe7b14e396d4ff2245a8c2d23e5e84e2438b17f2b12bf +size 62513 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium1.ogg b/Real Sonar/Sounds/sonarPingSuitMedium1.ogg new file mode 100644 index 0000000..4448a88 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:838ef67b263ebb59da693a00f5eb9337c36d9a61ad55ea7edcd6f624f4c399c2 +size 67432 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium1_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMedium1_Directional.ogg new file mode 100644 index 0000000..a25888b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e78f2a56d93feb0b4e11a8e898f6bc4e3504143b327c3b3513b8063f6cb21e6 +size 72028 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium2.ogg b/Real Sonar/Sounds/sonarPingSuitMedium2.ogg new file mode 100644 index 0000000..18f077d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:076477d758edfcc7cc828d8ba5c39f81a5e356d47450fb31a5fe432dd8f7408c +size 65141 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium2_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMedium2_Directional.ogg new file mode 100644 index 0000000..12864b7 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78bdfa08bcec14053260de49ee8772257f0c14fecbc0e44a0608c348d6bd1d92 +size 70630 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium3.ogg b/Real Sonar/Sounds/sonarPingSuitMedium3.ogg new file mode 100644 index 0000000..5ca1684 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58db42fea6a41262d910eb64ab8a47bfa0b1a60fd33e95e9057f1767de250a99 +size 64289 diff --git a/Real Sonar/Sounds/sonarPingSuitMedium3_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMedium3_Directional.ogg new file mode 100644 index 0000000..1c35557 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMedium3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d34c32feaf4def912e582cf2e0d41f6c1dd59d995ae4d47902c755e56c83448 +size 69284 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle1.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle1.ogg new file mode 100644 index 0000000..03cec12 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:107e6fc1440e80e09778646760244a091928f851acdb486515e62d2afe3c160b +size 42053 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..f85205b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1195122c735ac64dd4e3f3937e11561e0a50f3dff2652486a6b1306f666e5b63 +size 70889 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle2.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle2.ogg new file mode 100644 index 0000000..fa02a6f --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fb437befece96c57c61f7cbdf198c362166d9ed9ab957d39a5f2b332253a31d +size 42143 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..cf81b72 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8e5fe32b35a90db33b9869c4c7947f86f62bf2abb0311c0a9c0133b1302c147 +size 70206 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle3.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle3.ogg new file mode 100644 index 0000000..f43f6a5 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5f107892480ba7e164c2b4c86c196e1fe44de93598e19c5f821a595698a976 +size 41956 diff --git a/Real Sonar/Sounds/sonarPingSuitMediumShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarPingSuitMediumShuttle3_Directional.ogg new file mode 100644 index 0000000..1c47a10 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitMediumShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ceff0c47fcac12025e4c5e7c5b18da05c875bccb2da87096040e21584554e80b +size 68715 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryClose1.ogg b/Real Sonar/Sounds/sonarPingSuitVeryClose1.ogg new file mode 100644 index 0000000..7d7bd9a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f13a32395b6895fd8cafe59d62d5ce06ec719ebd253e5f34c62dbf2ee152d0d +size 20466 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryClose2.ogg b/Real Sonar/Sounds/sonarPingSuitVeryClose2.ogg new file mode 100644 index 0000000..4006e00 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8068f2f1c2392950c7e8c1792d4e74758b556127f38132002c77c50f706bc0cf +size 20700 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryClose3.ogg b/Real Sonar/Sounds/sonarPingSuitVeryClose3.ogg new file mode 100644 index 0000000..efce97f --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e7c1bcd0248d89d59ce4f0f52d7b419cb1f5715c78eb4ebbdb5e12d768beb78 +size 20885 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle1.ogg b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle1.ogg new file mode 100644 index 0000000..a829769 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09ba6335123676b1f511b549336b215804ce056a83d50516f33d7c09039d1be5 +size 33102 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle2.ogg b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle2.ogg new file mode 100644 index 0000000..c4b9704 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5ddedd1a596e66dedaf9ffa25768f515e42cbc690ef45f3cb8f90dc01d69e0f +size 32162 diff --git a/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle3.ogg b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle3.ogg new file mode 100644 index 0000000..86dbdc8 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingSuitVeryCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a83f711be02c7478e6c382f60aae95c8a3110157e507b666fb6c778744222c74 +size 32227 diff --git a/Real Sonar/Sounds/sonarPingWaterClose1.ogg b/Real Sonar/Sounds/sonarPingWaterClose1.ogg new file mode 100644 index 0000000..19f8073 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8a8a2ffe92f00b13c9b8054c1928b1658b5b217ef363259d8e3a3aafaa37be5 +size 59407 diff --git a/Real Sonar/Sounds/sonarPingWaterClose2.ogg b/Real Sonar/Sounds/sonarPingWaterClose2.ogg new file mode 100644 index 0000000..797c19b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:302499b692680e05748ff3208be38b575fd3a7cf96c902811a7fd6947699adf2 +size 60033 diff --git a/Real Sonar/Sounds/sonarPingWaterCloseShuttle1.ogg b/Real Sonar/Sounds/sonarPingWaterCloseShuttle1.ogg new file mode 100644 index 0000000..a7bac55 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0979da90d42120b840bcac4172df4d0f20e037677ad9fea5345ca9ddda9246e +size 54648 diff --git a/Real Sonar/Sounds/sonarPingWaterCloseShuttle2.ogg b/Real Sonar/Sounds/sonarPingWaterCloseShuttle2.ogg new file mode 100644 index 0000000..947cbd9 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:135ea74c1fa1c116983aa850d4ff44518e7abcd8936139d9d889941b203ac3e0 +size 53016 diff --git a/Real Sonar/Sounds/sonarPingWaterCloseShuttle3.ogg b/Real Sonar/Sounds/sonarPingWaterCloseShuttle3.ogg new file mode 100644 index 0000000..3fd20f8 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5827f0c9dc705f10305c0afe7eccf40f02909d49b5960d8b5d534b5a795cdd7c +size 52291 diff --git a/Real Sonar/Sounds/sonarPingWaterFar1.ogg b/Real Sonar/Sounds/sonarPingWaterFar1.ogg new file mode 100644 index 0000000..6acb676 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd5b1fbdfd2b3e559d98d006854d73341f158957ee4ecc78e1de6eb7de0b69f8 +size 46292 diff --git a/Real Sonar/Sounds/sonarPingWaterFar1_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterFar1_Directional.ogg new file mode 100644 index 0000000..bd9f98a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f6537d597a0f90f44133dde57571a7d4d89be4dd0cb1f7a7b36c7245b6e539f +size 58043 diff --git a/Real Sonar/Sounds/sonarPingWaterFar2.ogg b/Real Sonar/Sounds/sonarPingWaterFar2.ogg new file mode 100644 index 0000000..912bf39 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6c84c4a5da523c39a7cc0ef5fa2965b7045cd1bd289f02fdd273e3f4a38c068 +size 46370 diff --git a/Real Sonar/Sounds/sonarPingWaterFar2_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterFar2_Directional.ogg new file mode 100644 index 0000000..b62052d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d35364e33e985e96e77e7bc1dcce820a7813eacac6ad2b48587d78051439f2f +size 59513 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle1.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle1.ogg new file mode 100644 index 0000000..e742688 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41fc6b5aab1ae024847f4d5c43f885a30709001a34f857d9028d9280a0ec6e0f +size 52512 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle1_Directional.ogg new file mode 100644 index 0000000..b823d20 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b77b239c7f3e2a99c7b9fd404278c7a5c5729b014d7ac2cce291b4bbe32e4def +size 90245 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle2.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle2.ogg new file mode 100644 index 0000000..dc1ea79 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a95436bb9b5203923d571b54aea1d936ee21ba2d9065e36a438f26d3c57637dc +size 52525 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle2_Directional.ogg new file mode 100644 index 0000000..8880ea2 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7d798d6b802f9434643bccb681a5bfd8bb82fdbcca37e60da00530d7e8ada95 +size 90018 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle3.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle3.ogg new file mode 100644 index 0000000..ffcc2a5 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33c40c8fc3fba20f43e6f60d7450f32e157471a7f495dfbc7d0fbbccd7dac268 +size 52513 diff --git a/Real Sonar/Sounds/sonarPingWaterFarShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterFarShuttle3_Directional.ogg new file mode 100644 index 0000000..646cc33 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterFarShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d6012832ad2bf2ffc48690d60ff58deab67d78389ab236807f8659ebbe7979e +size 85302 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium1.ogg b/Real Sonar/Sounds/sonarPingWaterMedium1.ogg new file mode 100644 index 0000000..73bbf7e --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fa602b50bbeca2996e02098f23ff30358bc7c6e339b6963ca375ff9bdf290cc +size 52781 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium1_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMedium1_Directional.ogg new file mode 100644 index 0000000..520054a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc0bd9a5b56f8383e60f6f30e17587e81ba298d611bdadbf054461ebb5c50107 +size 85066 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium2.ogg b/Real Sonar/Sounds/sonarPingWaterMedium2.ogg new file mode 100644 index 0000000..eff937b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:388411c6d1a7bd22e1ec628d24b522e2fd8f0bac839cd96d6892b6eb970f2090 +size 52848 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium2_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMedium2_Directional.ogg new file mode 100644 index 0000000..a8a275a --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a3c16cd5adb8cff5274c03ac95e539eecc4b98958c2353f4dec8ffc7c80d4c4 +size 83544 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium3.ogg b/Real Sonar/Sounds/sonarPingWaterMedium3.ogg new file mode 100644 index 0000000..5a9bf0b --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5298ae2ab46de8c8e5c9377ecf97f55e49eb10514c117eca913720c75004a569 +size 52789 diff --git a/Real Sonar/Sounds/sonarPingWaterMedium3_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMedium3_Directional.ogg new file mode 100644 index 0000000..4a8776c --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMedium3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d27819310f0b6ce1aefc5e245a46172e7f9201de220f38542e066fd7a90e4000 +size 83105 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle1.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle1.ogg new file mode 100644 index 0000000..e838dab --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9df081ec9beda1f60cfaf90fb1efb36436a614ab60f050558f9ac6b479c288db +size 52710 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..d14685d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9df5c11d93697a5c157e5b73dc95713e9cdacfbde666c6d2e0cd793a0a9acfe +size 118633 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle2.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle2.ogg new file mode 100644 index 0000000..427c6cd --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:688ae0d6ca60ac4d35057ec528f171e7b7251588104f7eb57269ee3956a77380 +size 52716 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..6bc0618 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:646d7341a7da8b128c5fa14dea73853ea65a483feb709ee0846c2d650909809c +size 115672 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle3.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle3.ogg new file mode 100644 index 0000000..c622c4d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56a0e636a79b3a4344832ed69b25d52b650c84d60ddc62c4e717ef33330dc80a +size 52453 diff --git a/Real Sonar/Sounds/sonarPingWaterMediumShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarPingWaterMediumShuttle3_Directional.ogg new file mode 100644 index 0000000..c57642d --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterMediumShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7c196e9c1423ca6bfd7e411cc0d3dc90b76088deeb00b788dce4b93fb6049a7 +size 115758 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryClose1.ogg b/Real Sonar/Sounds/sonarPingWaterVeryClose1.ogg new file mode 100644 index 0000000..3253faa --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef02bb181f3152e8dc62a38e25ed5e91149fba4aa21d0269a4b5ab974a8a88de +size 72368 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryClose2.ogg b/Real Sonar/Sounds/sonarPingWaterVeryClose2.ogg new file mode 100644 index 0000000..1d967c1 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f0a81522685f862a8be02b9f9fd80dd6c64971e7258688acd6a192e7722e5e7 +size 70225 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryClose3.ogg b/Real Sonar/Sounds/sonarPingWaterVeryClose3.ogg new file mode 100644 index 0000000..48447e1 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01b5f81fe066eddd7f46465f6db236d450b107aa5734c4700dc7d5be7c1b5188 +size 68243 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle1.ogg b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle1.ogg new file mode 100644 index 0000000..c69810e --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83e9da93b50531ccf4685c7b0427298116e372ae06afd38c76536665494025db +size 52861 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle2.ogg b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle2.ogg new file mode 100644 index 0000000..06fbe26 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:292fc2b140b8109bdbb49dbefad832d4a5711e78e97e75d996f7955e02a0eeff +size 68016 diff --git a/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle3.ogg b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle3.ogg new file mode 100644 index 0000000..7ad8bd3 --- /dev/null +++ b/Real Sonar/Sounds/sonarPingWaterVeryCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed6b541e11b0a3342c3770387b32568704ae927bc4d9566b455d9e354695ab85 +size 65076 diff --git a/Real Sonar/Sounds/sonarPowerOn1.ogg b/Real Sonar/Sounds/sonarPowerOn1.ogg new file mode 100644 index 0000000..95622cf --- /dev/null +++ b/Real Sonar/Sounds/sonarPowerOn1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e5cd974ab18d501c7931d65a66caf2476e870846c1337d55c7031d41ee0ad50 +size 202705 diff --git a/Real Sonar/Sounds/sonarTailAirClose1.ogg b/Real Sonar/Sounds/sonarTailAirClose1.ogg new file mode 100644 index 0000000..f841dfb --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a3832e1aa2e327c457f1d133ac370a0d43c9a50808e042fb6e705eb2a8c641f +size 49500 diff --git a/Real Sonar/Sounds/sonarTailAirClose1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirClose1_Directional.ogg new file mode 100644 index 0000000..8b48fe8 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirClose1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e727acb7255fe842623c8f12b18630a61f1d9df5fcff7cc8533d51a4bf756c8b +size 76768 diff --git a/Real Sonar/Sounds/sonarTailAirClose2.ogg b/Real Sonar/Sounds/sonarTailAirClose2.ogg new file mode 100644 index 0000000..13977a1 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b71fb5d1eeee48cc13b016e28e967eb452b66ec519f3f6e951fe9f31af92f15c +size 48374 diff --git a/Real Sonar/Sounds/sonarTailAirClose2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirClose2_Directional.ogg new file mode 100644 index 0000000..a32b478 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirClose2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53333041f1fffc8e6897148e5d74cddd48b81aaa8c74e71ae2570587330ba7b7 +size 74212 diff --git a/Real Sonar/Sounds/sonarTailAirCloseShuttle1.ogg b/Real Sonar/Sounds/sonarTailAirCloseShuttle1.ogg new file mode 100644 index 0000000..baeb56c --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c144e891cbf47f5a92bf992c5e96d4a1c86e452dddf0b7de7fe14f5bacf2d834 +size 39354 diff --git a/Real Sonar/Sounds/sonarTailAirCloseShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirCloseShuttle1_Directional.ogg new file mode 100644 index 0000000..49adf75 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirCloseShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b59c72a64af95feab98953a47e88ad4a4ff62bb8ab990d4464a8fada9140f398 +size 54290 diff --git a/Real Sonar/Sounds/sonarTailAirCloseShuttle2.ogg b/Real Sonar/Sounds/sonarTailAirCloseShuttle2.ogg new file mode 100644 index 0000000..966c97c --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e6d0787fef5d8e041955bdac987c393bbab55f355ffdb7a7f0a689008ea4cd8 +size 40238 diff --git a/Real Sonar/Sounds/sonarTailAirCloseShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirCloseShuttle2_Directional.ogg new file mode 100644 index 0000000..8779cc8 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirCloseShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6a6bda518f5b3cc2dfc737b0442eeae4c2336a825663aceeaaf068db78cb833 +size 53040 diff --git a/Real Sonar/Sounds/sonarTailAirFar1.ogg b/Real Sonar/Sounds/sonarTailAirFar1.ogg new file mode 100644 index 0000000..9f073dd --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4945b94098f1b3941577b292a6d51055c2438191f2f30c43d9fcf41aaa2db4e +size 9948 diff --git a/Real Sonar/Sounds/sonarTailAirFar1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirFar1_Directional.ogg new file mode 100644 index 0000000..90dd40f --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0412e4f658e0ae09020e30ef3f8db84285e7faf2a80050eab80d216cb55fbc1 +size 10206 diff --git a/Real Sonar/Sounds/sonarTailAirFar2.ogg b/Real Sonar/Sounds/sonarTailAirFar2.ogg new file mode 100644 index 0000000..07c22d3 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a74d98775c4e4e2cd2c58257a334642faf5d78675dd01ec249efc5a342614bd +size 12894 diff --git a/Real Sonar/Sounds/sonarTailAirFar2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirFar2_Directional.ogg new file mode 100644 index 0000000..8ddb14b --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a05d01f1358be684b9261ec7f25f06ba35f6bbebe771a14d6e1c82728d490c3 +size 13504 diff --git a/Real Sonar/Sounds/sonarTailAirFar3.ogg b/Real Sonar/Sounds/sonarTailAirFar3.ogg new file mode 100644 index 0000000..6e0c899 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36310cc7474a9a7733ec2d849937ce820be55e76760c4089a1eeac074a00522f +size 12142 diff --git a/Real Sonar/Sounds/sonarTailAirFar3_Directional.ogg b/Real Sonar/Sounds/sonarTailAirFar3_Directional.ogg new file mode 100644 index 0000000..f3848c8 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFar3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f4e5c640d588745801e02f54a907567b7ed6741850cd6fbc73538d5ee2e74a2 +size 13024 diff --git a/Real Sonar/Sounds/sonarTailAirFarShuttle1.ogg b/Real Sonar/Sounds/sonarTailAirFarShuttle1.ogg new file mode 100644 index 0000000..058c5c1 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc51f24e95690c770c334039c0624f6bb625c16f4d2c7c8908713b0ecf1022f5 +size 30324 diff --git a/Real Sonar/Sounds/sonarTailAirFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirFarShuttle1_Directional.ogg new file mode 100644 index 0000000..40a384f --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e89e8e6c400fc0f490e1e04da8bcbc123fe41765bab9e66febdc3fd9d3aadf6 +size 39116 diff --git a/Real Sonar/Sounds/sonarTailAirFarShuttle2.ogg b/Real Sonar/Sounds/sonarTailAirFarShuttle2.ogg new file mode 100644 index 0000000..a143de2 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:638a445dda2c118a171b0ff789b1e52f77074f1a742ff4f74a74aa15baf1f3ab +size 29050 diff --git a/Real Sonar/Sounds/sonarTailAirFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirFarShuttle2_Directional.ogg new file mode 100644 index 0000000..5164e19 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f21f2ab418079f9e4bfe984ccc8a42e691595b48e4bd33e4847891cd6850f9fa +size 33700 diff --git a/Real Sonar/Sounds/sonarTailAirMedium1.ogg b/Real Sonar/Sounds/sonarTailAirMedium1.ogg new file mode 100644 index 0000000..6044854 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ab2d2771d1000e6a29bd5027eacde5858113bb351bc840bedf719e59384a3d8 +size 10219 diff --git a/Real Sonar/Sounds/sonarTailAirMedium1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirMedium1_Directional.ogg new file mode 100644 index 0000000..9fa02c4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:941126e83346ca7cc15938274c6280b707dea2ab4b2d8f4e012fd6258ae7fd86 +size 17073 diff --git a/Real Sonar/Sounds/sonarTailAirMedium2.ogg b/Real Sonar/Sounds/sonarTailAirMedium2.ogg new file mode 100644 index 0000000..8536ff3 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ff994db8ba0e7f9a3b73031d8570334b501caecaba1adb5d859d22a0fc16feb +size 10789 diff --git a/Real Sonar/Sounds/sonarTailAirMedium2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirMedium2_Directional.ogg new file mode 100644 index 0000000..ff54767 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9806b988efe2c7802ae19b4237640b27e61fe7fa00e1e56d6cd8a445749bbbb7 +size 15912 diff --git a/Real Sonar/Sounds/sonarTailAirMediumShuttle1.ogg b/Real Sonar/Sounds/sonarTailAirMediumShuttle1.ogg new file mode 100644 index 0000000..b8ae5ad --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8971abaa5e318889254722962233100454b7753b1347b5042dd7f23ac29e377 +size 40150 diff --git a/Real Sonar/Sounds/sonarTailAirMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailAirMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..424f5b0 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bbd9f805e14ff1419d0edfb558efd40771f1484505e60d706fb5f58fe2df6e7 +size 51657 diff --git a/Real Sonar/Sounds/sonarTailAirMediumShuttle2.ogg b/Real Sonar/Sounds/sonarTailAirMediumShuttle2.ogg new file mode 100644 index 0000000..667d78d --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddbf5510c8b0794632a17a5bcc296c1ec371268c4ec3e40ba10953d838394b99 +size 40002 diff --git a/Real Sonar/Sounds/sonarTailAirMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailAirMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..fb530ef --- /dev/null +++ b/Real Sonar/Sounds/sonarTailAirMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfc4c2a4aa748ec10fd20a1a0e78af333465cea42f5d1da4ade3e8afaa67d759 +size 51384 diff --git a/Real Sonar/Sounds/sonarTailSuitClose1.ogg b/Real Sonar/Sounds/sonarTailSuitClose1.ogg new file mode 100644 index 0000000..ec59189 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f2076b85b1b163a9a72b8c0dc04e46d79e8bce70f0b379d1d4179cd669e7deb +size 45579 diff --git a/Real Sonar/Sounds/sonarTailSuitClose2.ogg b/Real Sonar/Sounds/sonarTailSuitClose2.ogg new file mode 100644 index 0000000..f6e0ae7 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f350fe83e365a50d5cbdd6d91568727c43b7f3672e6edeec726b1ded5b75635f +size 45985 diff --git a/Real Sonar/Sounds/sonarTailSuitClose3.ogg b/Real Sonar/Sounds/sonarTailSuitClose3.ogg new file mode 100644 index 0000000..f2b3e59 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1b4fcf342e0785d3c3aee0ad01ceaf0e5745ab4f98f0e6d2cfe08d169b411de +size 45796 diff --git a/Real Sonar/Sounds/sonarTailSuitCloseShuttle1.ogg b/Real Sonar/Sounds/sonarTailSuitCloseShuttle1.ogg new file mode 100644 index 0000000..6bcc08c --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64225a96176a1f2925d43f257ec61557d3e9dacaf022ada1344447b6ae29f244 +size 33310 diff --git a/Real Sonar/Sounds/sonarTailSuitCloseShuttle2.ogg b/Real Sonar/Sounds/sonarTailSuitCloseShuttle2.ogg new file mode 100644 index 0000000..20af1a7 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2895c7c30fbcc9d0eebcaf8cabd61cb9317b8bbc71163792cdfb9b8d91460c6 +size 40701 diff --git a/Real Sonar/Sounds/sonarTailSuitCloseShuttle3.ogg b/Real Sonar/Sounds/sonarTailSuitCloseShuttle3.ogg new file mode 100644 index 0000000..f39aebe --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e8e44718cbb939613859ef11a7ca95c9c644870bf412eceeccf02ada2828ff4 +size 36369 diff --git a/Real Sonar/Sounds/sonarTailSuitFar1.ogg b/Real Sonar/Sounds/sonarTailSuitFar1.ogg new file mode 100644 index 0000000..049b03a --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f18ab32ecab603c481d27ce2a53e012146f93f118d37be8a2bd7c6ee5ab106e8 +size 24701 diff --git a/Real Sonar/Sounds/sonarTailSuitFar1_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFar1_Directional.ogg new file mode 100644 index 0000000..ffa1f9e --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fe765ee40d1b2a12a1c90e838912b3bab85cff386eadce40e6b980aecaba492 +size 26872 diff --git a/Real Sonar/Sounds/sonarTailSuitFar2.ogg b/Real Sonar/Sounds/sonarTailSuitFar2.ogg new file mode 100644 index 0000000..47d73f6 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d829793dfda07c077fdb2b771263ce954e371c156a964559faead2d838d9d99e +size 24834 diff --git a/Real Sonar/Sounds/sonarTailSuitFar2_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFar2_Directional.ogg new file mode 100644 index 0000000..d801c28 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57d80e246fc70989cb41fd81ef11211f061a02a3d630c558119cf4185f753e07 +size 26805 diff --git a/Real Sonar/Sounds/sonarTailSuitFar3.ogg b/Real Sonar/Sounds/sonarTailSuitFar3.ogg new file mode 100644 index 0000000..61cf7a4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eacd3144bfa4d4fa58aaf5a5b49ea22910f6cc7172e18c8cb7a07aa9f3e3f06 +size 24875 diff --git a/Real Sonar/Sounds/sonarTailSuitFar3_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFar3_Directional.ogg new file mode 100644 index 0000000..23d5ebe --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFar3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda9be4e1ab139281872560eb4e40d4c07db1b7b6ec31401e8c6606887c99e04 +size 26874 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle1.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle1.ogg new file mode 100644 index 0000000..e425093 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3418a275530fc89d00d3856f80a868a83885117eb2cbcbe3eebc8fbc94cdc905 +size 24026 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle1_Directional.ogg new file mode 100644 index 0000000..a322762 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f16df6440573b78d584a42c68c5e34f0e98be56b4cca31cd4947e3b98342f4c3 +size 46904 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle2.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle2.ogg new file mode 100644 index 0000000..8b5aebd --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fac9b4a829e9af41a8b90492e888d06e917c1cad9410d1fe642fcbf26ae8235d +size 25719 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle2_Directional.ogg new file mode 100644 index 0000000..c1fa7cf --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac6122a1e3b1d619f734ce624f07b5fcf7744a8b250e129e54e8dd18fa9e50cc +size 47344 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle3.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle3.ogg new file mode 100644 index 0000000..ed5a5dc --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22d7cbdfcd804cffd8cb9585fa9a45b00c42bdc2a40129d08055332a2f573c33 +size 26390 diff --git a/Real Sonar/Sounds/sonarTailSuitFarShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitFarShuttle3_Directional.ogg new file mode 100644 index 0000000..d35d3f4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitFarShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1bf1f8ec59a1fc8f442691812fee2d1046895e35a732181bec008a6ffc11963 +size 49856 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium1.ogg b/Real Sonar/Sounds/sonarTailSuitMedium1.ogg new file mode 100644 index 0000000..c71011a --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3134e058508108639ffda1b0191432126d72691f145d3a16d3ed8bea625840f +size 59045 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium1_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMedium1_Directional.ogg new file mode 100644 index 0000000..56906b5 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:777fd7956a0f14ba9c63ed10f04941f4b5d9afbfc00b448b147cf9cb8483c8c0 +size 59188 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium2.ogg b/Real Sonar/Sounds/sonarTailSuitMedium2.ogg new file mode 100644 index 0000000..f0dc6f2 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:812f85c6c53962e3fe5acc553b3a66bcd62a202e898e198bf0b237c8ebcd4f44 +size 58553 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium2_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMedium2_Directional.ogg new file mode 100644 index 0000000..789ba41 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:194250f36129f51038c55de79f03f30577d2d2682098c8c53f3dd886ca4bef6d +size 58787 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium3.ogg b/Real Sonar/Sounds/sonarTailSuitMedium3.ogg new file mode 100644 index 0000000..fd7d9ba --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3dea389df67f0dc7b6947024174db20538fa8e85c9f77278e39b1045891c735 +size 58119 diff --git a/Real Sonar/Sounds/sonarTailSuitMedium3_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMedium3_Directional.ogg new file mode 100644 index 0000000..16ecb5c --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMedium3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cb2eb339c41abf61a041b54474dd1bd8a039f62aa84eff78294076174bea322 +size 58108 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle1.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle1.ogg new file mode 100644 index 0000000..0632523 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:096ce08275cad1fadc1bc93488ab28947c74442a9171e1cef5240a110e1214e7 +size 29099 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..b75d918 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:056e2db49c1e2b9465c77cea426412ede5d6ffee51f21792166d1a99c7b025ae +size 49939 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle2.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle2.ogg new file mode 100644 index 0000000..2e708b4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0da82e4915ce754ff2501e6f8da07cb3b6dca215f21c6a7894c53f854de1ac60 +size 29116 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..8bb0bf9 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a40d6feb5f59cd3c9a718557f6730e6eb9adfc22ae14ac5c970ecf1826affa31 +size 48098 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle3.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle3.ogg new file mode 100644 index 0000000..2a898fb --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6119f35a3096361de300f8b24a1422d8af2f5d5a4a0df966171ab92eab454687 +size 28905 diff --git a/Real Sonar/Sounds/sonarTailSuitMediumShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarTailSuitMediumShuttle3_Directional.ogg new file mode 100644 index 0000000..157da5a --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitMediumShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f5fc3d2e2b99b5bf6102eb28c886e1a93d99e2c2ac8646fe65b3916c02267d +size 46902 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryClose1.ogg b/Real Sonar/Sounds/sonarTailSuitVeryClose1.ogg new file mode 100644 index 0000000..9416b51 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18579e8e7591329686b8eec6871f73769977ad0f2cd0041318723b9904aeb1f5 +size 21689 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryClose2.ogg b/Real Sonar/Sounds/sonarTailSuitVeryClose2.ogg new file mode 100644 index 0000000..cecdcac --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ea9900cea8fc307c0ec2eff00565d1c5e3ffe1781f170ba3ebd3666fc9be758 +size 21427 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryClose3.ogg b/Real Sonar/Sounds/sonarTailSuitVeryClose3.ogg new file mode 100644 index 0000000..9659f6e --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe8849d9be0e45b6192b578151e09791166123a880a82af5c6dc4d4699aac791 +size 21844 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle1.ogg b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle1.ogg new file mode 100644 index 0000000..8475ec4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0553ebfc4ba64d4f62e386cfc23375af2560a176fb9e6c9a9549770ab4e8bab9 +size 47238 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle2.ogg b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle2.ogg new file mode 100644 index 0000000..c371314 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bf505a3a7d924a06d0bcf1153000f9da950639d1e1bd89b222429b11b697fcb +size 32115 diff --git a/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle3.ogg b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle3.ogg new file mode 100644 index 0000000..f064fb4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailSuitVeryCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0072bdfdf469092a6f1ce56990a5414317abb98da2892917bad4220eba04026 +size 35257 diff --git a/Real Sonar/Sounds/sonarTailWaterClose1.ogg b/Real Sonar/Sounds/sonarTailWaterClose1.ogg new file mode 100644 index 0000000..51dc880 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd292e36452a84af0f8e91cc5810583a3938e151728455e2e6bcb536118f818d +size 115205 diff --git a/Real Sonar/Sounds/sonarTailWaterClose2.ogg b/Real Sonar/Sounds/sonarTailWaterClose2.ogg new file mode 100644 index 0000000..04465d5 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b5c9b58498ca72395bf7bcf61ba7b40fc41f3cceaf7b9bbbde5319ad8410095 +size 94005 diff --git a/Real Sonar/Sounds/sonarTailWaterCloseShuttle1.ogg b/Real Sonar/Sounds/sonarTailWaterCloseShuttle1.ogg new file mode 100644 index 0000000..605f68e --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:558cbd7f30925719b3873571859e5e023446a9c22ac90568dddf6204a7baf3df +size 51365 diff --git a/Real Sonar/Sounds/sonarTailWaterCloseShuttle2.ogg b/Real Sonar/Sounds/sonarTailWaterCloseShuttle2.ogg new file mode 100644 index 0000000..1ccfda1 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77be49641ee9c229d81d92a24598214030e1dd15a56eda1be09962a7613241ea +size 51587 diff --git a/Real Sonar/Sounds/sonarTailWaterCloseShuttle3.ogg b/Real Sonar/Sounds/sonarTailWaterCloseShuttle3.ogg new file mode 100644 index 0000000..e48c5b9 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:521baf23638dfb161b4cee0c68ba680783fe3883ec697a0ba7816f0ebdde399a +size 52116 diff --git a/Real Sonar/Sounds/sonarTailWaterFar1.ogg b/Real Sonar/Sounds/sonarTailWaterFar1.ogg new file mode 100644 index 0000000..9e64641 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFar1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39d83d21d3158656f85554eba137e86822f2424939e2f795d44d10c4c0cc8629 +size 52522 diff --git a/Real Sonar/Sounds/sonarTailWaterFar1_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterFar1_Directional.ogg new file mode 100644 index 0000000..cecd45b --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFar1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:351e48f48ec77d0b61a530b00bcc300cdc02c1d147068bc6a4dfc75bf9a43a91 +size 81198 diff --git a/Real Sonar/Sounds/sonarTailWaterFar2.ogg b/Real Sonar/Sounds/sonarTailWaterFar2.ogg new file mode 100644 index 0000000..e56ad02 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFar2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec0b20da5e06ca41c3d1415542f02fc3a3c3591635bca00cc5b63f7b03651b36 +size 52451 diff --git a/Real Sonar/Sounds/sonarTailWaterFar2_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterFar2_Directional.ogg new file mode 100644 index 0000000..a0a24f7 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFar2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f934913d9929455d7ac8225851e0bdc81d8ce2991a6d557c14a868e8e06a4919 +size 78923 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle1.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle1.ogg new file mode 100644 index 0000000..d3fb05f --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b1caf17a3fcfe2d88ee805b3e6b81833f23784336fc4a533f1249f87577c7b7 +size 52256 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle1_Directional.ogg new file mode 100644 index 0000000..e212fe2 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7834fe09b3fd1d097e1adb2fd5738280c516ea5592211151e85c030c213ddd6 +size 81392 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle2.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle2.ogg new file mode 100644 index 0000000..d644972 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c19f4d0228fd35cdaf736e4fedf5fb370ca94d3b1480e054037e2d2bc3a359fb +size 52168 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle2_Directional.ogg new file mode 100644 index 0000000..b1a5043 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6bf77558db62e3684e40bc3efef938cdeee9d741709f661baf6850a0f3b5eb4 +size 81026 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle3.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle3.ogg new file mode 100644 index 0000000..0da1844 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2f6a0bac16ada9180431d71a31eb3ead6661d4647dbbbafa44ec2a310515081 +size 52811 diff --git a/Real Sonar/Sounds/sonarTailWaterFarShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterFarShuttle3_Directional.ogg new file mode 100644 index 0000000..7feb383 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterFarShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c05d1ed290f5d2c721db56aa896cd94fcc21b1bad832bbabca7ff164c32285a1 +size 78061 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium1.ogg b/Real Sonar/Sounds/sonarTailWaterMedium1.ogg new file mode 100644 index 0000000..66738df --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c83b40bf805d028c9d7eed313b6820e124c2a25cf315a08fc5239f65d2578739 +size 46680 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium1_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMedium1_Directional.ogg new file mode 100644 index 0000000..cec6409 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:237eed81db33ca5e7ab58c432a79973ed5c5dea53dd969eb0cd2c38bc86f0b89 +size 87703 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium2.ogg b/Real Sonar/Sounds/sonarTailWaterMedium2.ogg new file mode 100644 index 0000000..322cabe --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:479f782ffd034e8f8304d8e13ac21ca14e9d376ecdb7a2943575e074f71847de +size 46716 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium2_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMedium2_Directional.ogg new file mode 100644 index 0000000..479aa21 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:756a4281813391f6c0f2c0d642ce842a0905743ab24c2da0d7898f5c457a3142 +size 86060 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium3.ogg b/Real Sonar/Sounds/sonarTailWaterMedium3.ogg new file mode 100644 index 0000000..fb0ffdd --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dee5109e5515dedae226291c6a84ede77659f26099cfabac8ea8d074b4daf5c7 +size 46596 diff --git a/Real Sonar/Sounds/sonarTailWaterMedium3_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMedium3_Directional.ogg new file mode 100644 index 0000000..1fc515a --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMedium3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb22d6599ad617b80b290a0065e665bf2949fbfbb18ee6cf25f8e8092f69004e +size 86619 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle1.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle1.ogg new file mode 100644 index 0000000..800ef7f --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0474c3dd375c310ae38b9a2e543b80e961e856552e1b7e376e68154b236d5399 +size 51829 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle1_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle1_Directional.ogg new file mode 100644 index 0000000..2055343 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle1_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12fc77a34b12bfae657ac6faf6826f00f7b132cd5774b773c4670c2845451507 +size 96740 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle2.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle2.ogg new file mode 100644 index 0000000..d4ee151 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:129d8c0e8e36ac0b761774cea3e9a1680652dc299c9267d68971cd55c1e7e696 +size 51832 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle2_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle2_Directional.ogg new file mode 100644 index 0000000..22a8df1 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle2_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56b562f743f5bad3a7b3f3a0bcd10bac5bd2a63b4c2ca3ad24356aeb30a0a06b +size 92933 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle3.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle3.ogg new file mode 100644 index 0000000..ceeb209 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b0d0423596ba571b77c4fda5c6bd8e7bb141621582da30987128623571ed87d +size 52169 diff --git a/Real Sonar/Sounds/sonarTailWaterMediumShuttle3_Directional.ogg b/Real Sonar/Sounds/sonarTailWaterMediumShuttle3_Directional.ogg new file mode 100644 index 0000000..2643e0b --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterMediumShuttle3_Directional.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e4d1c425f0d4ef1cb0be6787512b861b80e3dd7c87d893876dda90e5173baf0 +size 96127 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryClose1.ogg b/Real Sonar/Sounds/sonarTailWaterVeryClose1.ogg new file mode 100644 index 0000000..be13335 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryClose1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb595e95ab087acbab1af11ab7116db59e80c174e50af16692e07e75a8869547 +size 52924 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryClose2.ogg b/Real Sonar/Sounds/sonarTailWaterVeryClose2.ogg new file mode 100644 index 0000000..d9443d1 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryClose2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3857a100c59d1c4c2691f787d91fc9e74f69690c9ad031e41a1f3f14b2c87a87 +size 52502 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryClose3.ogg b/Real Sonar/Sounds/sonarTailWaterVeryClose3.ogg new file mode 100644 index 0000000..0498e5c --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryClose3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:226321791b807d6c502811da4c6512d3e75a2f87797231127ea1e7d852b63eca +size 48741 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle1.ogg b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle1.ogg new file mode 100644 index 0000000..c3acf4d --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:363263b49da7457b07a08fdca978d82060cd1738604be0ef231fa1da8e3d0f47 +size 51062 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle2.ogg b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle2.ogg new file mode 100644 index 0000000..cdbe089 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d95d452c46f8dd19a1699addb87c6bdd5f104b987161b88a77b550a469bee32 +size 52377 diff --git a/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle3.ogg b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle3.ogg new file mode 100644 index 0000000..d978dc4 --- /dev/null +++ b/Real Sonar/Sounds/sonarTailWaterVeryCloseShuttle3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5b5a0c8f303ce92f8a0d0b6e3a4474c1993ec22ef8b2899c2a85cc87f3f510 +size 52302 diff --git a/Real Sonar/Sounds/tinnitus1.ogg b/Real Sonar/Sounds/tinnitus1.ogg new file mode 100644 index 0000000..fd4a378 --- /dev/null +++ b/Real Sonar/Sounds/tinnitus1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7931a0d25a86691b8a75e2fc9ada9508d0d4a430a4eedb5a942b996e8ba80e1b +size 116476 diff --git a/Real Sonar/Sounds/tinnitus2.ogg b/Real Sonar/Sounds/tinnitus2.ogg new file mode 100644 index 0000000..17d71b3 --- /dev/null +++ b/Real Sonar/Sounds/tinnitus2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7241a25047a13930929e4cb8f06bb7e71ff590d15e8ea3f1826505398eb2c971 +size 135066 diff --git a/Real Sonar/Sounds/tinnitus3.ogg b/Real Sonar/Sounds/tinnitus3.ogg new file mode 100644 index 0000000..3da4fa6 --- /dev/null +++ b/Real Sonar/Sounds/tinnitus3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0017f24ecde72ba70711d543fe19dc0e02e2709d7370331b343f0bebc42c3bb4 +size 219436 diff --git a/Real Sonar/Sounds/tinnitus4.ogg b/Real Sonar/Sounds/tinnitus4.ogg new file mode 100644 index 0000000..4ca62d0 --- /dev/null +++ b/Real Sonar/Sounds/tinnitus4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:329bb5a4d2724aa764e2fbb92a219df963656665816f6f1beb39f2f7f45df99f +size 346027 diff --git a/Real Sonar/UI/CommandDevices.png b/Real Sonar/UI/CommandDevices.png new file mode 100644 index 0000000..40a9813 --- /dev/null +++ b/Real Sonar/UI/CommandDevices.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc79f55bd5882c075b5e4ed63e309031b51950e6c6301c9f2c66fd03634ee408 +size 904723 diff --git a/Real Sonar/UI/NavUI.png b/Real Sonar/UI/NavUI.png new file mode 100644 index 0000000..988b561 --- /dev/null +++ b/Real Sonar/UI/NavUI.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96799f490cb1bbc19bbcb5ca193f63bef13b34e1669045162a28c9d4d5d0275c +size 10188 diff --git a/Real Sonar/UI/NavUI2.png b/Real Sonar/UI/NavUI2.png new file mode 100644 index 0000000..0a86bec --- /dev/null +++ b/Real Sonar/UI/NavUI2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d1e8921cbaffdf9851779abf724c76e9d39942346372a39587569b14ab2c3ec +size 8733 diff --git a/Real Sonar/UI/directionalPingBackground.png b/Real Sonar/UI/directionalPingBackground.png new file mode 100644 index 0000000..0f90ae0 --- /dev/null +++ b/Real Sonar/UI/directionalPingBackground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be3235803cf48e442a02c57bbce40d6dcf23cc916dfb4b0c7ce633e81d16cd3e +size 231522 diff --git a/Real Sonar/UI/directionalPingBackground2.png b/Real Sonar/UI/directionalPingBackground2.png new file mode 100644 index 0000000..2474e65 --- /dev/null +++ b/Real Sonar/UI/directionalPingBackground2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd714c3d7bfcc44518cdf192aa70ad01f2730c65bdb2d8e001e69562b9c19cc4 +size 236284 diff --git a/Real Sonar/UI/directionalPingBackground3.png b/Real Sonar/UI/directionalPingBackground3.png new file mode 100644 index 0000000..616f3e2 --- /dev/null +++ b/Real Sonar/UI/directionalPingBackground3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d12f31cda0c6128c026f493cf61573b3b43b5e96f5c5be5ad2cffa3081ec60d2 +size 266186 diff --git a/Real Sonar/UI/directionalPingButton.png b/Real Sonar/UI/directionalPingButton.png new file mode 100644 index 0000000..5a5b4ef --- /dev/null +++ b/Real Sonar/UI/directionalPingButton.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a5310ca5d0cc7414e1b9a3dee18dd36cc00663535ab2318520185dda2f9d97 +size 422522 diff --git a/Real Sonar/UI/directionalPingButton2.png b/Real Sonar/UI/directionalPingButton2.png new file mode 100644 index 0000000..0a55d50 --- /dev/null +++ b/Real Sonar/UI/directionalPingButton2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:159ea8b7f0069d17d28bc3208626e5b704912034a44defb958c35105d30cd98a +size 425696 diff --git a/Real Sonar/UI/directionalPingButton3.png b/Real Sonar/UI/directionalPingButton3.png new file mode 100644 index 0000000..33887d2 --- /dev/null +++ b/Real Sonar/UI/directionalPingButton3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41e407ce283ee3b4580fa60867fb4c34db4a2ef756f20b0fb1263bc0c0b38b1a +size 99723 diff --git a/Real Sonar/UI/directionalPingCircle.png b/Real Sonar/UI/directionalPingCircle.png new file mode 100644 index 0000000..460dff6 --- /dev/null +++ b/Real Sonar/UI/directionalPingCircle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19ffc8291f8562269e15fcb6350657cb326b0469d04a596cd2a6a9322209a6e1 +size 471767 diff --git a/Real Sonar/UI/directionalPingCircle2.png b/Real Sonar/UI/directionalPingCircle2.png new file mode 100644 index 0000000..41ce768 --- /dev/null +++ b/Real Sonar/UI/directionalPingCircle2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be64a01104f0f8659a256e2f7a54e57f8a309eaf18f0b23da75ad95840f9ad24 +size 467322 diff --git a/Real Sonar/UI/directionalPingCircle3.png b/Real Sonar/UI/directionalPingCircle3.png new file mode 100644 index 0000000..78c4f31 --- /dev/null +++ b/Real Sonar/UI/directionalPingCircle3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e678ca81cbef5fdd5d89a2b02d4d44c601b57e25a3d2dc7b26ca7975850c564 +size 460783 diff --git a/Real Sonar/UI/navigatorLights.png b/Real Sonar/UI/navigatorLights.png new file mode 100644 index 0000000..5373cb6 --- /dev/null +++ b/Real Sonar/UI/navigatorLights.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6178cad0bfa56453123cce73a132c529c873849cdcc1f134d05461c0bb7c7516 +size 334916 diff --git a/Real Sonar/UI/pingCircle.png b/Real Sonar/UI/pingCircle.png new file mode 100644 index 0000000..c0b22ff --- /dev/null +++ b/Real Sonar/UI/pingCircle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4be73c28b671e2059c44602a4cce927136359bc8112ba065c5f93d7c90fbd61 +size 2195601 diff --git a/Real Sonar/UI/pingCircle2.png b/Real Sonar/UI/pingCircle2.png new file mode 100644 index 0000000..1f4fd59 --- /dev/null +++ b/Real Sonar/UI/pingCircle2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abeaffcf54e7e22cae0f0d13e052e957a42ebdf36a0fd72b5dbddb350602c1e1 +size 2245095 diff --git a/Real Sonar/UI/pingCircle3.png b/Real Sonar/UI/pingCircle3.png new file mode 100644 index 0000000..c1814f4 --- /dev/null +++ b/Real Sonar/UI/pingCircle3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8c87c501b85d6cf4e531ae77a6099e03838eb1fd19f4d79fef0d2d3fdc5fbc0 +size 2034849 diff --git a/Real Sonar/UI/sonarBackground.png b/Real Sonar/UI/sonarBackground.png new file mode 100644 index 0000000..6c9b8f7 --- /dev/null +++ b/Real Sonar/UI/sonarBackground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c0a88eb79ab007a5b12f5d6d26f8f7e5a342b65ba6c2119f344a8b0461cf3e4 +size 453050 diff --git a/Real Sonar/UI/sonarBackground2.png b/Real Sonar/UI/sonarBackground2.png new file mode 100644 index 0000000..95f10e1 --- /dev/null +++ b/Real Sonar/UI/sonarBackground2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0584fc7ae6f78d0263d189c8e642dc54cc8af7ffe0c397a89a99176b52fd19dc +size 443102 diff --git a/Real Sonar/UI/sonarBackground3.png b/Real Sonar/UI/sonarBackground3.png new file mode 100644 index 0000000..3fb00d7 --- /dev/null +++ b/Real Sonar/UI/sonarBackground3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0af21865b2fb78390149f28a7f34dd73bb4d89f2334851fe3f9509e90cfa0a83 +size 647668 diff --git a/Real Sonar/UI/sonarBlip.png b/Real Sonar/UI/sonarBlip.png new file mode 100644 index 0000000..051a492 --- /dev/null +++ b/Real Sonar/UI/sonarBlip.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13d11d975168461bf8fd5112c489b8b7e92c975753fbc9cf3e33bc3bbb4faecb +size 4186 diff --git a/Real Sonar/UI/sonarBlip2.png b/Real Sonar/UI/sonarBlip2.png new file mode 100644 index 0000000..b77433d --- /dev/null +++ b/Real Sonar/UI/sonarBlip2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04b5d91dee6040c86d524eeb69d8698ff63c11919237f029fbd9f8ec8f1a31a4 +size 4669 diff --git a/Real Sonar/UI/sonarBlip3.png b/Real Sonar/UI/sonarBlip3.png new file mode 100644 index 0000000..e3af286 --- /dev/null +++ b/Real Sonar/UI/sonarBlip3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b08efda45322972d4d1dc71bb35745b43ed5f9163ed91899c79c3e7b1d1624b2 +size 3301 diff --git a/Real Sonar/UI/sonarOverlay.png b/Real Sonar/UI/sonarOverlay.png new file mode 100644 index 0000000..ad86098 --- /dev/null +++ b/Real Sonar/UI/sonarOverlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4a23b09101858585157cf5d1b75472dc2b7f46f63f7631bfe961eb79ce7b210 +size 844400 diff --git a/Real Sonar/UI/sonarOverlay2.png b/Real Sonar/UI/sonarOverlay2.png new file mode 100644 index 0000000..f6d21ae --- /dev/null +++ b/Real Sonar/UI/sonarOverlay2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df86f3c7ef881389a65378a02cebe3ae2186b14c1af2f5a6dc3c952a83e9d74c +size 878602 diff --git a/Real Sonar/UI/sonarOverlay3.png b/Real Sonar/UI/sonarOverlay3.png new file mode 100644 index 0000000..91ea43f --- /dev/null +++ b/Real Sonar/UI/sonarOverlay3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bcabb9ea1befdeb795f7ad676f2bdd092d6afae52aac1ac913882c422c4838b8 +size 887273 diff --git a/Real Sonar/afflictions.xml b/Real Sonar/afflictions.xml new file mode 100644 index 0000000..1588d38 --- /dev/null +++ b/Real Sonar/afflictions.xml @@ -0,0 +1,862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/afflictionslowfx.xml b/Real Sonar/afflictionslowfx.xml new file mode 100644 index 0000000..db00795 --- /dev/null +++ b/Real Sonar/afflictionslowfx.xml @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/afflictionsnofx.xml b/Real Sonar/afflictionsnofx.xml new file mode 100644 index 0000000..83ddcff --- /dev/null +++ b/Real Sonar/afflictionsnofx.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Real Sonar/command.xml b/Real Sonar/command.xml new file mode 100644 index 0000000..0e5a427 --- /dev/null +++ b/Real Sonar/command.xml @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +