diff --git a/.github/workflows/duplicates.yml b/.github/workflows/duplicates.yml
new file mode 100644
index 0000000000..777a91976e
--- /dev/null
+++ b/.github/workflows/duplicates.yml
@@ -0,0 +1,20 @@
+name: Check Patch Duplicates
+on:
+ pull_request:
+ branches: [ master, Development ]
+
+# Restrict the permissions of the ephemeral GitHub token used by this workflow
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - name: Check for duplicate virtual file paths
+ run: |
+ python3 DupeFinder.py -c
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index b04e34fc0f..f314aa9c7f 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -15,12 +15,10 @@ jobs:
rm -rf AssemblyPublicizer
git clone https://github.com/CombatExtended-Continued/AssemblyPublicizer
mkdir -p Assemblies
- mkdir -p AssembliesCore
- mkdir -p AssembliesCompat
mkdir -p ${{ runner.temp }}/downloads
- - name: build loader
+ - name: remove loader
run: |
- TEMP=${{ runner.temp }}/ python Make.py --csproj Source/Loader/Loader.csproj --output Assemblies/0CombatExtendedLoader.dll --download-libs --all-libs
+ rm Assemblies/CombatExtendedLoader.dll
- name: build core
run: |
@@ -33,7 +31,7 @@ jobs:
- name: package
run: |
mkdir CombatExtended
- cp -r Source/ Assemblies/ AssembliesCore/ AssembliesCompat/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
+ cp -r Source/ Assemblies/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
zip -9 -r build.zip CombatExtended
- name: Upload to DO
run: |
diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml
index fc14818afd..5196edc729 100644
--- a/.github/workflows/pullrequest.yml
+++ b/.github/workflows/pullrequest.yml
@@ -25,15 +25,13 @@ jobs:
wget https://raw.githubusercontent.com/CombatExtended-Continued/CombatExtended/Development/Make.py -O Make.py
wget https://raw.githubusercontent.com/CombatExtended-Continued/CombatExtended/Development/BuildCompat.py -O BuildCompat.py
mkdir -p Assemblies
- mkdir -p AssembliesCore
- mkdir -p AssembliesCompat
mkdir -p ${{ runner.temp }}/downloads
rm -rf AssemblyPublicizer
git clone https://github.com/CombatExtended-Continued/AssemblyPublicizer
- - name: build loader
+ - name: remove loader
run: |
- TEMP=${{ runner.temp }}/ python Make.py --csproj Source/Loader/Loader.csproj --output Assemblies/0CombatExtendedLoader.dll --download-libs --all-libs
+ rm Assemblies/CombatExtendedLoader.dll
- name: build core
run: |
@@ -46,7 +44,7 @@ jobs:
- name: package
run: |
mkdir CombatExtended
- cp -r Source/ Assemblies/ AssembliesCompat/ AssembliesCore/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
+ cp -r Source/ Assemblies/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
zip -9 -r build.zip CombatExtended
- name: Upload to DO
run: |
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 756bb2140a..50669e0cd7 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -16,13 +16,11 @@ jobs:
rm -rf AssemblyPublicizer
git clone https://github.com/CombatExtended-Continued/AssemblyPublicizer
mkdir -p Assemblies
- mkdir -p AssembliesCore
- mkdir -p AssembliesCompat
mkdir -p ${{ runner.temp }}/downloads
- - name: build loader
+ - name: remove loader
run: |
- TEMP=${{ runner.temp }}/ python Make.py --csproj Source/Loader/Loader.csproj --output Assemblies/0CombatExtendedLoader.dll --download-libs --all-libs
+ rm Assemblies/CombatExtendedLoader.dll
- name: build core
run: |
TEMP=${{ runner.temp }}/ python Make.py --csproj Source/CombatExtended/CombatExtended.csproj --output Assemblies/CombatExtended.dll --download-libs --all-libs --publicizer $PWD/AssemblyPublicizer
@@ -32,7 +30,7 @@ jobs:
- name: package
run: |
mkdir CombatExtended
- cp -r Assemblies/ AssembliesCore/ AssembliesCompat/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
+ cp -r Assemblies/ About/ Defs/ Languages/ Patches/ Royalty/ Ideology/ Biotech/ Anomaly/ Sounds/ Textures/ ModPatches/ LoadFolders.xml README.md SupportedThirdPartyMods.md CombatExtended
zip -9 -r CombatExtended.zip CombatExtended
- name: Upload Package
id: upload-package
diff --git a/.gitignore b/.gitignore
index ba719fca3b..60969532ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,5 @@ UnityEngine.dll
.idea/
+__pycache__
+ModPatches/*/Assemblies/
diff --git a/Anomaly/Patches/DamageDefs/Damages_Misc.xml b/Anomaly/Patches/DamageDefs/Anomaly_Damages_Misc.xml
similarity index 100%
rename from Anomaly/Patches/DamageDefs/Damages_Misc.xml
rename to Anomaly/Patches/DamageDefs/Anomaly_Damages_Misc.xml
diff --git a/Assemblies/0CombatExtendedLoader.dll b/Assemblies/0CombatExtendedLoader.dll
deleted file mode 100644
index ce2d0521d0..0000000000
Binary files a/Assemblies/0CombatExtendedLoader.dll and /dev/null differ
diff --git a/Assemblies/CombatExtendedLoader.dll b/Assemblies/CombatExtendedLoader.dll
new file mode 100644
index 0000000000..225ee26087
Binary files /dev/null and b/Assemblies/CombatExtendedLoader.dll differ
diff --git a/BuildCompat.py b/BuildCompat.py
index e3470dd2ad..caf130e938 100644
--- a/BuildCompat.py
+++ b/BuildCompat.py
@@ -4,6 +4,7 @@
from subprocess import Popen
import re
import sys
+from xml.dom.minidom import parse as XMLOpen
tm = '-m' in sys.argv
@@ -37,8 +38,20 @@ def system(*cmd):
if tm and name not in sys.argv: continue
csproj = csproj.replace('\\', '/').split('/')
csproj = FilePath("Source").descendant(csproj)
- print(f"Building {name}")
output = FilePath("AssembliesCompat").child(name+".dll")
+ with XMLOpen(csproj.path) as cpath:
+ op = cpath.getElementsByTagName("OutputPath")
+ if op:
+ op = op[0].firstChild.data
+ if 'ModPatches' in op:
+ op = op.rsplit("..\\ModPatches", 1)[-1].replace('\\', '/').split('/')
+ if op:
+ od = FilePath("ModPatches").descendant(op)
+ if not od.exists():
+ od.makedirs()
+ output = od.child(name+".dll")
+
+ print(f"Building {name}")
system("python3", "Make.py", "--csproj", csproj.path, "--output", output.path, DOWNLOAD_LIBS, "--all-libs", "--publicizer", PUBLICIZER, "--", "-r:Assemblies/CombatExtended.dll")
for t in tasks:
diff --git a/DupeFinder.py b/DupeFinder.py
new file mode 100644
index 0000000000..6fa58f875f
--- /dev/null
+++ b/DupeFinder.py
@@ -0,0 +1,50 @@
+from xml.dom.minidom import parse as XMLOpen
+from twisted.python.filepath import FilePath
+import sys
+err = "-c" not in sys.argv
+
+used = {}
+mods = set()
+ContentRoot = FilePath(".")
+ec = 0
+
+def process(node):
+ global ec
+ mod = c.getAttribute("IfModActive")
+ if not mod:
+ mod = "CETeam.CombatExtended"
+ dp = c.firstChild.data.replace(''', "'")
+ if (mod, dp) in mods:
+ ec += 1
+ msg = f"Mod {mod} is listed in LoadFolders.xml twice, both pointing to {c.firstChild.data}"
+ if err:
+ raise RuntimeError(msg)
+ else:
+ print(msg)
+ mods.add((mod, dp))
+ root = FilePath("./" + dp)
+ if not ContentRoot in root.parents():
+ return
+ for fd in root.walk():
+ if fd.isdir():
+ continue
+ if not fd.basename().endswith(".xml"):
+ continue
+ relative = tuple(fd.segmentsFrom(root))
+ if relative in used:
+ msg = f"""Relative paths collision found: {str.join("/", fd.segmentsFrom(ContentRoot))} overrides {str.join("/", used[relative].segmentsFrom(ContentRoot))}"""
+ if err:
+ raise RuntimeError(msg)
+ else:
+ ec += 1
+ print(msg)
+ used[relative] = fd
+
+with XMLOpen("LoadFolders.xml") as x:
+ v1_5 = x.getElementsByTagName("v1.5")
+ for n in v1_5:
+ for c in n.getElementsByTagName("li"):
+ process(c)
+
+
+raise SystemExit(ec)
diff --git a/LoadFolders.xml b/LoadFolders.xml
index e476c0e2d1..87ab9e226c 100644
--- a/LoadFolders.xml
+++ b/LoadFolders.xml
@@ -380,6 +380,7 @@
ModPatches/RBSE
ModPatches/RH2 DOOM
ModPatches/RH2 Faction - Bounty Hunters
+ ModPatches/RH2 Faction - Gruppa Krovi
ModPatches/RH2 Faction - Task Force 141
ModPatches/RH2 Faction - The Rangers
ModPatches/RH2 Faction - Utilitarian
@@ -447,7 +448,6 @@
ModPatches/Rimmu-Nation - Security
ModPatches/Rimmu-Nation - Weapons
ModPatches/Rimsenal - Spacer Faction Pack
- ModPatches/Rimsenal - Spacer Faction Pack
ModPatches/Rimsenal Core
ModPatches/Rimsenal Enhanced Vanilla
ModPatches/Rimsenal Factions
@@ -556,6 +556,7 @@
ModPatches/Vanilla Races Expanded - Highmate
ModPatches/Vanilla Races Expanded - Hussar
ModPatches/Vanilla Races Expanded - Insector
+ ModPatches/Vanilla Races Expanded - Lycanthrope
ModPatches/Vanilla Races Expanded - Phytokin
ModPatches/Vanilla Races Expanded - Sanguophage
ModPatches/Vanilla Races Expanded - Saurid
@@ -609,5 +610,8 @@
ModPatches/pphhyy Expanded Scythers
ModPatches/pphhyy Sanguinary Animals
ModPatches/pphhyy's Lightless Empyrean
+ ModPatches/VehicleFramework
+ ModPatches/Multiplayer
+ ModPatches/SRTS
-
+
\ No newline at end of file
diff --git a/Makefile b/Makefile
index d440b09473..9a4fc416fb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
PUBLICIZER := /tmp/AssemblyPublicizer
-all: Assemblies/0CombatExtendedLoader.dll Assemblies/CombatExtended.dll CompatAssemblies AssembliesCompat $(PUBLICIZER)
+all: Assemblies/CombatExtended.dll CompatAssemblies AssembliesCompat $(PUBLICIZER)
$(PUBLICIZER):
git clone https://github.com/CombatExtended-Continued/AssemblyPublicizer --depth=1 $(PUBLICIZER)
@@ -12,10 +12,10 @@ $(PUBLICIZER):
AssembliesCompat: $(PUBLICIZER)
mkdir -p AssembliesCompat
-Assemblies/0CombatExtendedLoader.dll: Source/Loader/Loader.csproj $(wildcard Source/Loader/Loader/*.cs) $(PUBLICIZER)
- python3 Make.py --csproj Source/Loader/Loader.csproj --output Assemblies/0CombatExtendedLoader.dll --reference /tmp/rwreference --all-libs $(DOWNLOAD_LIBS)
+Assemblies/CombatExtendedLoader.dll: Source/Loader/Loader.csproj $(wildcard Source/Loader/Loader/*.cs) $(PUBLICIZER)
+ python3 Make.py --csproj Source/Loader/Loader.csproj --output Assemblies/CombatExtendedLoader.dll --reference /tmp/rwreference --all-libs $(DOWNLOAD_LIBS)
-Assemblies/CombatExtended.dll: Assemblies/0CombatExtendedLoader.dll Source/CombatExtended/CombatExtended.csproj $(wildcard Source/CombatExtended/*/*.cs) $(wildcard Source/CombatExtended/*/*/*.cs) $(PUBLICIZER)
+Assemblies/CombatExtended.dll: Source/CombatExtended/CombatExtended.csproj $(wildcard Source/CombatExtended/*/*.cs) $(wildcard Source/CombatExtended/*/*/*.cs) $(PUBLICIZER)
python3 Make.py --csproj Source/CombatExtended/CombatExtended.csproj --output Assemblies/CombatExtended.dll --reference /tmp/rwreference --all-libs $(DOWNLOAD_LIBS) --publicizer $(PUBLICIZER)
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Defs/Ammo_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Defs/Ammo_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..acf2a00756
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Defs/Ammo_Gruppa_Krovi.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+ AmmoSet_RNTeslaCharge
+
+
+ Bullet_CE_RNBullet_Tesla_Charge
+
+
+
+
+ Bullet_CE_RNBullet_Tesla_Charge
+
+
+ Things/Projectile/Tesla_Arc
+ Graphic_Single
+ TransparentPostLight
+ 4
+
+
+ Electrical
+ 2.0
+ 25
+ false
+ Artillery_HitThickRoof
+ RN_Tesla_Explode
+ 93
+ 3.2
+ true
+ 0
+ 0
+ 0
+
+
+
+ Smoke
+ (-0.3,0,0.35)
+ (0.3,0,0.35)
+ 90
+ 1~1.1
+ (0,235,31,255)
+ (0,235,31,255)
+
+
+
+
+
+
+
+ AmmoSet_RNPlasmaCharge
+
+
+ Bullet_CE_RNBullet_RedStar_Plasma
+
+
+
+
+ Bullet_CE_RNBullet_RedStar_Plasma
+
+
+ Things/Projectile/RedStar_Plasma
+ Graphic_Single
+ TransparentPostLight
+ 4
+
+
+ RN2_RedStarBomb
+ 1.95
+ 30
+ false
+ Artillery_HitThickRoof
+ RN_RedStar_Explode
+ 76
+ 3
+ 0
+ 0
+ 0
+
+
+
+ Smoke
+ (-0.3,0,0.35)
+ (0.3,0,0.35)
+ 90
+ 1~1.1
+ (0,235,31,255)
+ (0,235,31,255)
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Apparel_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Apparel_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..59df622907
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Apparel_Gruppa_Krovi.xml
@@ -0,0 +1,470 @@
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_EyePros_EdgeTactical" or
+ defName="RNApparel_EyePros_GucciAviatorGlasses"
+ ]/apparel/layers
+
+
+ StrappedHead
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_EyePros_EdgeTactical" or
+ defName="RNApparel_EyePros_GucciAviatorGlasses" or
+ defName="RNApparel_Flatcap"
+ ]/statBases
+
+ 2
+ 0.1
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_EyePros_EdgeTactical"]/statBases/StuffEffectMultiplierArmor
+
+ 1.5
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Flatcap"]/statBases
+
+ 2
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_UaRmsTORD_GreenMoss" or
+ defName="RNApparel_6b27_GreenBare" or
+ defName="RNApparel_K63_HelmetA" or
+ defName="RNApparel_K63_HelmetB" or
+ defName="RNApparel_K63_Helmet_GP7Gasmask" or
+ defName="RNApparel_Helmet_JuggernautMkII"
+ ]/stuffCategories
+
+
+ Steeled
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_UaRmsTORD_GreenMoss" or
+ defName="RNApparel_6b27_GreenBare" or
+ defName="RNApparel_K63_HelmetA" or
+ defName="RNApparel_K63_HelmetB"
+ ]/statBases
+
+ 3.5
+ 1
+ 8
+ 16
+ 0.54
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_K63_Helmet_GP7Gasmask"]/statBases
+
+ 5.0
+ 1.5
+ 8
+ 16
+ 0.54
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_K63_Helmet_GP7Gasmask"]
+
+
+
+
+ 0.20
+
+ Eye
+
+
+
+ 0.20
+
+ Eye
+
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Helmet_JuggernautMkII"]/statBases
+
+ 5.0
+ 1.5
+ 15
+ 30
+ 0.90
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Helmet_JuggernautMkII"]/costList
+
+
+ 20
+ 5
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Helmet_JuggernautMkII"]/equippedStatOffsets/MoveSpeed
+
+
+
+ Defs/ThingDef[defName="RNApparel_Helmet_JuggernautMkII"]
+
+
+
+
+ 0.80
+
+ Eye
+
+
+
+ 0.80
+
+ Eye
+
+
+
+
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_Balaclava_Kula1Hole" or
+ defName="RNApparel_Balaclava_Kula3Hole" or
+ defName="RNApparel_Balaclava_Multicam"
+ ]/costStuffCount
+
+ 20
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_Balaclava_Kula1Hole" or
+ defName="RNApparel_Balaclava_Kula3Hole" or
+ defName="RNApparel_Balaclava_Multicam"
+ ]/statBases/StuffEffectMultiplierArmor
+
+ 1
+ 0.5
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_Balaclava_Kula1Hole" or
+ defName="RNApparel_Balaclava_Kula3Hole" or
+ defName="RNApparel_Balaclava_Multicam"
+ ]/apparel/layers
+
+
+ OnHead
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_Balaclava_Kula1Hole" or
+ defName="RNApparel_Balaclava_Kula3Hole" or
+ defName="RNApparel_Balaclava_Multicam"
+ ]/apparel/bodyPartGroups
+
+
+ UpperHead
+ Teeth
+
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_UBACShirt_GreenMoss" or
+ defName="RNApparel_Jacket_GORKA4Jacket" or
+ defName="RNApparel_Jacket_GORKA4AnorakJacket" or
+ defName="RNApparel_Jacket_GORKAESSOJacket" or
+ defName="RNApparel_Jacket_GORKAKMLKJacket" or
+ defName="RNApparel_Tracksuit_Black"
+ ]/statBases/StuffEffectMultiplierArmor
+
+ 1.5
+ 1
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_UBACShirt_GreenMoss" or
+ defName="RNApparel_Jacket_GORKA4Jacket" or
+ defName="RNApparel_Jacket_GORKA4AnorakJacket" or
+ defName="RNApparel_Jacket_GORKAESSOJacket" or
+ defName="RNApparel_Jacket_GORKAKMLKJacket"
+ ]/statBases/Flammability
+
+ 0.6
+
+
+
+
+
+ Defs/ThingDef[
+ defName="RNApparel_CryeCAGE_Multicam" or
+ defName="RNApparel_Defender2_Green" or
+ defName="RNApparel_Soviet_JuggernautSuitMkII"
+ ]/equippedStatOffsets/MoveSpeed
+
+
+
+ Defs/ThingDef[defName="RNApparel_CryeCAGE_Multicam" or defName="RNApparel_Defender2_Green"]
+
+
+
+
+ 0.60
+
+ Neck
+ Shoulder
+
+
+
+ 0.60
+
+ Neck
+ Shoulder
+
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_CryeCAGE_Multicam"]/statBases
+
+
+ 9000
+ 75
+ 0.6
+ 14
+ 20
+ 0.27
+ 1
+ 4.5
+ 11
+ 6
+ 3
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Defender2_Green"]/statBases
+
+
+ 9000
+ 75
+ 0.6
+ 16
+ 23
+ 0.27
+ 1
+ 5.5
+ 13
+ 6
+ 4
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Soviet_JuggernautSuitMkII"]/statBases/ArmorRating_Sharp
+
+ 18
+ 50
+ 20
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Soviet_JuggernautSuitMkII"]/statBases/ArmorRating_Blunt
+
+ 32
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Soviet_JuggernautSuitMkII"]/equippedStatOffsets
+
+
+ 40
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Soviet_JuggernautSuitMkII"]/costList
+
+
+ 130
+ 10
+ 35
+ 12
+
+
+
+
+
+ Defs/ThingDef[defName="RNApparel_Soviet_JuggernautSuitMkII"]
+
+
+
+
+ 0.80
+
+ Neck
+
+
+
+ 0.80
+
+ Neck
+
+
+
+ 0.90
+
+ Arm
+
+
+
+ 0.90
+
+ Arm
+
+
+
+
+
+
+
+
+
+ Defs/ThingDef[@Name = "RHApparel_GruppaKroviHarnessBase"]/apparel/layers
+
+
+ Webbing
+
+
+
+
+
+ Defs/ThingDef[@Name = "RHApparel_GruppaKroviHarnessBase"]/apparel/bodyPartGroups
+
+
+ Shoulders
+
+
+
+
+
+ Defs/ThingDef[@Name = "RHApparel_GruppaKroviHarnessBase"]/statBases
+
+
+ 10
+ 5
+
+
+
+
+ Defs/ThingDef[@Name = "RHApparel_GruppaKroviHarnessBase"]/equippedStatOffsets
+
+
+ 25
+ 0.1
+ 0.05
+
+
+
+
+
+
+ Defs/ThingDef[@Name="RH2_BackpackBase" or @Name="RH2_BackpackMakeableBase"]/apparel/layers
+
+
+ Backpack
+
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_KulaHydrobag"]/statBases
+
+ 2
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_KulaHydrobag"]/equippedStatOffsets/CarryingCapacity
+
+ 20
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_SydorM230L" or defName = "RNApparel_Backpack_Cascade45L"]/statBases
+
+ 4
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_SydorM230L" or defName = "RNApparel_Backpack_Cascade45L"]/equippedStatOffsets/CarryingCapacity
+
+ 35
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_JuggernautMkII"]/statBases
+
+ 20
+
+
+
+
+ Defs/ThingDef[defName = "RNApparel_Backpack_JuggernautMkII"]/equippedStatOffsets/CarryingCapacity
+
+ 25
+ 60
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Bodies_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Bodies_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..9e5b1baf84
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Bodies_Gruppa_Krovi.xml
@@ -0,0 +1,281 @@
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[customLabel="rear left foot"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[customLabel="rear left foot"]
+
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[customLabel="rear right foot"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[customLabel="rear right foot"]
+
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]/groups
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_KV2_Walker"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalNeck"]/parts/li[def="MechanicalHead"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]/parts/li[def="MechanicalFinger"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]/parts/li[def="MechanicalFinger"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalShoulder"]/parts/li[def="MechanicalArm"]/parts/li[def="MechanicalHand"]/parts/li[def="MechanicalHand"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]/groups
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]/groups
+
+ CoveredByNaturalArmor
+
+
+
+ Defs/BodyDef[defName="RH2_Soviet_Drone"]/corePart/parts/li[def="MechanicalLeg"]/parts/li[def="MechanicalFoot"]
+
+
+ CoveredByNaturalArmor
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Faction_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Faction_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..39ed4b2b4d
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Faction_Gruppa_Krovi.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+ Defs/FactionDef[@Name="RH2_FactionBase_GruppaKrovi"]/maxPawnCostPerTotalPointsCurve
+
+
+
+ (0,35)
+ (70, 50)
+ (700, 100)
+ (1300, 150)
+ (2000, 450)
+ (4200, 1400)
+ (100000, 10000)
+
+
+
+
+
+
+ Defs/FactionDef[@Name="RH2_FactionBase_GruppaKrovi"]/apparelStuffFilter/thingDefs/li[text()="Hyperweave"]
+
+
+
+
+
+ Defs/FactionDef[@Name="RH2_FactionBase_GruppaKrovi"]/pawnGroupMakers
+
+
+
+
+ Combat
+ 100
+
+ 300
+ 30
+ 210
+ 150
+ 1
+ 9
+ 7
+ 150
+ 30
+
+
+
+
+ Combat
+ 20
+
+ 300
+ 90
+ 150
+ 20
+ 2
+ 8
+ 6
+
+
+
+
+ Combat
+ 15
+
+ Siege
+
+
+ 300
+ 60
+ 60
+ 30
+ 1
+ 8
+ 6
+
+
+
+
+ Peaceful
+
+ 300
+ 300
+ 90
+ 60
+ 90
+ 8
+ 6
+ 1
+
+
+
+
+ Trader
+
+ 1
+
+
+ 5
+ 10
+ 5
+ 1
+
+
+ 300
+ 60
+ 8
+ 6
+ 1
+
+
+
+
+ Settlement
+
+ 300
+ 570
+ 240
+ 150
+ 90
+ 90
+ 150
+ 8
+ 6
+ 2
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mech_Weapons_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mech_Weapons_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..0c73a72e5d
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mech_Weapons_Gruppa_Krovi.xml
@@ -0,0 +1,235 @@
+
+
+
+
+ Defs/ThingDef[
+ defName="RNGun_KV2_Howitzer" or
+ defName="RNGun_Tesla_Coil" or
+ defName="RNGun_RedStar_PlasmaCannon"
+ ]/weaponTags
+
+ NoSwitch
+
+
+
+
+
+ RN2Gun_KV2_DSHKMachineGun
+
+ 1
+ 0.2
+ 1.36
+ 20.00
+
+
+ 1.27
+ CombatExtended.Verb_ShootCE
+ true
+ Bullet_127x108mm_FMJ
+ 55
+
+ 10
+ RNShot_DSHK
+ GunTail_Heavy
+ 9
+ 2.5
+ HeadAttackTool
+ true
+ 12
+
+
+
+
+
+
+
+
+
+ RNGun_KV2_Howitzer
+
+
+ 50.00
+ 20.00
+ 0.75
+ 0.10
+ 0.5
+ 2.55
+
+
+ 3.24
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_120mmCannonShell_HE
+ 4.3
+ 125
+ RN_152mmHowitzer_Shot
+ GunTail_Heavy
+ 6
+ false
+ false
+
+ true
+
+ 16
+
+
+ 1
+ 8.4
+ AmmoSet_120mmCannonShell
+
+
+
+
+ Defs/ThingDef[defName="RNGun_KV2_Howitzer"]/tools
+
+
+
+
+
+ Blunt
+
+ 45
+ 2.6
+ 10.5
+ Barrel
+
+
+
+
+
+
+
+ RNGun_Tesla_Coil
+
+ 50.00
+ 20.00
+ 1.59
+ 0.15
+ 1.0
+ 0.35
+
+
+ 0.0
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_CE_RNBullet_Tesla_Charge
+ 2.5
+ 62
+ RN_Tesla_Shot
+ GunTail_Heavy
+ 6
+ false
+ false
+
+ false
+
+ 16
+
+
+ 1
+ 4.15
+ AmmoSet_RNTeslaCharge
+
+
+
+
+ Defs/ThingDef[defName="RNBullet_Tesla_Charge"]
+
+
+
+
+ RNGun_RedStar_PlasmaCannon
+
+ 50.00
+ 20.00
+ 1.59
+ 0.15
+ 1.0
+ 0.45
+
+
+ 1.36
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_CE_RNBullet_RedStar_Plasma
+ 3.15
+ 66
+ 27
+ RN_RedStar_Shot
+ GunTail_Heavy
+ 6
+ false
+ 2
+ false
+
+ false
+
+ 16
+
+
+ 2
+ 5.1
+ AmmoSet_RNPlasmaCharge
+
+
+ AimedShot
+ FALSE
+
+
+
+
+ Defs/ThingDef[defName="RNBullet_RedStar_Plasma"]
+
+
+
+
+ Defs/ThingDef[
+ defName="RNGun_Tesla_Coil" or
+ defName="RNGun_RedStar_PlasmaCannon"]/tools
+
+
+
+
+
+
+ Blunt
+
+ 25
+ 2.0
+ 7
+ Barrel
+
+
+
+
+
+
+ Defs/DamageDef[defName="RN2_RedStarBomb"]/armorCategory
+
+ Blunt
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mechs_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mechs_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..d24afae67d
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Mechs_Gruppa_Krovi.xml
@@ -0,0 +1,342 @@
+
+
+
+
+ Defs/ThingDef[
+ defName="RH2Mech_KV2Walker" or
+ defName="RH2Mech_TeslaDrone" or
+ defName="RH2Mech_PlasmaDrone"
+ ]
+
+
+ Humanoid
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/statBases
+
+ 125
+ 125
+ 1.0
+ 1.0
+ 0.25
+ 500
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/statBases/ArmorRating_Blunt
+
+ 75
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/statBases/ArmorRating_Sharp
+
+ 30
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/comps
+
+
+ 2500
+ false
+ 0.5
+ true
+
+ 5
+
+ 200
+ 250
+ 15
+ 37
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/butcherProducts
+
+ 100
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]
+
+
+
+
+ 0.25
+
+ SightSensor
+
+
+
+ 0.25
+
+ SightSensor
+
+
+
+ 0.25
+
+ HearingSensor
+
+
+
+ 0.25
+
+ HearingSensor
+
+
+
+ 0.6
+
+ MechanicalLeg
+
+
+
+ 0.5
+
+ MechanicalLeg
+
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/comps/li[@Class="CompProperties_TurretGun" and turretDef="RNGun_KV2_KrohaLauncher"]
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/tools
+
+
+
+
+
+ Blunt
+
+ 85
+ 3
+ FrontLeftLeg
+ true
+
+
+
+
+ Blunt
+
+ 85
+ 3
+ FrontRightLeg
+ true
+
+
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_KV2Walker"]
+
+
+
+ 10
+ 20
+
+ GrenadeHE
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_KV2Walker"]/race/baseHealthScale
+
+ 8
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_KV2Walker"]/combatPower
+
+ 1400
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/statBases
+
+ 80
+ 20
+ 1.0
+ 1.0
+ 0.25
+ 300
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/statBases/ArmorRating_Blunt
+
+ 50
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/statBases/ArmorRating_Sharp
+
+ 20
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/comps
+
+
+ 1500
+ false
+ 0.5
+ true
+
+ 3
+
+ 140
+ 150
+ 10
+ 25
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/race/baseHealthScale
+
+ 4
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]
+
+
+
+
+ 0.1
+
+ SightSensor
+
+
+
+ 0.1
+
+ SightSensor
+
+
+
+ 0.1
+
+ HearingSensor
+
+
+
+ 0.1
+
+ HearingSensor
+
+
+
+ 1.5
+
+ MechanicalShoulder
+
+
+
+ 1.5
+
+ MechanicalShoulder
+
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RH2Mech_TeslaDrone" or defName="RH2Mech_PlasmaDrone"]/tools
+
+
+
+
+
+ Blunt
+
+ 22
+ 2
+ LeftHand
+ true
+
+
+
+
+ Blunt
+
+ 25
+ 2
+ RightHand
+ true
+ true
+
+
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_TeslaDrone"]
+
+
+
+ 20
+ 30
+
+
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_TeslaDrone"]/combatPower
+
+ 400
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_PlasmaDrone"]
+
+
+
+ 20
+ 25
+
+
+
+
+
+
+ Defs/PawnKindDef[defName="RH2Mech_PlasmaDrone"]/combatPower
+
+ 450
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/PawnKinds_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/PawnKinds_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..e252fed382
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/PawnKinds_Gruppa_Krovi.xml
@@ -0,0 +1,98 @@
+
+
+
+
+ Defs/PawnKindDef[@Name="RH2_GruppaKrovi_Base"]
+
+
+
+ 4
+ 6
+
+
+
+
+
+
+ Defs/PawnKindDef[@Name="RH2_GruppaKrovi_IntermediateBase"]
+
+
+
+ 4
+ 6
+
+
+
+ 0.15
+
+ 10
+ 100
+
+
+ GrenadeSmoke
+
+
+ 0
+ 1
+
+
+
+ 0.075
+
+ 50
+ 200
+
+
+ CE_FlareLauncher
+
+
+ 2
+ 4
+
+
+
+
+
+
+
+
+ Defs/PawnKindDef[@Name="RH2_GruppaKrovi_SpecialBase"]
+
+
+
+ 4
+ 6
+
+
+
+ 0.125
+
+ 10
+ 100
+
+
+ GrenadeDestructive
+
+
+ 2
+ 3
+
+
+
+
+
+
+
+
+ Defs/PawnKindDef[@Name="RH2_GruppaKrovi_BossBase"]
+
+
+
+ 4
+ 6
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/TraderKinds_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/TraderKinds_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..afe58741b8
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/TraderKinds_Gruppa_Krovi.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ Defs/ThingDef[defName="RH2_Dima_Cigarette"]/statBases
+
+ 0.05
+
+
+
+
+ Defs/TraderKindDef[
+ defName="RHBase_GruppaKrovi_Standard" or
+ defName="RHCaravan_GruppaKrovi_BlackMarket"
+ ]/stockGenerators
+
+
+ CE_Ammo
+
+ 1000
+ 3000
+
+ Cheap
+
+ 5
+ 12
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Weapons_Gruppa_Krovi.xml b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Weapons_Gruppa_Krovi.xml
new file mode 100644
index 0000000000..690b24dc2d
--- /dev/null
+++ b/ModPatches/RH2 Faction - Gruppa Krovi/Patches/Weapons_Gruppa_Krovi.xml
@@ -0,0 +1,569 @@
+
+
+
+
+
+
+ Defs/ThingDef[
+ defName = "RNGun_PKP_GPMG" or
+ defName = "RNGun_GSHG762_RotaryCannon" or
+ defName = "RNGun_AK12_Rifle" or
+ defName = "RNGun_AK105_Rifle" or
+ defName = "RNGun_AK74Contractor_Rifle" or
+ defName = "RNGun_ASVALContractor_Rifle" or
+ defName = "RNGun_DragunovSVDS_DMR" or
+ defName = "RNGun_KSVK_AMR"
+ ]/tools
+
+
+
+
+
+
+ Blunt
+
+ 8
+ 1.55
+ 1.5
+ 2.755
+ Stock
+
+
+
+
+ Blunt
+
+ 5
+ 2.02
+ 1.630
+ Barrel
+
+
+
+
+ Poke
+
+ 8
+ 1.55
+ 2.755
+ Muzzle
+
+
+
+
+
+
+
+
+ Defs/ThingDef[defName="RNGun_RPG7V2_RocketLauncher"]/tools
+
+
+
+
+
+ Blunt
+
+ 10
+ 2.44
+ 3.5
+ Barrel
+
+
+
+
+
+
+ RNGun_RPG7V2_RocketLauncher
+
+ 25500
+ 10.50
+ 1.68
+ 0.2
+ 2.16
+ 1.5
+
+
+ 70
+ 4
+
+
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_RPG7Grenade_HEAT
+ 2.035
+ 5
+ 40
+ RNShotLauncher
+ GunTail_Heavy
+ 14
+
+ true
+
+ true
+
+
+ 1
+ 5.6
+ AmmoSet_RPG7Grenade
+
+
+ AimedShot
+ FALSE
+
+
+ GunHeavy
+ CE_AI_AOE
+ RN_RPG7v2
+
+
+
+
+
+ RNGun_PKP_GPMG
+
+ 32000
+ 8.70
+ 14.00
+ 1.45
+ 0.04
+ 1.1
+ 0.56
+
+
+ 90
+ 6
+
+
+ 1.39
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_762x54mmR_FMJ
+ 10
+ 6
+ 1.3
+ 112
+ RNShotDP28LMG
+ GunTail_Medium
+ 9
+
+
+ 100
+ 4.9
+ AmmoSet_762x54mmR
+
+
+ SuppressFire
+ False
+ 5
+
+
+ IndustrialGunAdvanced
+ CE_MachineGun
+ Bipod_SAW
+ RN_GruppaKrovi_MG
+ RNGun_PKP
+
+
+ PrecisionRifling
+
+
+
+
+ RNGun_GSHG762_RotaryCannon
+
+ 40000
+ 19.00
+ 10.00
+ 2.70
+ 0.05
+ 1
+ 0.35
+
+
+ 115
+ 6
+
+
+ 0.92
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_762x54mmR_FMJ
+ 50
+ 1
+ 2.1
+ 86
+ RNShotGShG
+ GunTail_Medium
+ 9
+
+
+ 200
+ 7.8
+ AmmoSet_762x54mmR
+
+
+ SuppressFire
+ False
+ 25
+
+
+ CE_MachineGun
+ RNGun_GShG_GattlingGun
+
+ MicroelectronicsBasics
+
+
+
+ Defs/ThingDef[defName="RNGun_GSHG762_RotaryCannon"]/equippedStatOffsets/MoveSpeed
+
+
+
+
+ RNGun_AK12_Rifle
+
+ 33500
+ 3.5
+ 6.88
+ 1.27
+ 0.09
+ 1.1
+ 0.36
+
+
+ 40
+ 6
+ 10
+
+
+ 1.35
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_545x39mmSoviet_FMJ
+ 6
+ 5
+ 1.0
+ 51
+ RNShot_AK12AR
+ GunTail_Medium
+ 9
+
+
+ 30
+ 4
+ AmmoSet_545x39mmSoviet
+
+
+ AimedShot
+ True
+ 3
+
+
+ RN_GruppaKrovi_BasicRifles
+ RN_AK12
+
+ PrecisionRifling
+
+
+
+
+ RNGun_AK105_Rifle
+
+ 32000
+ 3.2
+ 5.86
+ 1.14
+ 0.11
+ 1.1
+ 0.36
+
+
+ 40
+ 6
+ 5
+
+
+ 1.37
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_545x39mmSoviet_FMJ
+ 6
+ 6
+ 0.8
+ 40
+ RNShot_AN94
+ GunTail_Medium
+ 9
+
+
+ 30
+ 4
+ AmmoSet_545x39mmSoviet
+
+
+ AimedShot
+ True
+ 3
+
+
+ RN_GruppaKrovi_AdvancedRifles
+ RN_AK105_Contractor
+
+ PrecisionRifling
+
+
+
+
+ RNGun_AK74Contractor_Rifle
+
+ 32000
+ 3.07
+ 6.90
+ 1.25
+ 0.09
+ 2.0
+ 0.36
+
+
+ 50
+ 6
+ 5
+
+
+ 1.44
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_545x39mmSoviet_FMJ
+ 6
+ 6
+ 1.1
+ 55
+ RNShotAK74USMG
+ GunTail_Medium
+ 9
+
+
+ 30
+ 4
+ AmmoSet_545x39mmSoviet
+
+
+ AimedShot
+ True
+ 3
+
+
+ RN_GruppaKrovi_IntermediateRifles
+ RN_AK74_Contractor
+
+ PrecisionRifling
+
+
+
+
+ RNGun_ASVALContractor_Rifle
+
+ 32000
+ 2.50
+ 6.15
+ 1.13
+ 0.14
+ 1.1
+ 0.36
+
+
+ 40
+ 6
+ 5
+
+
+ 1.57
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_9x39mmSoviet_FMJ
+ 6
+ 5
+ 1.0
+ 40
+ RNShotASVAL
+ GunTail_Heavy
+ 9
+
+
+ 30
+ 4
+ AmmoSet_9x39mmSoviet
+
+
+ AimedShot
+ True
+ 3
+
+
+ RN_GruppaKrovi_IntermediateRifles
+ RN_ASVAL_Contractor
+
+ PrecisionRifling
+
+
+
+
+ RNGun_DragunovSVDS_DMR
+
+ 32000
+ 4.68
+ 8.75
+ 1.60
+ 0.05
+ 2.0
+ 0.37
+
+
+ 40
+ 6
+ 5
+
+
+ 1.84
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_762x54mmR_FMJ
+ 1
+ 5
+ 1.1
+ 75
+ RNShotDragunov
+ GunTail_Heavy
+ 9
+
+
+ 10
+ 4
+ AmmoSet_762x54mmR
+
+
+ AimedShot
+ False
+
+
+ RN_GruppaKrovi_Marksman
+ RN_SVDS
+
+ PrecisionRifling
+
+
+
+
+ RNGun_KSVK_AMR
+
+ 28000
+ 12.00
+ 15.20
+ 1.13
+ 0.01
+ 2.0
+ 0.61
+
+
+ 95
+ 4
+ 10
+
+
+ 3.46
+ CombatExtended.Verb_ShootCE
+ True
+ Bullet_127x108mm_FMJ
+ 1
+ 5
+ 2.8
+ 112
+ RNTac50Shot
+ GunTail_Heavy
+ 9
+
+
+ 5
+ 4
+ AmmoSet_127x108mm
+
+
+ AimedShot
+ False
+
+
+ RN_GruppaKrovi_Marksman
+ RN_KSVK
+ Bipod_AMR
+
+ PrecisionRifling
+
+
+
+
+
+
+ Defs/ThingDef[defName="RH2_DragonVodka"]/statBases
+
+ 1.5
+ 0.33
+
+
+
+
+ Defs/ThingDef[defName="RH2_DragonVodka"]/tools
+
+
+
+
+ Blunt
+
+ 2
+ 2.22
+ 1.33
+ 0.338
+ Base
+
+
+
+
+ Poke
+
+ 1
+ 3.33
+ 0.150
+ Neck
+
+
+
+
+
+
+ Defs/ThingDef[defName="RH2_DragonVodka"]
+
+
+ 0.1
+ 0.33
+ 0.07
+
+
+
+
+
+ Defs/ThingDef[defName="RH_RedWine"]/weaponTags
+
+ Defs/ThingDef[defName="RH2_DragonVodka"]/weaponTags
+
+ CE_OneHandedWeapon
+
+
+
+ Defs/ThingDef[defName="RH2_DragonVodka"]
+
+
+ CE_OneHandedWeapon
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/GeneDefs_Health.xml b/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/GeneDefs_Health.xml
new file mode 100644
index 0000000000..55dcd7fbee
--- /dev/null
+++ b/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/GeneDefs_Health.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ Defs/GeneDef[defName="VRE_SuperiorDarkVision"]
+
+
+ 0.9
+
+
+
+
+
\ No newline at end of file
diff --git a/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/Hediffs_Health.xml b/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/Hediffs_Health.xml
new file mode 100644
index 0000000000..90e2e98b1f
--- /dev/null
+++ b/ModPatches/Vanilla Races Expanded - Lycanthrope/Patches/Vanilla Races Expanded - Lycanthrope/Hediffs_Health.xml
@@ -0,0 +1,74 @@
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[1]/statOffsets
+
+ -0.10
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[2]/statOffsets
+
+ -0.20
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[3]/statOffsets
+
+ -0.30
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[4]/statOffsets
+
+ -0.40
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[5]/statOffsets
+
+ -0.50
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[6]/statOffsets
+
+ -0.60
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[7]/statOffsets
+
+ -0.70
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[8]/statOffsets
+
+ -0.80
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[9]/statOffsets
+
+ -0.90
+
+
+
+
+ Defs/HediffDef[defName="VRE_WarHowlHediff"]/stages/li[10]/statOffsets
+
+ -1
+
+
+
+
\ No newline at end of file
diff --git a/Patches/Core/ThingDefs_Misc/Weapons_Grenades.xml b/Patches/Core/ThingDefs_Misc/Weapons_Grenades.xml
index a36fb35d53..140fcbc614 100644
--- a/Patches/Core/ThingDefs_Misc/Weapons_Grenades.xml
+++ b/Patches/Core/ThingDefs_Misc/Weapons_Grenades.xml
@@ -148,12 +148,19 @@
+
+ Defs/ThingDef[defName="Weapon_GrenadeFrag"]/smeltable
+
+ false
+
+
+
Defs/ThingDef[defName="Weapon_GrenadeFrag"]
CombatExtended.AmmoThing
75
- First
+ First
@@ -405,7 +412,7 @@
CombatExtended.AmmoThing
75
- First
+ First
diff --git a/Source/BetterTurretsCompat/BetterTurretsCompat.csproj b/Source/BetterTurretsCompat/BetterTurretsCompat.csproj
index b37cab8275..21bb270f34 100644
--- a/Source/BetterTurretsCompat/BetterTurretsCompat.csproj
+++ b/Source/BetterTurretsCompat/BetterTurretsCompat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\BetterTurrets\Assemblies\
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\BetterTurrets\Assemblies\
true
none
false
@@ -34,12 +34,6 @@
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
False
diff --git a/Source/CombatExtended/CombatExtended.csproj b/Source/CombatExtended/CombatExtended.csproj
index 06d24c20c2..a64042ec2f 100644
--- a/Source/CombatExtended/CombatExtended.csproj
+++ b/Source/CombatExtended/CombatExtended.csproj
@@ -69,12 +69,6 @@
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
..\packages\Rimatomics-reference.dll
diff --git a/Source/CombatExtended/CombatExtended/Controller.cs b/Source/CombatExtended/CombatExtended/Controller.cs
index 797207f934..ab2295ccef 100644
--- a/Source/CombatExtended/CombatExtended/Controller.cs
+++ b/Source/CombatExtended/CombatExtended/Controller.cs
@@ -5,43 +5,95 @@
using RimWorld;
using Verse;
using UnityEngine;
+using System.Reflection;
+using System.IO;
using CombatExtended.HarmonyCE;
using CombatExtended.Compatibility;
using CombatExtended.Loader;
namespace CombatExtended
{
- public class Controller : IModPart
+ /*
+ This class handles initializing the different components of CombatExtended. The LoadFolders
+ system is responsible for loading the assemblies, this gives an opportunity to run any
+ post-load sanity checking, and is responsible for rendering any sub-mod settings as required.
+ */
+ public class Controller : Mod
{
+ public static List settingList = new List();
public static Settings settings;
- public static Controller instant;
+ public static Controller instance;
public static ModContentPack content;
private static Patches patches;
+ private Vector2 scrollPosition;
- public Type GetSettingsType()
+ public override void DoSettingsWindowContents(Rect inRect)
{
- return typeof(Settings);
+ Rect inner = inRect.ContractedBy(20f);
+ inner.height = 800f;
+ inner.x += 10f;
+ Widgets.BeginScrollView(inRect, ref this.scrollPosition, inner, true);
+ Listing_Standard list = new Listing_Standard();
+ list.ColumnWidth = (inner.width - 17) / 2; // Subtract 17 for gap between columns
+ list.Begin(inner);
+
+ foreach (ISettingsCE settings in settingList)
+ {
+ settings.DoWindowContents(list);
+ }
+ list.End();
+ Widgets.EndScrollView();
}
- public Controller()
+ public Controller(ModContentPack content) : base(content)
{
patches = new Patches();
+ Controller.instance = this;
+ Controller.content = content;
+ Controller.settings = GetSettings();
+ settingList.Add(Controller.settings);
+ PostLoad();
}
- public IEnumerable GetCompatList()
- {
- return patches.GetCompatList();
- }
-
- public void PostLoad(ModContentPack content, ISettingsCE settings)
+ public void PostLoad()
{
- Controller.instant = this;
- Controller.content = content;
- Controller.settings = (Settings)settings;
-
// Apply Harmony patches
HarmonyBase.InitPatches();
+ Queue toProcess = new Queue(content.assemblies.loadedAssemblies);
+ List modParts = new List();
+ while (toProcess.Any())
+ {
+ Assembly assembly = toProcess.Dequeue();
+
+ foreach (Type t in assembly.GetTypes().Where(x => typeof(IModPart).IsAssignableFrom(x) && !x.IsAbstract))
+ {
+ IModPart imp = ((IModPart)t.GetConstructor(new Type[] { }).Invoke(new object[] { }));
+ modParts.Add(imp);
+ }
+ }
+ foreach (IModPart modPart in modParts)
+ {
+ Log.Message("CE: Loading Mod Part");
+ Type settingsType = modPart.GetSettingsType();
+ ISettingsCE settings = null;
+ if (settingsType != null)
+ {
+ if (typeof(ModSettings).IsAssignableFrom(settingsType))
+ {
+ settings = (ISettingsCE)typeof(Controller).GetMethod(nameof(Controller.GetSettings)).MakeGenericMethod(settingsType).Invoke(instance, null);
+ }
+ else
+ {
+ settings = (ISettingsCE)settingsType.GetConstructor(new Type[] { }).Invoke(new object[] { });
+ }
+ settingList.Add(settings);
+ }
+
+ modPart.PostLoad(content, settings);
+
+ }
+
// Initialize loadout generator
LongEventHandler.QueueLongEvent(LoadoutPropertiesExtension.Reset, "CE_LongEvent_LoadoutProperties", false, null);
@@ -66,6 +118,11 @@ public void PostLoad(ModContentPack content, ISettingsCE settings)
}
+ public override string SettingsCategory()
+ {
+ return "Combat Extended";
+ }
+
private static void DoTutorialPopup()
{
var enableAction = new Action(() =>
diff --git a/Source/CombatExtended/Compatibility/BetterTurrets.cs b/Source/CombatExtended/Compatibility/BetterTurrets.cs
index f21073d1e0..dc4fee1210 100644
--- a/Source/CombatExtended/Compatibility/BetterTurrets.cs
+++ b/Source/CombatExtended/Compatibility/BetterTurrets.cs
@@ -21,12 +21,5 @@ public void Install()
{
Log.Message("Combat Extended :: Installing Better Turrets");
}
- public IEnumerable GetCompatList()
- {
- yield return "BetterTurretsCompat";
- }
-
-
-
}
}
diff --git a/Source/CombatExtended/Compatibility/EDShields.cs b/Source/CombatExtended/Compatibility/EDShields.cs
index c317515e2d..7eba51dc33 100644
--- a/Source/CombatExtended/Compatibility/EDShields.cs
+++ b/Source/CombatExtended/Compatibility/EDShields.cs
@@ -40,11 +40,6 @@ public void Install()
HitSoundDef = (SoundDef)t.GetField("HitSoundDef", BindingFlags.Static | BindingFlags.Public).GetValue(null);
}
-
- public IEnumerable GetCompatList()
- {
- yield break;
- }
public static bool CheckForCollisionBetweenCallback(ProjectileCE projectile, Vector3 from, Vector3 to)
{
/* Check if an active shield can block this projectile
diff --git a/Source/CombatExtended/Compatibility/IPatch.cs b/Source/CombatExtended/Compatibility/IPatch.cs
index 9fc08acc3a..f2d06220ce 100644
--- a/Source/CombatExtended/Compatibility/IPatch.cs
+++ b/Source/CombatExtended/Compatibility/IPatch.cs
@@ -5,6 +5,5 @@ public interface IPatch
{
public bool CanInstall();
public void Install();
- public IEnumerable GetCompatList();
}
}
diff --git a/Source/CombatExtended/Compatibility/MiscTurrets.cs b/Source/CombatExtended/Compatibility/MiscTurrets.cs
index cfa9743afd..a2f1afb484 100644
--- a/Source/CombatExtended/Compatibility/MiscTurrets.cs
+++ b/Source/CombatExtended/Compatibility/MiscTurrets.cs
@@ -21,13 +21,5 @@ public void Install()
{
Log.Message("Combat Extended :: Installing Misc Turrets");
}
-
- public IEnumerable GetCompatList()
- {
- yield return "MiscTurretsCompat";
- }
-
-
-
}
}
diff --git a/Source/CombatExtended/Compatibility/Multiplayer.cs b/Source/CombatExtended/Compatibility/Multiplayer.cs
index c4d4c05e7f..ad8ae5ce9b 100644
--- a/Source/CombatExtended/Compatibility/Multiplayer.cs
+++ b/Source/CombatExtended/Compatibility/Multiplayer.cs
@@ -23,11 +23,6 @@ public void Install()
isMultiplayerActive = true;
}
- public IEnumerable GetCompatList()
- {
- yield return "MultiplayerCompat";
- }
-
public static bool InMultiplayer
{
get
diff --git a/Source/CombatExtended/Compatibility/Patches.cs b/Source/CombatExtended/Compatibility/Patches.cs
index db520ac3a6..58cf23acbb 100644
--- a/Source/CombatExtended/Compatibility/Patches.cs
+++ b/Source/CombatExtended/Compatibility/Patches.cs
@@ -82,20 +82,6 @@ public static IEnumerable GetUsedAmmo()
}
}
- public IEnumerable GetCompatList()
- {
- foreach (IPatch patch in patches)
- {
- if (patch.CanInstall())
- {
- foreach (string s in patch.GetCompatList())
- {
- yield return s;
- }
- }
- }
- }
-
private static bool _gcbfactive = false;
public static void RegisterCollisionBodyFactorCallback(Func> f)
diff --git a/Source/CombatExtended/Compatibility/ProjectRimFactory.cs b/Source/CombatExtended/Compatibility/ProjectRimFactory.cs
index 110922d2e0..42e4d5c064 100644
--- a/Source/CombatExtended/Compatibility/ProjectRimFactory.cs
+++ b/Source/CombatExtended/Compatibility/ProjectRimFactory.cs
@@ -16,11 +16,6 @@ public void Install()
{
Building_FuelingMachine.RegisterRefuelable(typeof(Building_TurretGunCE), FindCompAmmoUser, TestAmmo, ReloadAction);
}
- public IEnumerable GetCompatList()
- {
- yield break;
- }
-
private static int TestAmmo(object compObject, Thing ammo)
{
var comp = compObject as CompAmmoUser;
diff --git a/Source/CombatExtended/Compatibility/Rimatomics.cs b/Source/CombatExtended/Compatibility/Rimatomics.cs
index d894714815..41b688629e 100644
--- a/Source/CombatExtended/Compatibility/Rimatomics.cs
+++ b/Source/CombatExtended/Compatibility/Rimatomics.cs
@@ -35,11 +35,6 @@ public void Install()
BlockerRegistry.RegisterShieldZonesCallback(Rimatomics.ShieldZonesCallback);
}
- public IEnumerable GetCompatList()
- {
- yield break;
- }
-
public static bool CheckForCollisionBetweenCallback(ProjectileCE projectile, Vector3 from, Vector3 to)
{
Map map = projectile.Map;
diff --git a/Source/CombatExtended/Compatibility/SOS2.cs b/Source/CombatExtended/Compatibility/SOS2.cs
index f61ebd4c6b..82a334d212 100644
--- a/Source/CombatExtended/Compatibility/SOS2.cs
+++ b/Source/CombatExtended/Compatibility/SOS2.cs
@@ -20,10 +20,5 @@ public void Install()
{
Log.Message("Combat Extended :: Installing SOS2");
}
-
- public IEnumerable GetCompatList()
- {
- yield return "SOS2Compat";
- }
}
}
diff --git a/Source/CombatExtended/Compatibility/SRTS.cs b/Source/CombatExtended/Compatibility/SRTS.cs
index 065e2239bd..ae593dff6a 100644
--- a/Source/CombatExtended/Compatibility/SRTS.cs
+++ b/Source/CombatExtended/Compatibility/SRTS.cs
@@ -22,11 +22,6 @@ public bool CanInstall()
}
return true;
}
- public IEnumerable GetCompatList()
- {
- yield return "SRTSCompat";
- }
-
public void Install()
{
Log.Message("Combat Extended :: Installing SRTS Expanded");
diff --git a/Source/CombatExtended/Compatibility/VanillaExpandedFramework.cs b/Source/CombatExtended/Compatibility/VanillaExpandedFramework.cs
index a3d939db83..e6cc8b18c9 100644
--- a/Source/CombatExtended/Compatibility/VanillaExpandedFramework.cs
+++ b/Source/CombatExtended/Compatibility/VanillaExpandedFramework.cs
@@ -18,11 +18,6 @@ bool IPatch.CanInstall()
return ModLister.HasActiveModWithName(ModName);
}
- IEnumerable IPatch.GetCompatList()
- {
- yield break;
- }
-
void IPatch.Install()
{
BlockerRegistry.RegisterCheckForCollisionCallback(CheckIntercept);
diff --git a/Source/CombatExtended/Compatibility/VanillaFurnitureExpandedSecurity.cs b/Source/CombatExtended/Compatibility/VanillaFurnitureExpandedSecurity.cs
index 3852571d47..41d6bdd24a 100644
--- a/Source/CombatExtended/Compatibility/VanillaFurnitureExpandedSecurity.cs
+++ b/Source/CombatExtended/Compatibility/VanillaFurnitureExpandedSecurity.cs
@@ -44,11 +44,6 @@ public void Install()
BlockerRegistry.RegisterImpactSomethingCallback(ImpactSomething);
}
- public IEnumerable GetCompatList()
- {
- yield break;
- }
-
private static bool CheckCollision(ProjectileCE projectile, IntVec3 cell, Thing launcher)
{
if (projectile.def.projectile.flyOverhead)
diff --git a/Source/CombatExtended/Compatibility/VanillaPsycastExpanded.cs b/Source/CombatExtended/Compatibility/VanillaPsycastExpanded.cs
index e0ff231ef2..e041a9ff69 100644
--- a/Source/CombatExtended/Compatibility/VanillaPsycastExpanded.cs
+++ b/Source/CombatExtended/Compatibility/VanillaPsycastExpanded.cs
@@ -20,10 +20,6 @@ public bool CanInstall()
return ModLister.HasActiveModWithName(ModName);
}
- public IEnumerable GetCompatList()
- {
- yield break;
- }
public void Install()
{
diff --git a/Source/CombatExtended/Compatibility/Vehicles.cs b/Source/CombatExtended/Compatibility/Vehicles.cs
index 59efb1b7ff..9330f8a77d 100644
--- a/Source/CombatExtended/Compatibility/Vehicles.cs
+++ b/Source/CombatExtended/Compatibility/Vehicles.cs
@@ -23,11 +23,6 @@ public bool CanInstall()
}
return true;
}
- public IEnumerable GetCompatList()
- {
- yield return "VehiclesCompat";
- }
-
public void Install()
{
diff --git a/Source/Loader/Loader/IModPart.cs b/Source/CombatExtended/Loader/IModPart.cs
similarity index 85%
rename from Source/Loader/Loader/IModPart.cs
rename to Source/CombatExtended/Loader/IModPart.cs
index f35497645a..8e8f45580e 100644
--- a/Source/Loader/Loader/IModPart.cs
+++ b/Source/CombatExtended/Loader/IModPart.cs
@@ -10,6 +10,5 @@ public interface IModPart
{
public void PostLoad(ModContentPack content, ISettingsCE settings);
public Type GetSettingsType();
- public IEnumerable GetCompatList();
}
}
diff --git a/Source/Loader/Loader/ISettingsCE.cs b/Source/CombatExtended/Loader/ISettingsCE.cs
similarity index 100%
rename from Source/Loader/Loader/ISettingsCE.cs
rename to Source/CombatExtended/Loader/ISettingsCE.cs
diff --git a/Source/Loader/Loader.csproj b/Source/Loader/Loader.csproj
index 5fe09601d5..0d1bf4fd3f 100644
--- a/Source/Loader/Loader.csproj
+++ b/Source/Loader/Loader.csproj
@@ -2,7 +2,7 @@
net472
- 0CombatExtendedLoader
+ CombatExtendedLoader
1.1.2.0
1.1.2.0
1.1.2
diff --git a/Source/Loader/Loader/Loader.cs b/Source/Loader/Loader/Loader.cs
index e9a088a2c5..f9fada4428 100644
--- a/Source/Loader/Loader/Loader.cs
+++ b/Source/Loader/Loader/Loader.cs
@@ -10,163 +10,28 @@
namespace CombatExtended.Loader
{
- public class Loader : Mod
+ /*
+ A compiled version of this class resides in our source tree. Anyone who downloads the
+ source tree and installs it uncompiled as a mod will get a warning that they are running
+ uncompiled. During the packaging process this file is removed. If CombatExtended.dll
+ exists in the Assemblies directory, we can assume we are running a local build and omit
+ the warning.
+
+ */
+ public class UncompiledWarning : Mod
{
- /*
- This class handles loading and initializing the different components of CombatExtended.
- If the main CombatExtended.dll is unavailable, it will load an outdated one which is
- sufficient to allow the game to reach the main menu. It will then display a warning to
- the user that they are running the uncompiled git sources rather than a real CombatExtend
- release.
-
- DLLs in the main CombatExtended/Assemblies directory are automatically loaded before any
- code here is run.
-
- DLLs in CombatExtended/AssembliesCore are loaded by Loader's constructor.
-
- After all core CombatExtended assemblies are loaded, all classes implementing
- `CombatExtended.Loader.IModPart` are instantiated, and their list of required Compat modules
- is queried. These compat modules are loaded (and *their* Compat list is queried) until all
- required modules are loaded.
-
- Then each IModPart's PostLoad method is called, with an ISettingsCE if desired (or null).
- */
- public static List settingList = new List();
- private static Loader instance = null;
- private Vector2 scrollPosition;
-
- private ModContentPack content;
-
- private Assembly _loadCompatAssembly(string name)
- {
- DirectoryInfo locationInfo = new DirectoryInfo(content.RootDir).GetDirectories("AssembliesCompat").FirstOrFallback(null);
- if (locationInfo == null)
- {
- Log.Error("Combat Extended :: Cannot find compat assembly directory");
- }
- FileInfo file = locationInfo.GetFiles(name + ".dll").FirstOrFallback(null);
- if (file == null)
- {
- Log.Error("Combat Extended :: Cannot find compat assembly for " + name);
- }
- return _loadAssembly(file);
- }
-
- private Assembly _loadAssembly(FileInfo file)
- {
- Log.Message("Combat Extended :: Loading " + file.FullName);
- byte[] rawAssembly = File.ReadAllBytes(file.FullName);
-
- Assembly assembly;
-
- FileInfo pdbFile = new FileInfo(Path.Combine(file.DirectoryName, Path.GetFileNameWithoutExtension(file.FullName)) + ".pdb");
- if (pdbFile.Exists)
- {
- assembly = AppDomain.CurrentDomain.Load(rawAssembly, File.ReadAllBytes(pdbFile.FullName));
- }
- else
- {
- assembly = AppDomain.CurrentDomain.Load(rawAssembly);
- }
- if (assembly != null)
- {
- content.assemblies.loadedAssemblies.Add(assembly);
- }
-
- return assembly;
- }
-
- public Loader(ModContentPack content) : base(content)
+ public UncompiledWarning(ModContentPack content) : base(content)
{
- Loader.instance = this;
- this.content = content;
- bool found = false;
- Dictionary assemblies = new Dictionary();
-
foreach (Assembly assembly in content.assemblies.loadedAssemblies)
{
string name = assembly.GetName().Name;
- assemblies[name] = assembly;
if (name == "CombatExtended")
{
- found = true;
+ return;
}
}
-
-
- DirectoryInfo locationInfo = new DirectoryInfo(content.RootDir).GetDirectories("AssembliesCore").FirstOrFallback(null);
- if (locationInfo != null)
- {
- foreach (FileInfo fileInfo in locationInfo.GetFiles())
- {
- if (fileInfo.Name.EndsWith(".dll"))
- {
- Assembly assembly = _loadAssembly(fileInfo);
- assemblies[assembly.GetName().Name] = assembly;
- }
- }
- }
-
- Queue toProcess = new Queue(content.assemblies.loadedAssemblies);
- List modParts = new List();
- HashSet compatParts = new HashSet();
-
- while (toProcess.Any())
- {
- Assembly assembly = toProcess.Dequeue();
-
- foreach (Type t in assembly.GetTypes().Where(x => typeof(IModPart).IsAssignableFrom(x) && !x.IsAbstract))
- {
- IModPart imp = ((IModPart)t.GetConstructor(new Type[] { }).Invoke(new object[] { }));
- modParts.Add(imp);
- foreach (string compatPart in imp.GetCompatList())
- {
- if (!compatParts.Contains(compatPart))
- {
- compatParts.Add(compatPart);
- Assembly compatAssembly = _loadCompatAssembly(compatPart);
- toProcess.Enqueue(compatAssembly);
- }
- }
- }
-
- }
-
-
- foreach (IModPart modPart in modParts)
- {
- Type settingsType = modPart.GetSettingsType();
- ISettingsCE settings = null;
- if (settingsType != null)
- {
- if (typeof(ModSettings).IsAssignableFrom(settingsType))
- {
- settings = (ISettingsCE)typeof(Loader).GetMethod(nameof(Loader.GetSettings)).MakeGenericMethod(settingsType).Invoke(instance, null);
- }
- else
- {
- settings = (ISettingsCE)settingsType.GetConstructor(new Type[] { }).Invoke(new object[] { });
- }
- settingList.Add(settings);
- }
-
- modPart.PostLoad(content, settings);
-
- }
-
-
- if (!found)
- {
- Log.Error("Combat Extended :: Running uncompiled");
- LongEventHandler.QueueLongEvent(ShowUncompiledBuildWarning, "CE_LongEvent_ShowUncompiledBuildWarning", false, null);
- _loadAssembly(new DirectoryInfo(content.RootDir)
- .GetDirectories("Source")
- .FirstOrFallback(null)?
- .GetDirectories("packages")
- .FirstOrFallback(null)?.GetFiles("CombatExtended.dll")
- .FirstOrFallback(null));
- }
-
+ Log.Error("Combat Extended :: Running uncompiled");
+ LongEventHandler.QueueLongEvent(ShowUncompiledBuildWarning, "CE_LongEvent_ShowUncompiledBuildWarning", false, null);
}
public override string SettingsCategory()
@@ -174,25 +39,6 @@ public override string SettingsCategory()
return "Combat Extended";
}
- public override void DoSettingsWindowContents(Rect inRect)
- {
- Rect inner = inRect.ContractedBy(20f);
- inner.height = 800f;
- inner.x += 10f;
- Widgets.BeginScrollView(inRect, ref this.scrollPosition, inner, true);
- Listing_Standard list = new Listing_Standard();
- list.ColumnWidth = (inner.width - 17) / 2; // Subtract 17 for gap between columns
- list.Begin(inner);
-
- foreach (ISettingsCE settings in settingList)
- {
- settings.DoWindowContents(list);
- }
- list.End();
- Widgets.EndScrollView();
- }
-
- //Unused method is only here for reference, the repository assembly uses it to warn users to get a compiled build.
private static void ShowUncompiledBuildWarning()
{
Log.Error("You are running CE Uncompiled. See https://github.com/CombatExtended-Continued/CombatExtended#development-version for details");
diff --git a/Source/MiscTurretsCompat/MiscTurretsCompat.csproj b/Source/MiscTurretsCompat/MiscTurretsCompat.csproj
index 12f309f64b..302cf63967 100644
--- a/Source/MiscTurretsCompat/MiscTurretsCompat.csproj
+++ b/Source/MiscTurretsCompat/MiscTurretsCompat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\MiscTurrets\Assemblies\
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\MiscTurrets\Assemblies\
true
none
false
@@ -39,12 +39,6 @@
False
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
..\packages\WeaponBase-reference.dll
diff --git a/Source/MultiplayerCompat/MultiplayerCompat.csproj b/Source/MultiplayerCompat/MultiplayerCompat.csproj
index c32381cb51..f26cc82d97 100644
--- a/Source/MultiplayerCompat/MultiplayerCompat.csproj
+++ b/Source/MultiplayerCompat/MultiplayerCompat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\Multiplayer\Assemblies\
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\Multiplayer\Assemblies\
true
none
false
@@ -34,12 +34,6 @@
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
False
diff --git a/Source/SOS2Compat/SOS2Compat.csproj b/Source/SOS2Compat/SOS2Compat.csproj
index 12ab57e780..42f86238ac 100644
--- a/Source/SOS2Compat/SOS2Compat.csproj
+++ b/Source/SOS2Compat/SOS2Compat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\Save Our Ship 2\Assemblies
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\Save Our Ship 2\Assemblies
true
none
false
@@ -35,12 +35,6 @@
False
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
..\packages\ShipsHaveInsides-reference.dll
diff --git a/Source/SRTSCompat/SRTSCompat.csproj b/Source/SRTSCompat/SRTSCompat.csproj
index 5abb8ba699..f712c546bf 100644
--- a/Source/SRTSCompat/SRTSCompat.csproj
+++ b/Source/SRTSCompat/SRTSCompat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\SRTS\Assemblies\
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\SRTS\Assemblies\
true
none
false
@@ -39,12 +39,6 @@
False
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
..\packages\SRTS-reference.dll
diff --git a/Source/VehiclesCompat/VehiclesCompat.csproj b/Source/VehiclesCompat/VehiclesCompat.csproj
index 79be0719b7..9145d8f0cf 100644
--- a/Source/VehiclesCompat/VehiclesCompat.csproj
+++ b/Source/VehiclesCompat/VehiclesCompat.csproj
@@ -12,7 +12,7 @@
false
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\VehicleFramework\Assemblies\
portable
true
true
@@ -20,7 +20,7 @@
true
- ..\..\AssembliesCompat\
+ ..\..\ModPatches\VehicleFramework\Assemblies\
true
none
false
@@ -39,12 +39,6 @@
False
-
-
- ..\..\Assemblies\0CombatExtendedLoader.dll
- False
-
-
..\packages\Vehicles-reference.dll
diff --git a/SupportedThirdPartyMods.md b/SupportedThirdPartyMods.md
index af873d86e1..37d7db57df 100644
--- a/SupportedThirdPartyMods.md
+++ b/SupportedThirdPartyMods.md
@@ -40,6 +40,7 @@ Mod |
[Pratt] WWII Weapons Pack (Vanilla) |
[RH2] DOOM |
[RH2] Faction: Bounty Hunters |
+[RH2] Faction: Gruppa Krovi |
[RH2] Faction: Task Force 141 |
[RH2] Faction: The Rangers |
[RH2] Faction: Utilitarian |
@@ -536,6 +537,7 @@ Vanilla Races Expanded - Fungoid |
Vanilla Races Expanded - Highmate |
Vanilla Races Expanded - Hussar |
Vanilla Races Expanded - Insector |
+Vanilla Races Expanded - Lycanthrope |
Vanilla Races Expanded - Phytokin |
Vanilla Races Expanded - Sanguophage |
Vanilla Races Expanded - Saurid |