Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm
This commit is contained in:
Binary file not shown.
11
1.6/1.6/Defs/JobDefs/ARA_Jobs_Nutrition.xml
Normal file
11
1.6/1.6/Defs/JobDefs/ARA_Jobs_Nutrition.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<Defs>
|
||||||
|
|
||||||
|
<JobDef>
|
||||||
|
<defName>ARA_Refuel_Nutrition</defName>
|
||||||
|
<driverClass>ArachnaeSwarm.JobDriver_Refuel_Nutrition</driverClass>
|
||||||
|
<reportString>正在为 TargetA 补充营养。</reportString>
|
||||||
|
<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
|
||||||
|
</JobDef>
|
||||||
|
|
||||||
|
</Defs>
|
||||||
@@ -1628,6 +1628,53 @@
|
|||||||
</alienPartGenerator>
|
</alienPartGenerator>
|
||||||
</generalSettings>
|
</generalSettings>
|
||||||
<raceRestriction>
|
<raceRestriction>
|
||||||
|
<!-- 无法拥有的内源性基因 -->
|
||||||
|
<blackEndoCategories MayRequire="Ludeon.RimWorld.Biotech">
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">HairColor</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Melanin</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">BodyType</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Ears</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Nose</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Voice</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Headbone</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Head</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Jaw</li>
|
||||||
|
</blackEndoCategories>
|
||||||
|
<!-- 无法拥有的Tag基因 -->
|
||||||
|
<blackGeneTags MayRequire="Ludeon.RimWorld.Biotech">
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">EyeColor</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Tail</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">BeardStyle</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Fur</li>
|
||||||
|
</blackGeneTags>
|
||||||
|
<!-- 无法拥有的基因列表 -->
|
||||||
|
<blackGeneList>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Furskin</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Brow_Heavy</li>
|
||||||
|
</blackGeneList>
|
||||||
|
<!-- 禁止的异形变种 -->
|
||||||
|
<blackXenotypeList>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Dirtmole</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Genie</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Hussar</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Sanguophage</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Neanderthal</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Pigskin</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Impid</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Waster</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Yttakin</li>
|
||||||
|
<li MayRequire="Ludeon.RimWorld.Biotech">Highmate</li>
|
||||||
|
</blackXenotypeList>
|
||||||
|
<!-- 异种类型列表 -->
|
||||||
|
<xenotypeList>
|
||||||
|
</xenotypeList>
|
||||||
|
<onlyUseRaceRestrictedXenotypes>true</onlyUseRaceRestrictedXenotypes>
|
||||||
|
<!-- 食物列表 -->
|
||||||
|
<whiteFoodList>
|
||||||
|
<li>ARA_InsectJelly</li>
|
||||||
|
<li>ARA_NutrientPasteMeal</li>
|
||||||
|
<li>ARA_PheromoneSolvent</li>
|
||||||
|
</whiteFoodList>
|
||||||
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
|
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
|
||||||
</raceRestriction>
|
</raceRestriction>
|
||||||
</alienRace>
|
</alienRace>
|
||||||
|
|||||||
@@ -499,80 +499,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</comps>
|
</comps>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BuildingBase">
|
|
||||||
<defName>ARA_MorphableResearchBench</defName>
|
|
||||||
<!-- <hasInteractionCell>true</hasInteractionCell>
|
|
||||||
<interactionCellOffset>(0,0,-1)</interactionCellOffset> -->
|
|
||||||
<label>阿拉克涅织域种织座</label>
|
|
||||||
<description>以阿拉克涅织域种为核心形成的活体结构,是推进虫群高级研究的必须建筑。该建筑无法建造,只能通过阿拉克涅织域种变形得到。</description>
|
|
||||||
<thingClass>ArachnaeSwarm.Building_Morphable</thingClass>
|
|
||||||
<tickerType>Normal</tickerType>
|
|
||||||
<size>(2,2)</size>
|
|
||||||
<graphicData>
|
|
||||||
<texPath>ArachnaeSwarm/Building/ARA_MorphableResearchBench</texPath>
|
|
||||||
<graphicClass>Graphic_Single</graphicClass>
|
|
||||||
<shaderType>CutoutComplex</shaderType>
|
|
||||||
<drawSize>(2.5,2.5)</drawSize>
|
|
||||||
</graphicData>
|
|
||||||
<altitudeLayer>Building</altitudeLayer>
|
|
||||||
<passability>Impassable</passability>
|
|
||||||
<castEdgeShadows>false</castEdgeShadows>
|
|
||||||
<fillPercent>0.8</fillPercent>
|
|
||||||
<staticSunShadowHeight>0</staticSunShadowHeight>
|
|
||||||
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
|
||||||
<statBases>
|
|
||||||
<MaxHitPoints>1000</MaxHitPoints>
|
|
||||||
<WorkToBuild>2800</WorkToBuild>
|
|
||||||
<Flammability>1.0</Flammability>
|
|
||||||
<ResearchSpeedFactor>1.0</ResearchSpeedFactor>
|
|
||||||
</statBases>
|
|
||||||
<uiOrder>2600</uiOrder>
|
|
||||||
<surfaceType>Item</surfaceType>
|
|
||||||
<building>
|
|
||||||
<workTableRoomRole>Laboratory</workTableRoomRole>
|
|
||||||
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
|
|
||||||
<deconstructible>false</deconstructible>
|
|
||||||
</building>
|
|
||||||
<!-- 不可建造,只能通过变形生成 -->
|
|
||||||
<comps Inherit="False">
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
|
||||||
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
|
||||||
<spawnRadius>3</spawnRadius>
|
|
||||||
</li>
|
|
||||||
<li Class="CompProperties_ReportWorkSpeed">
|
|
||||||
<workSpeedStat>ResearchSpeedFactor</workSpeedStat>
|
|
||||||
</li>
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_Morphable">
|
|
||||||
<!-- 休息速度增益,例如1.0代表200%的速度 -->
|
|
||||||
<restGainMultiplier>1.0</restGainMultiplier>
|
|
||||||
|
|
||||||
<!-- 操作按钮的自定义标签 -->
|
|
||||||
<gizmoLabel>离开织座</gizmoLabel>
|
|
||||||
|
|
||||||
<!-- 操作按钮的自定义描述 -->
|
|
||||||
<gizmoDesc>使织域种离开织座,恢复移动状态。</gizmoDesc>
|
|
||||||
|
|
||||||
<gizmoIconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_Morph</gizmoIconPath>
|
|
||||||
</li>
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
|
|
||||||
<fuelFilter>
|
|
||||||
<thingDefs>
|
|
||||||
<li>ARA_InsectJelly</li>
|
|
||||||
</thingDefs>
|
|
||||||
</fuelFilter>
|
|
||||||
<fuelCapacity>2.0</fuelCapacity>
|
|
||||||
<targetFuelLevelConfigurable>false</targetFuelLevelConfigurable>
|
|
||||||
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
|
|
||||||
<outOfFuelMessage>没有营养</outOfFuelMessage>
|
|
||||||
</li>
|
|
||||||
<li Class="CompProperties_AffectedByFacilities">
|
|
||||||
<linkableFacilities>
|
|
||||||
<li>ARA_NutrientNetworkTower</li>
|
|
||||||
</linkableFacilities>
|
|
||||||
</li>
|
|
||||||
</comps>
|
|
||||||
</ThingDef>
|
|
||||||
|
|
||||||
<ThingDef ParentName="BuildingBase">
|
<ThingDef ParentName="BuildingBase">
|
||||||
<defName>ARA_SmartThermostat</defName>
|
<defName>ARA_SmartThermostat</defName>
|
||||||
<label>阿拉克涅纤管虫</label>
|
<label>阿拉克涅纤管虫</label>
|
||||||
@@ -643,93 +570,4 @@
|
|||||||
</comps>
|
</comps>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
|
|
||||||
<ThingDef ParentName="BuildingBase">
|
|
||||||
<defName>ARA_JellyVat</defName> <!-- defName is changed to reflect its purpose -->
|
|
||||||
<label>生物质酿造池</label>
|
|
||||||
<description>一个阿拉克涅虫族活体组织,可以充分利用活体钜菌的溶解能力,通过消化生物质,来分泌出营养丰富的阿拉克涅虫蜜。</description>
|
|
||||||
<thingClass>Building</thingClass>
|
|
||||||
<graphicData>
|
|
||||||
<texPath>ArachnaeSwarm/Building/ARA_JellyVat</texPath>
|
|
||||||
<graphicClass>Graphic_Single</graphicClass>
|
|
||||||
<shaderType>CutoutComplex</shaderType>
|
|
||||||
<drawSize>(2.2,2.2)</drawSize>
|
|
||||||
<shadowData>
|
|
||||||
<volume>(1.6, 0.5, 1.6)</volume>
|
|
||||||
<offset>(0,0,-0.1)</offset>
|
|
||||||
</shadowData>
|
|
||||||
</graphicData>
|
|
||||||
<researchPrerequisites>
|
|
||||||
<li>ARA_Technology_6GUT</li>
|
|
||||||
</researchPrerequisites>
|
|
||||||
<size>(2,2)</size>
|
|
||||||
<tickerType>Normal</tickerType>
|
|
||||||
<stuffCategories Inherit="False" />
|
|
||||||
<costStuffCount>0</costStuffCount>
|
|
||||||
<costList>
|
|
||||||
<ARA_Carapace>150</ARA_Carapace>
|
|
||||||
<ARA_Activated_Bacterium>25</ARA_Activated_Bacterium>
|
|
||||||
</costList>
|
|
||||||
<castEdgeShadows>false</castEdgeShadows>
|
|
||||||
<staticSunShadowHeight>0</staticSunShadowHeight>
|
|
||||||
<altitudeLayer>Building</altitudeLayer>
|
|
||||||
<passability>PassThroughOnly</passability>
|
|
||||||
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
|
||||||
<pathCost>50</pathCost>
|
|
||||||
<statBases>
|
|
||||||
<MaxHitPoints>250</MaxHitPoints>
|
|
||||||
<WorkToBuild>2800</WorkToBuild>
|
|
||||||
<Flammability>1.0</Flammability>
|
|
||||||
</statBases>
|
|
||||||
<placeWorkers>
|
|
||||||
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
|
|
||||||
</placeWorkers>
|
|
||||||
<fillPercent>0.8</fillPercent>
|
|
||||||
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
|
|
||||||
<hasInteractionCell>true</hasInteractionCell>
|
|
||||||
<designationCategory>ARA_Buildings</designationCategory>
|
|
||||||
<uiOrder>2600</uiOrder>
|
|
||||||
<surfaceType>Item</surfaceType>
|
|
||||||
<building>
|
|
||||||
<workTableRoomRole>Laboratory</workTableRoomRole>
|
|
||||||
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
|
|
||||||
</building>
|
|
||||||
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
|
||||||
<comps>
|
|
||||||
<li Class="CompProperties_Flickable"/>
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_MultiFuelSpawner">
|
|
||||||
<spawnIntervalRange>
|
|
||||||
<min>120000</min> <!-- 2天 -->
|
|
||||||
<max>120000</max>
|
|
||||||
</spawnIntervalRange>
|
|
||||||
<products>
|
|
||||||
<li>
|
|
||||||
<thingDef>ARA_InsectJelly</thingDef>
|
|
||||||
<count>60</count>
|
|
||||||
</li>
|
|
||||||
</products>
|
|
||||||
<showMessageIfOwned>true</showMessageIfOwned>
|
|
||||||
</li>
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
|
|
||||||
<saveKeysPrefix>Biomass</saveKeysPrefix>
|
|
||||||
<fuelLabel>生物质</fuelLabel>
|
|
||||||
<fuelFilter>
|
|
||||||
<categories>
|
|
||||||
<li>MeatRaw</li>
|
|
||||||
<li>PlantFoodRaw</li>
|
|
||||||
</categories>
|
|
||||||
<disallowedThingDefs>
|
|
||||||
<li>Milk</li>
|
|
||||||
<li>InsectJelly</li>
|
|
||||||
</disallowedThingDefs>
|
|
||||||
</fuelFilter>
|
|
||||||
<fuelCapacity>50</fuelCapacity>
|
|
||||||
<fuelConsumptionRate>30</fuelConsumptionRate>
|
|
||||||
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
|
|
||||||
</li>
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
|
||||||
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
|
||||||
<spawnRadius>6</spawnRadius>
|
|
||||||
</li>
|
|
||||||
</comps>
|
|
||||||
</ThingDef>
|
|
||||||
</Defs>
|
</Defs>
|
||||||
@@ -54,22 +54,6 @@
|
|||||||
<maxDistance>80</maxDistance> <!-- 供能范围 -->
|
<maxDistance>80</maxDistance> <!-- 供能范围 -->
|
||||||
<maxSimultaneous>10</maxSimultaneous>
|
<maxSimultaneous>10</maxSimultaneous>
|
||||||
<maxEfficiency>0.9</maxEfficiency>
|
<maxEfficiency>0.9</maxEfficiency>
|
||||||
</li>
|
|
||||||
|
|
||||||
<!-- 全新的、只负责画线的组件 -->
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_LineDrawer">
|
|
||||||
<linkableBuildings>
|
|
||||||
<li>ARA_BioforgeIncubator</li>
|
|
||||||
<li>ARA_BioforgeIncubator_Thing</li>
|
|
||||||
<li>ARA_GrowthVat</li>
|
|
||||||
<li>ARA_MorphableResearchBench</li>
|
|
||||||
<li>ARANutrientDispenser</li>
|
|
||||||
<li>ARA_WormholePortal_A</li>
|
|
||||||
<li>ARA_Acidling_AutoMortar</li>
|
|
||||||
<li>CatastropheMissileSilo</li>
|
|
||||||
<li>ARA_AutoSniperCannon</li>
|
|
||||||
</linkableBuildings>
|
|
||||||
<maxDistance>80</maxDistance>
|
|
||||||
<lineTexturePath>ArachnaeSwarm/Building/Nutrition_Pie</lineTexturePath>
|
<lineTexturePath>ArachnaeSwarm/Building/Nutrition_Pie</lineTexturePath>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -192,7 +176,7 @@
|
|||||||
<li>ARA_NutrientNetworkTower</li>
|
<li>ARA_NutrientNetworkTower</li>
|
||||||
</linkableFacilities>
|
</linkableFacilities>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
||||||
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
||||||
<spawnRadius>6</spawnRadius>
|
<spawnRadius>6</spawnRadius>
|
||||||
@@ -511,4 +495,221 @@
|
|||||||
</li>
|
</li>
|
||||||
</comps>
|
</comps>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
|
|
||||||
|
<ThingDef ParentName="BuildingBase">
|
||||||
|
<defName>ARA_MorphableResearchBench</defName>
|
||||||
|
<!-- <hasInteractionCell>true</hasInteractionCell>
|
||||||
|
<interactionCellOffset>(0,0,-1)</interactionCellOffset> -->
|
||||||
|
<label>阿拉克涅织域种织座</label>
|
||||||
|
<description>以阿拉克涅织域种为核心形成的活体结构,是推进虫群高级研究的必须建筑。该建筑无法建造,只能通过阿拉克涅织域种变形得到。</description>
|
||||||
|
<thingClass>ArachnaeSwarm.Building_Morphable</thingClass>
|
||||||
|
<tickerType>Normal</tickerType>
|
||||||
|
<drawerType>RealtimeOnly</drawerType> <!-- ADDED: Force realtime rendering -->
|
||||||
|
<size>(2,2)</size>
|
||||||
|
<graphicData>
|
||||||
|
<texPath>ArachnaeSwarm/Building/ARA_MorphableResearchBench</texPath>
|
||||||
|
<graphicClass>Graphic_Single</graphicClass>
|
||||||
|
<shaderType>CutoutComplex</shaderType>
|
||||||
|
<drawSize>(3,3)</drawSize>
|
||||||
|
<drawOffset>(0, 0, 0.25)</drawOffset>
|
||||||
|
</graphicData>
|
||||||
|
<altitudeLayer>Building</altitudeLayer>
|
||||||
|
<passability>Impassable</passability>
|
||||||
|
<castEdgeShadows>false</castEdgeShadows>
|
||||||
|
<fillPercent>0.8</fillPercent>
|
||||||
|
<staticSunShadowHeight>0</staticSunShadowHeight>
|
||||||
|
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
||||||
|
<statBases>
|
||||||
|
<MaxHitPoints>1000</MaxHitPoints>
|
||||||
|
<WorkToBuild>2800</WorkToBuild>
|
||||||
|
<Flammability>1.0</Flammability>
|
||||||
|
<ResearchSpeedFactor>1.0</ResearchSpeedFactor>
|
||||||
|
</statBases>
|
||||||
|
<uiOrder>2600</uiOrder>
|
||||||
|
<surfaceType>Item</surfaceType>
|
||||||
|
<building>
|
||||||
|
<workTableRoomRole>Laboratory</workTableRoomRole>
|
||||||
|
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
|
||||||
|
<deconstructible>false</deconstructible>
|
||||||
|
</building>
|
||||||
|
<!-- 不可建造,只能通过变形生成 -->
|
||||||
|
<comps Inherit="False">
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
||||||
|
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
||||||
|
<spawnRadius>3</spawnRadius>
|
||||||
|
</li>
|
||||||
|
<li Class="CompProperties_ReportWorkSpeed">
|
||||||
|
<workSpeedStat>ResearchSpeedFactor</workSpeedStat>
|
||||||
|
</li>
|
||||||
|
<li Class="CompProperties_ProjectileInterceptor">
|
||||||
|
<radius>5.9</radius>
|
||||||
|
<hitPoints>300</hitPoints>
|
||||||
|
<interceptAirProjectiles>true</interceptAirProjectiles>
|
||||||
|
<interceptGroundProjectiles>true</interceptGroundProjectiles>
|
||||||
|
<color>(0.5, 0.3, 0.9, 0.5)</color>
|
||||||
|
<reactivateEffect>BulletShieldGenerator_Reactivate</reactivateEffect>
|
||||||
|
<activeSound>BulletShield_Ambience</activeSound>
|
||||||
|
<rechargeHitPointsIntervalTicks>1</rechargeHitPointsIntervalTicks>
|
||||||
|
<startWithMaxHitPoints>true</startWithMaxHitPoints>
|
||||||
|
<alwaysShowHitpointsGizmo>true</alwaysShowHitpointsGizmo>
|
||||||
|
<drawWithNoSelection>true</drawWithNoSelection>
|
||||||
|
</li>
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_Morphable">
|
||||||
|
<!-- 休息速度增益,例如1.0代表200%的速度 -->
|
||||||
|
<restGainMultiplier>1.0</restGainMultiplier>
|
||||||
|
|
||||||
|
<!-- 操作按钮的自定义标签 -->
|
||||||
|
<gizmoLabel>离开织座</gizmoLabel>
|
||||||
|
|
||||||
|
<!-- 操作按钮的自定义描述 -->
|
||||||
|
<gizmoDesc>使织域种离开织座,恢复移动状态。</gizmoDesc>
|
||||||
|
|
||||||
|
<gizmoIconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_Morph</gizmoIconPath>
|
||||||
|
</li>
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
|
||||||
|
<fuelFilter>
|
||||||
|
<thingDefs>
|
||||||
|
<li>ARA_InsectJelly</li>
|
||||||
|
</thingDefs>
|
||||||
|
</fuelFilter>
|
||||||
|
<fuelCapacity>2.0</fuelCapacity>
|
||||||
|
<targetFuelLevelConfigurable>false</targetFuelLevelConfigurable>
|
||||||
|
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
|
||||||
|
<outOfFuelMessage>没有营养</outOfFuelMessage>
|
||||||
|
</li>
|
||||||
|
<li Class="CompProperties_AffectedByFacilities">
|
||||||
|
<linkableFacilities>
|
||||||
|
<li>ARA_NutrientNetworkTower</li>
|
||||||
|
</linkableFacilities>
|
||||||
|
</li>
|
||||||
|
</comps>
|
||||||
|
</ThingDef>
|
||||||
|
|
||||||
|
<ThingDef ParentName="BuildingBase">
|
||||||
|
<defName>ARA_JellyVat</defName> <!-- defName is changed to reflect its purpose -->
|
||||||
|
<label>生物质酿造池</label>
|
||||||
|
<description>一个阿拉克涅虫族活体组织,可以充分利用活体钜菌的溶解能力,通过消化生物质,来分泌出营养丰富的阿拉克涅虫蜜。</description>
|
||||||
|
<thingClass>Building</thingClass>
|
||||||
|
<graphicData>
|
||||||
|
<texPath>ArachnaeSwarm/Building/ARA_JellyVat</texPath>
|
||||||
|
<graphicClass>Graphic_Single</graphicClass>
|
||||||
|
<shaderType>CutoutComplex</shaderType>
|
||||||
|
<drawSize>(2.2,2.2)</drawSize>
|
||||||
|
<shadowData>
|
||||||
|
<volume>(1.6, 0.5, 1.6)</volume>
|
||||||
|
<offset>(0,0,-0.1)</offset>
|
||||||
|
</shadowData>
|
||||||
|
</graphicData>
|
||||||
|
<researchPrerequisites>
|
||||||
|
<li>ARA_Technology_6GUT</li>
|
||||||
|
</researchPrerequisites>
|
||||||
|
<size>(2,2)</size>
|
||||||
|
<tickerType>Normal</tickerType>
|
||||||
|
<stuffCategories Inherit="False" />
|
||||||
|
<costStuffCount>0</costStuffCount>
|
||||||
|
<costList>
|
||||||
|
<ARA_Carapace>150</ARA_Carapace>
|
||||||
|
<ARA_Activated_Bacterium>25</ARA_Activated_Bacterium>
|
||||||
|
</costList>
|
||||||
|
<castEdgeShadows>false</castEdgeShadows>
|
||||||
|
<staticSunShadowHeight>0</staticSunShadowHeight>
|
||||||
|
<altitudeLayer>Building</altitudeLayer>
|
||||||
|
<passability>PassThroughOnly</passability>
|
||||||
|
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
||||||
|
<pathCost>50</pathCost>
|
||||||
|
<statBases>
|
||||||
|
<MaxHitPoints>250</MaxHitPoints>
|
||||||
|
<WorkToBuild>2800</WorkToBuild>
|
||||||
|
<Flammability>1.0</Flammability>
|
||||||
|
</statBases>
|
||||||
|
<placeWorkers>
|
||||||
|
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
|
||||||
|
</placeWorkers>
|
||||||
|
<fillPercent>0.8</fillPercent>
|
||||||
|
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
|
||||||
|
<hasInteractionCell>true</hasInteractionCell>
|
||||||
|
<designationCategory>ARA_Buildings</designationCategory>
|
||||||
|
<uiOrder>2600</uiOrder>
|
||||||
|
<surfaceType>Item</surfaceType>
|
||||||
|
<building>
|
||||||
|
<workTableRoomRole>Laboratory</workTableRoomRole>
|
||||||
|
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
|
||||||
|
</building>
|
||||||
|
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
|
||||||
|
<comps>
|
||||||
|
<li Class="CompProperties_Flickable"/>
|
||||||
|
<!--<li Class="ArachnaeSwarm.CompProperties_MultiFuelSpawner">
|
||||||
|
<spawnIntervalRange>
|
||||||
|
<min>120000</min>
|
||||||
|
<max>120000</max>
|
||||||
|
</spawnIntervalRange>
|
||||||
|
<products>
|
||||||
|
<li>
|
||||||
|
<thingDef>ARA_InsectJelly</thingDef>
|
||||||
|
<count>60</count>
|
||||||
|
</li>
|
||||||
|
</products>
|
||||||
|
<showMessageIfOwned>true</showMessageIfOwned>
|
||||||
|
</li>-->
|
||||||
|
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
|
||||||
|
<saveKeysPrefix>Biomass</saveKeysPrefix>
|
||||||
|
<fuelLabel>生物质</fuelLabel>
|
||||||
|
<fuelGizmoLabel>生物质</fuelGizmoLabel>
|
||||||
|
<fuelFilter>
|
||||||
|
<categories>
|
||||||
|
<li>MeatRaw</li>
|
||||||
|
<li>PlantFoodRaw</li>
|
||||||
|
</categories>
|
||||||
|
<disallowedThingDefs>
|
||||||
|
<li>Milk</li>
|
||||||
|
<li>InsectJelly</li>
|
||||||
|
</disallowedThingDefs>
|
||||||
|
</fuelFilter>
|
||||||
|
<fuelCapacity>50</fuelCapacity>
|
||||||
|
<fuelConsumptionRate>0</fuelConsumptionRate>
|
||||||
|
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
|
||||||
|
|
||||||
|
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
|
||||||
|
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
|
||||||
|
</li>
|
||||||
|
<li Class="CompProperties_Refuelable">
|
||||||
|
<fuelLabel>虫蜜</fuelLabel>
|
||||||
|
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
|
||||||
|
|
||||||
|
<fuelCapacity>100.0</fuelCapacity>
|
||||||
|
<fuelConsumptionRate>0</fuelConsumptionRate>
|
||||||
|
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
|
||||||
|
|
||||||
|
<fuelFilter>
|
||||||
|
<thingDefs>
|
||||||
|
<li>ARA_InsectJelly</li>
|
||||||
|
</thingDefs>
|
||||||
|
</fuelFilter>
|
||||||
|
|
||||||
|
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
|
||||||
|
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
|
||||||
|
<canEjectFuel>true</canEjectFuel>
|
||||||
|
</li>
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_NutritionToFuelConverter">
|
||||||
|
<checkInterval>200</checkInterval>
|
||||||
|
<nutritionCost>1</nutritionCost>
|
||||||
|
<workAmount>2000</workAmount>
|
||||||
|
<fuelAmount>1</fuelAmount>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<!-- 燃料满了自动弹出 -->
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_AutoEjector">
|
||||||
|
<!-- 精确指定要监控的燃料组件 -->
|
||||||
|
<targetComp>CompRefuelable</targetComp>
|
||||||
|
<!-- 在燃料达到99%时弹出 -->
|
||||||
|
<ejectAtPercent>0.99</ejectAtPercent>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
|
||||||
|
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
|
||||||
|
<spawnRadius>6</spawnRadius>
|
||||||
|
</li>
|
||||||
|
</comps>
|
||||||
|
</ThingDef>
|
||||||
</Defs>
|
</Defs>
|
||||||
@@ -299,8 +299,9 @@
|
|||||||
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
|
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
|
||||||
<comps>
|
<comps>
|
||||||
<li Class="CompProperties_Forbiddable" />
|
<li Class="CompProperties_Forbiddable" />
|
||||||
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
|
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
|
||||||
<fuelCapacity>100</fuelCapacity>
|
<saveKeysPrefix>nutrition</saveKeysPrefix>
|
||||||
|
<fuelCapacity>5.0</fuelCapacity>
|
||||||
<fuelFilter>
|
<fuelFilter>
|
||||||
<thingDefs>
|
<thingDefs>
|
||||||
<li>ARA_InsectJelly</li>
|
<li>ARA_InsectJelly</li>
|
||||||
@@ -451,8 +452,9 @@
|
|||||||
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
|
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
|
||||||
<comps>
|
<comps>
|
||||||
<li Class="CompProperties_Forbiddable" />
|
<li Class="CompProperties_Forbiddable" />
|
||||||
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
|
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
|
||||||
<fuelCapacity>20</fuelCapacity>
|
<saveKeysPrefix>nutrition</saveKeysPrefix>
|
||||||
|
<fuelCapacity>5.0</fuelCapacity>
|
||||||
<fuelFilter>
|
<fuelFilter>
|
||||||
<thingDefs>
|
<thingDefs>
|
||||||
<li>ARA_InsectJelly</li>
|
<li>ARA_InsectJelly</li>
|
||||||
@@ -623,8 +625,9 @@
|
|||||||
</statBases>
|
</statBases>
|
||||||
<tickerType>Normal</tickerType>
|
<tickerType>Normal</tickerType>
|
||||||
<comps>
|
<comps>
|
||||||
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
|
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
|
||||||
<fuelCapacity>10</fuelCapacity>
|
<saveKeysPrefix>nutrition</saveKeysPrefix>
|
||||||
|
<fuelCapacity>5.0</fuelCapacity>
|
||||||
<fuelFilter>
|
<fuelFilter>
|
||||||
<thingDefs>
|
<thingDefs>
|
||||||
<li>ARA_InsectJelly</li>
|
<li>ARA_InsectJelly</li>
|
||||||
|
|||||||
14
1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml
Normal file
14
1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<Defs>
|
||||||
|
<WorkGiverDef>
|
||||||
|
<defName>ARA_Refuel_Nutrition</defName>
|
||||||
|
<label>补充营养</label>
|
||||||
|
<giverClass>ArachnaeSwarm.WorkGiver_Refuel_Nutrition</giverClass>
|
||||||
|
<workType>Hauling</workType>
|
||||||
|
<priorityInType>60</priorityInType>
|
||||||
|
<verb>补充</verb>
|
||||||
|
<gerund>补充</gerund>
|
||||||
|
<scanThings>true</scanThings>
|
||||||
|
<scanCells>false</scanCells>
|
||||||
|
</WorkGiverDef>
|
||||||
|
</Defs>
|
||||||
Binary file not shown.
@@ -1,22 +1,29 @@
|
|||||||
{
|
{
|
||||||
"Version": 1,
|
"Version": 1,
|
||||||
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
|
"WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
|
||||||
"Documents": [
|
"Documents": [
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\thingcomp_guardianpsyfield.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\jobs\\jobdriver_supercarry\\floatmenuoptionprovider_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thingcomp_guardianpsyfield.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_supercarry\\floatmenuoptionprovider_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_nutrientvat\\building_nutrientvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\thing_comps\\ara_thingcomp_guardianpsyfield\\harmony_projectileinterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_thingcomp_guardianpsyfield\\harmony_projectileinterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\thing_comps\\ara_thingcomp_guardianpsyfield\\thingcomp_guardianpsyfield.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_thingcomp_guardianpsyfield\\thingcomp_guardianpsyfield.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_nutrientvat\\building_nutrientvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientvat\\building_nutrientvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientvat\\building_nutrientvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_nutrientnetwork\\compnutrientprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_nutrientnetwork\\compnutrientprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientnetwork\\compnutrientprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientnetwork\\compnutrientprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_nutrientnetwork\\complinedrawer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientnetwork\\complinedrawer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"DocumentGroupContainers": [
|
"DocumentGroupContainers": [
|
||||||
@@ -35,23 +42,49 @@
|
|||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 0,
|
"DocumentIndex": 0,
|
||||||
|
"Title": "FloatMenuOptionProvider_SuperCarry.cs",
|
||||||
|
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SuperCarry\\FloatMenuOptionProvider_SuperCarry.cs",
|
||||||
|
"RelativeDocumentMoniker": "Jobs\\JobDriver_SuperCarry\\FloatMenuOptionProvider_SuperCarry.cs",
|
||||||
|
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SuperCarry\\FloatMenuOptionProvider_SuperCarry.cs",
|
||||||
|
"RelativeToolTip": "Jobs\\JobDriver_SuperCarry\\FloatMenuOptionProvider_SuperCarry.cs",
|
||||||
|
"ViewState": "AQIAAAAAAAAAAAAAAADwvwAAAAAAAAAA",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2025-10-04T07:00:14.106Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 1,
|
||||||
|
"Title": "Harmony_ProjectileInterceptor.cs",
|
||||||
|
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Thing_Comps\\ARA_ThingComp_GuardianPsyField\\Harmony_ProjectileInterceptor.cs",
|
||||||
|
"RelativeDocumentMoniker": "Thing_Comps\\ARA_ThingComp_GuardianPsyField\\Harmony_ProjectileInterceptor.cs",
|
||||||
|
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Thing_Comps\\ARA_ThingComp_GuardianPsyField\\Harmony_ProjectileInterceptor.cs",
|
||||||
|
"RelativeToolTip": "Thing_Comps\\ARA_ThingComp_GuardianPsyField\\Harmony_ProjectileInterceptor.cs",
|
||||||
|
"ViewState": "AQIAAAAAAAAAAAAAAADwvwAAAAAAAAAA",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2025-10-04T07:00:14.029Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 2,
|
||||||
"Title": "ThingComp_GuardianPsyField.cs",
|
"Title": "ThingComp_GuardianPsyField.cs",
|
||||||
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ThingComp_GuardianPsyField.cs",
|
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Thing_Comps\\ARA_ThingComp_GuardianPsyField\\ThingComp_GuardianPsyField.cs",
|
||||||
"RelativeDocumentMoniker": "ThingComp_GuardianPsyField.cs",
|
"RelativeDocumentMoniker": "Thing_Comps\\ARA_ThingComp_GuardianPsyField\\ThingComp_GuardianPsyField.cs",
|
||||||
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ThingComp_GuardianPsyField.cs",
|
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Thing_Comps\\ARA_ThingComp_GuardianPsyField\\ThingComp_GuardianPsyField.cs",
|
||||||
"RelativeToolTip": "ThingComp_GuardianPsyField.cs",
|
"RelativeToolTip": "Thing_Comps\\ARA_ThingComp_GuardianPsyField\\ThingComp_GuardianPsyField.cs",
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAAgAAAAAAAAAA==",
|
"ViewState": "AQIAAAAAAAAAAAAAAADwvwAAAAAAAAAA",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
"WhenOpened": "2025-10-02T16:24:06.176Z",
|
"WhenOpened": "2025-10-02T16:24:06.176Z",
|
||||||
"EditorCaption": ""
|
"EditorCaption": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 1,
|
"DocumentIndex": 3,
|
||||||
"Title": "Building_NutrientVat.cs",
|
"Title": "Building_NutrientVat.cs",
|
||||||
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
||||||
"RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
"RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
||||||
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
||||||
"RelativeToolTip": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
"RelativeToolTip": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs",
|
||||||
"ViewState": "AgIAAF8AAAAAAAAAAAAswJkBAAANAAAAAAAAAA==",
|
"ViewState": "AgIAAF8AAAAAAAAAAAAswJkBAAANAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
@@ -59,11 +92,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 2,
|
"DocumentIndex": 4,
|
||||||
"Title": "CompNutrientProvider.cs",
|
"Title": "CompNutrientProvider.cs",
|
||||||
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
||||||
"RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
"RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
||||||
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
||||||
"RelativeToolTip": "Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
"RelativeToolTip": "Building_Comps\\ARA_NutrientNetwork\\CompNutrientProvider.cs",
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABkAAAAZAAAAAAAAAA==",
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABkAAAAZAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
@@ -71,12 +104,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 3,
|
"DocumentIndex": 5,
|
||||||
"Title": "CompLineDrawer.cs",
|
"Title": "CompLineDrawer.cs",
|
||||||
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
||||||
"RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
|
||||||
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
||||||
"RelativeToolTip": "Building_Comps\\ARA_NutrientNetwork\\CompLineDrawer.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAA==",
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
"WhenOpened": "2025-10-02T15:11:03.083Z"
|
"WhenOpened": "2025-10-02T15:11:03.083Z"
|
||||||
|
|||||||
@@ -128,7 +128,6 @@
|
|||||||
<Compile Include="Building_Comps\ARA_HunterTrap\CompProperties_HunterExplosion.cs" />
|
<Compile Include="Building_Comps\ARA_HunterTrap\CompProperties_HunterExplosion.cs" />
|
||||||
<Compile Include="Building_Comps\ARA_HunterTrap\TrapReleaseRandomExtension.cs" />
|
<Compile Include="Building_Comps\ARA_HunterTrap\TrapReleaseRandomExtension.cs" />
|
||||||
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompFacility_GrowthVatBooster.cs" />
|
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompFacility_GrowthVatBooster.cs" />
|
||||||
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompLineDrawer.cs" />
|
|
||||||
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompNutrientProvider.cs" />
|
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompNutrientProvider.cs" />
|
||||||
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompProperties_NutrientProvider.cs" />
|
<Compile Include="Building_Comps\ARA_NutrientNetwork\CompProperties_NutrientProvider.cs" />
|
||||||
<Compile Include="Building_Comps\ARA_NutrientVat\Building_NutrientVat.cs" />
|
<Compile Include="Building_Comps\ARA_NutrientVat\Building_NutrientVat.cs" />
|
||||||
@@ -146,6 +145,9 @@
|
|||||||
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\IFuelSource.cs" />
|
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\IFuelSource.cs" />
|
||||||
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\Patch_CompRefuelableWithKey.cs" />
|
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\Patch_CompRefuelableWithKey.cs" />
|
||||||
<Compile Include="Building_Comps\CompNutritionToFuelConverter.cs" />
|
<Compile Include="Building_Comps\CompNutritionToFuelConverter.cs" />
|
||||||
|
<Compile Include="Building_Comps\CompAutoEjector.cs" />
|
||||||
|
<Compile Include="Jobs\JobDriver_Refuel_Nutrition.cs" />
|
||||||
|
<Compile Include="WorkGivers\WorkGiver_Refuel_Nutrition.cs" />
|
||||||
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_ConfigurableMutant.cs" />
|
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_ConfigurableMutant.cs" />
|
||||||
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_NecroticVirus_Configurable.cs" />
|
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_NecroticVirus_Configurable.cs" />
|
||||||
<Compile Include="Hediffs\ARA_ConfigurableMutant\HediffComp_NecroticTransformation.cs" />
|
<Compile Include="Hediffs\ARA_ConfigurableMutant\HediffComp_NecroticTransformation.cs" />
|
||||||
@@ -171,13 +173,13 @@
|
|||||||
<Compile Include="Hediffs\ProphecyGearEffect.cs" />
|
<Compile Include="Hediffs\ProphecyGearEffect.cs" />
|
||||||
<Compile Include="Hediffs\WULA_HediffDamgeShield\DRMDamageShield.cs" />
|
<Compile Include="Hediffs\WULA_HediffDamgeShield\DRMDamageShield.cs" />
|
||||||
<Compile Include="Hediffs\WULA_HediffDamgeShield\Hediff_DamageShield.cs" />
|
<Compile Include="Hediffs\WULA_HediffDamgeShield\Hediff_DamageShield.cs" />
|
||||||
<Compile Include="Hediff_DynamicInterceptor.cs" />
|
<Compile Include="Thing_Comps\ARA_ThingComp_GuardianPsyField\Hediff_DynamicInterceptor.cs" />
|
||||||
<Compile Include="JobDriver_CarryPrisonerToNutrientVat.cs" />
|
<Compile Include="Jobs\JobDriver_CarryPrisonerToNutrientVat.cs" />
|
||||||
<Compile Include="Pawn_Comps\ARA_CompSkillExperienceGiver\CompProperties_SkillExperienceGiver.cs" />
|
<Compile Include="Pawn_Comps\ARA_CompSkillExperienceGiver\CompProperties_SkillExperienceGiver.cs" />
|
||||||
<Compile Include="Pawn_Comps\ARA_CompSkillExperienceGiver\CompSkillExperienceGiver.cs" />
|
<Compile Include="Pawn_Comps\ARA_CompSkillExperienceGiver\CompSkillExperienceGiver.cs" />
|
||||||
<Compile Include="Stat\StatWorker_IncubationInfo.cs" />
|
<Compile Include="Stat\StatWorker_IncubationInfo.cs" />
|
||||||
<Compile Include="ThingComp_GuardianPsyField.cs" />
|
<Compile Include="Thing_Comps\ARA_ThingComp_GuardianPsyField\ThingComp_GuardianPsyField.cs" />
|
||||||
<Compile Include="Harmony_ProjectileInterceptor.cs" />
|
<Compile Include="Thing_Comps\ARA_ThingComp_GuardianPsyField\Harmony_ProjectileInterceptor.cs" />
|
||||||
<Compile Include="MainHarmony.cs" />
|
<Compile Include="MainHarmony.cs" />
|
||||||
<Compile Include="Thing_Comps\ARA_CompExtraIncubationInfo\CompExtraIncubationInfo.cs" />
|
<Compile Include="Thing_Comps\ARA_CompExtraIncubationInfo\CompExtraIncubationInfo.cs" />
|
||||||
<Compile Include="Thing_Comps\ARA_CompExtraIncubationInfo\CompProperties_ExtraIncubationInfo.cs" />
|
<Compile Include="Thing_Comps\ARA_CompExtraIncubationInfo\CompProperties_ExtraIncubationInfo.cs" />
|
||||||
@@ -250,9 +252,9 @@
|
|||||||
<Compile Include="Building_Comps\CompForceTargetable.cs" />
|
<Compile Include="Building_Comps\CompForceTargetable.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="SuperCarryExtension.cs" />
|
<Compile Include="Jobs\JobDriver_SuperCarry\SuperCarryExtension.cs" />
|
||||||
<Compile Include="FloatMenuOptionProvider_SuperCarry.cs" />
|
<Compile Include="Jobs\JobDriver_SuperCarry\FloatMenuOptionProvider_SuperCarry.cs" />
|
||||||
<Compile Include="JobDriver_SuperCarry.cs" />
|
<Compile Include="Jobs\JobDriver_SuperCarry\JobDriver_SuperCarry.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Buildings\Wormhole\Building_WormholePortal_A.cs" />
|
<Compile Include="Buildings\Wormhole\Building_WormholePortal_A.cs" />
|
||||||
|
|||||||
@@ -1,172 +0,0 @@
|
|||||||
using RimWorld;
|
|
||||||
using Verse;
|
|
||||||
using UnityEngine;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
|
||||||
{
|
|
||||||
public class CompProperties_LineDrawer : CompProperties
|
|
||||||
{
|
|
||||||
public List<ThingDef> linkableBuildings;
|
|
||||||
public float maxDistance = 999f;
|
|
||||||
public string lineTexturePath = "Things/Special/Power/Wire";
|
|
||||||
|
|
||||||
public CompProperties_LineDrawer()
|
|
||||||
{
|
|
||||||
compClass = typeof(CompLineDrawer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CompLineDrawer : ThingComp
|
|
||||||
{
|
|
||||||
private CompProperties_LineDrawer Props => (CompProperties_LineDrawer)props;
|
|
||||||
private List<Thing> linkedBuildings = new List<Thing>();
|
|
||||||
private Material lineMat;
|
|
||||||
|
|
||||||
private Material LineMat
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (lineMat == null)
|
|
||||||
{
|
|
||||||
lineMat = MaterialPool.MatFrom(Props.lineTexturePath, ShaderDatabase.Transparent, Color.white);
|
|
||||||
}
|
|
||||||
return lineMat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void PostSpawnSetup(bool respawningAfterLoad)
|
|
||||||
{
|
|
||||||
base.PostSpawnSetup(respawningAfterLoad);
|
|
||||||
FindAndLinkBuildings();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void CompTick()
|
|
||||||
{
|
|
||||||
base.CompTick();
|
|
||||||
if (parent.IsHashIntervalTick(120))
|
|
||||||
{
|
|
||||||
FindAndLinkBuildings();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void FindAndLinkBuildings()
|
|
||||||
{
|
|
||||||
int previousCount = linkedBuildings.Count;
|
|
||||||
|
|
||||||
linkedBuildings.Clear();
|
|
||||||
if (Props.linkableBuildings.NullOrEmpty()) return;
|
|
||||||
|
|
||||||
var potentialTargets = parent.Map.listerBuildings.allBuildingsColonist.Where(b =>
|
|
||||||
b != parent &&
|
|
||||||
Props.linkableBuildings.Contains(b.def) &&
|
|
||||||
parent.Position.DistanceTo(b.Position) <= Props.maxDistance &&
|
|
||||||
HasLineOfSight(parent, b) // 新增:检查视线
|
|
||||||
);
|
|
||||||
|
|
||||||
linkedBuildings.AddRange(potentialTargets);
|
|
||||||
|
|
||||||
if (linkedBuildings.Count != previousCount)
|
|
||||||
{
|
|
||||||
parent.Map.mapDrawer.MapMeshDirty(parent.Position, MapMeshFlagDefOf.Things, true, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 修复后的方法:检查两点之间是否有墙体遮挡
|
|
||||||
private bool HasLineOfSight(Thing from, Thing to)
|
|
||||||
{
|
|
||||||
IntVec3 fromPos = from.Position;
|
|
||||||
IntVec3 toPos = to.Position;
|
|
||||||
|
|
||||||
// 如果两个建筑在同一位置,直接返回true
|
|
||||||
if (fromPos == toPos) return true;
|
|
||||||
|
|
||||||
// 使用更兼容的视线检查方法
|
|
||||||
if (!GenSight.LineOfSight(fromPos, toPos, parent.Map))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 额外检查:确保路径上没有阻挡视线的建筑
|
|
||||||
foreach (IntVec3 cell in GetLineCells(fromPos, toPos))
|
|
||||||
{
|
|
||||||
// 跳过起点和终点
|
|
||||||
if (cell == fromPos || cell == toPos) continue;
|
|
||||||
|
|
||||||
// 检查该单元格是否有阻挡视线的建筑
|
|
||||||
List<Thing> things = parent.Map.thingGrid.ThingsListAt(cell);
|
|
||||||
foreach (Thing thing in things)
|
|
||||||
{
|
|
||||||
// 如果是建筑且阻挡视线
|
|
||||||
if (thing.def.passability == Traversability.Impassable &&
|
|
||||||
thing.def.category == ThingCategory.Building &&
|
|
||||||
!IsPassableBuilding(thing.def)) // 排除可通行的建筑类型
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取两点之间的直线上的所有单元格
|
|
||||||
private IEnumerable<IntVec3> GetLineCells(IntVec3 start, IntVec3 end)
|
|
||||||
{
|
|
||||||
// 使用简单的Bresenham直线算法
|
|
||||||
int x0 = start.x;
|
|
||||||
int y0 = start.z;
|
|
||||||
int x1 = end.x;
|
|
||||||
int y1 = end.z;
|
|
||||||
|
|
||||||
int dx = Mathf.Abs(x1 - x0);
|
|
||||||
int dy = Mathf.Abs(y1 - y0);
|
|
||||||
int sx = x0 < x1 ? 1 : -1;
|
|
||||||
int sy = y0 < y1 ? 1 : -1;
|
|
||||||
int err = dx - dy;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
yield return new IntVec3(x0, 0, y0);
|
|
||||||
|
|
||||||
if (x0 == x1 && y0 == y1) break;
|
|
||||||
|
|
||||||
int e2 = 2 * err;
|
|
||||||
if (e2 > -dy)
|
|
||||||
{
|
|
||||||
err -= dy;
|
|
||||||
x0 += sx;
|
|
||||||
}
|
|
||||||
if (e2 < dx)
|
|
||||||
{
|
|
||||||
err += dx;
|
|
||||||
y0 += sy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查建筑类型是否允许管线通过
|
|
||||||
private bool IsPassableBuilding(ThingDef def)
|
|
||||||
{
|
|
||||||
// 门、栅栏门等可通行的建筑不算阻挡
|
|
||||||
return def.IsDoor ||
|
|
||||||
def.passability == Traversability.PassThroughOnly ||
|
|
||||||
def.passability == Traversability.Standable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void PostPrintOnto(SectionLayer layer)
|
|
||||||
{
|
|
||||||
base.PostPrintOnto(layer);
|
|
||||||
foreach (var building in linkedBuildings)
|
|
||||||
{
|
|
||||||
Vector3 center = (this.parent.TrueCenter() + this.parent.Graphic.DrawOffset(this.parent.Rotation) + building.TrueCenter() + building.Graphic.DrawOffset(building.Rotation)) / 2f;
|
|
||||||
center.y = AltitudeLayer.SmallWire.AltitudeFor();
|
|
||||||
Vector3 v = building.TrueCenter() - this.parent.TrueCenter();
|
|
||||||
Vector2 size = new Vector2(1f, v.MagnitudeHorizontal());
|
|
||||||
float rot = v.AngleFlat();
|
|
||||||
Printer_Plane.PrintPlane(layer, center, size, this.LineMat, rot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,6 +11,19 @@ namespace ArachnaeSwarm
|
|||||||
{
|
{
|
||||||
private CompRefuelableNutrition selfRefuelable;
|
private CompRefuelableNutrition selfRefuelable;
|
||||||
private new CompProperties_NutrientProvider Props => (CompProperties_NutrientProvider)props;
|
private new CompProperties_NutrientProvider Props => (CompProperties_NutrientProvider)props;
|
||||||
|
private Material lineMat;
|
||||||
|
|
||||||
|
private Material LineMat
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (lineMat == null)
|
||||||
|
{
|
||||||
|
lineMat = MaterialPool.MatFrom(Props.lineTexturePath, ShaderDatabase.Transparent, Color.white);
|
||||||
|
}
|
||||||
|
return lineMat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void PostSpawnSetup(bool respawningAfterLoad)
|
public override void PostSpawnSetup(bool respawningAfterLoad)
|
||||||
{
|
{
|
||||||
@@ -102,5 +115,20 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
return comp.TargetFuelLevel;
|
return comp.TargetFuelLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void PostPrintOnto(SectionLayer layer)
|
||||||
|
{
|
||||||
|
base.PostPrintOnto(layer);
|
||||||
|
foreach (var building in LinkedBuildings)
|
||||||
|
{
|
||||||
|
if (building == null) continue;
|
||||||
|
Vector3 center = (this.parent.TrueCenter() + this.parent.Graphic.DrawOffset(this.parent.Rotation) + building.TrueCenter() + building.Graphic.DrawOffset(building.Rotation)) / 2f;
|
||||||
|
center.y = AltitudeLayer.SmallWire.AltitudeFor();
|
||||||
|
Vector3 v = building.TrueCenter() - this.parent.TrueCenter();
|
||||||
|
Vector2 size = new Vector2(1f, v.MagnitudeHorizontal());
|
||||||
|
float rot = v.AngleFlat();
|
||||||
|
Printer_Plane.PrintPlane(layer, center, size, this.LineMat, rot);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,8 @@ namespace ArachnaeSwarm
|
|||||||
public class CompProperties_NutrientProvider : CompProperties_Facility
|
public class CompProperties_NutrientProvider : CompProperties_Facility
|
||||||
{
|
{
|
||||||
public float maxEfficiency = 0.9f;
|
public float maxEfficiency = 0.9f;
|
||||||
|
public string lineTexturePath = "Things/Special/Power/Wire";
|
||||||
|
|
||||||
public CompProperties_NutrientProvider()
|
public CompProperties_NutrientProvider()
|
||||||
{
|
{
|
||||||
compClass = typeof(CompNutrientProvider);
|
compClass = typeof(CompNutrientProvider);
|
||||||
|
|||||||
58
Source/ArachnaeSwarm/Building_Comps/CompAutoEjector.cs
Normal file
58
Source/ArachnaeSwarm/Building_Comps/CompAutoEjector.cs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using RimWorld;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace ArachnaeSwarm
|
||||||
|
{
|
||||||
|
// Properties for the new component
|
||||||
|
public class CompProperties_AutoEjector : CompProperties
|
||||||
|
{
|
||||||
|
public int checkInterval = 250; // Check roughly every 4 seconds
|
||||||
|
public float ejectAtPercent = 1.0f; // Eject when fuel reaches this percentage of max capacity (1.0 = 100%)
|
||||||
|
public Type targetComp = typeof(CompRefuelable); // The specific CompRefuelable class to target, can be overridden in XML
|
||||||
|
|
||||||
|
public CompProperties_AutoEjector()
|
||||||
|
{
|
||||||
|
this.compClass = typeof(CompAutoEjector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The component logic
|
||||||
|
public class CompAutoEjector : ThingComp
|
||||||
|
{
|
||||||
|
private CompProperties_AutoEjector Props => (CompProperties_AutoEjector)this.props;
|
||||||
|
private CompRefuelable refuelableComp;
|
||||||
|
|
||||||
|
public override void PostSpawnSetup(bool respawningAfterLoad)
|
||||||
|
{
|
||||||
|
base.PostSpawnSetup(respawningAfterLoad);
|
||||||
|
|
||||||
|
// Find the specific refuelable component specified in XML
|
||||||
|
this.refuelableComp = this.parent.GetComps<CompRefuelable>()
|
||||||
|
.FirstOrDefault(comp => comp.GetType() == this.Props.targetComp);
|
||||||
|
|
||||||
|
if (this.refuelableComp == null)
|
||||||
|
{
|
||||||
|
Log.Warning($"[ArachnaeSwarm] CompAutoEjector on {parent.def.defName} could not find a CompRefuelable of type '{this.Props.targetComp.FullName}' to monitor.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CompTick()
|
||||||
|
{
|
||||||
|
base.CompTick();
|
||||||
|
|
||||||
|
// Check if we have a valid refuelable comp and it's time to check
|
||||||
|
if (this.refuelableComp != null &&
|
||||||
|
this.parent.IsHashIntervalTick(this.Props.checkInterval))
|
||||||
|
{
|
||||||
|
// Check if fuel has reached or exceeded the configured percentage of the MAX capacity
|
||||||
|
if (this.refuelableComp.FuelPercentOfMax >= this.Props.ejectAtPercent)
|
||||||
|
{
|
||||||
|
// Call the public EjectFuel() method.
|
||||||
|
this.refuelableComp.EjectFuel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,10 +63,7 @@ namespace ArachnaeSwarm
|
|||||||
fuelNeeded = TargetFuelLevel - Fuel;
|
fuelNeeded = TargetFuelLevel - Fuel;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totalNutritionGained > 0 && Props.fuelGizmoLabel != null)
|
// Let the job driver handle the message. This component should only handle logic.
|
||||||
{
|
|
||||||
Messages.Message("MessageRefueled".Translate(parent.LabelShort, totalNutritionGained.ToString("0.##"), Props.fuelGizmoLabel), parent, MessageTypeDefOf.PositiveEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReceiveFuel(float amount)
|
public void ReceiveFuel(float amount)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
using System.Reflection;
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
namespace ArachnaeSwarm
|
||||||
{
|
{
|
||||||
@@ -17,6 +19,36 @@ namespace ArachnaeSwarm
|
|||||||
{
|
{
|
||||||
public new CompProperties_RefuelableWithKey Props => (CompProperties_RefuelableWithKey)props;
|
public new CompProperties_RefuelableWithKey Props => (CompProperties_RefuelableWithKey)props;
|
||||||
|
|
||||||
|
public override void PostExposeData()
|
||||||
|
{
|
||||||
|
string prefix = Props.saveKeysPrefix;
|
||||||
|
if (prefix.NullOrEmpty())
|
||||||
|
{
|
||||||
|
Log.ErrorOnce($"CompRefuelableWithKey on {parent.def.defName} has a null or empty saveKeysPrefix. Defaulting to standard save.", GetHashCode());
|
||||||
|
base.PostExposeData();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FieldInfo fuelField = AccessTools.Field(typeof(CompRefuelable), "fuel");
|
||||||
|
FieldInfo configuredTargetFuelLevelField = AccessTools.Field(typeof(CompRefuelable), "configuredTargetFuelLevel");
|
||||||
|
FieldInfo allowAutoRefuelField = AccessTools.Field(typeof(CompRefuelable), "allowAutoRefuel");
|
||||||
|
|
||||||
|
float currentFuel = (float)fuelField.GetValue(this);
|
||||||
|
float currentConfiguredLevel = (float)configuredTargetFuelLevelField.GetValue(this);
|
||||||
|
bool currentAllowAuto = (bool)allowAutoRefuelField.GetValue(this);
|
||||||
|
|
||||||
|
Scribe_Values.Look(ref currentFuel, prefix + "_fuel", 0f);
|
||||||
|
Scribe_Values.Look(ref currentConfiguredLevel, prefix + "_configuredTargetFuelLevel", -1f);
|
||||||
|
Scribe_Values.Look(ref currentAllowAuto, prefix + "_allowAutoRefuel", true);
|
||||||
|
|
||||||
|
if (Scribe.mode == LoadSaveMode.LoadingVars)
|
||||||
|
{
|
||||||
|
fuelField.SetValue(this, currentFuel);
|
||||||
|
configuredTargetFuelLevelField.SetValue(this, currentConfiguredLevel);
|
||||||
|
allowAutoRefuelField.SetValue(this, currentAllowAuto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public new void Notify_UsedThisTick()
|
public new void Notify_UsedThisTick()
|
||||||
{
|
{
|
||||||
if (Props.consumeFuelOnlyWhenUsed)
|
if (Props.consumeFuelOnlyWhenUsed)
|
||||||
|
|||||||
88
Source/ArachnaeSwarm/Jobs/JobDriver_Refuel_Nutrition.cs
Normal file
88
Source/ArachnaeSwarm/Jobs/JobDriver_Refuel_Nutrition.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using RimWorld;
|
||||||
|
using Verse;
|
||||||
|
using Verse.AI;
|
||||||
|
|
||||||
|
namespace ArachnaeSwarm
|
||||||
|
{
|
||||||
|
public class JobDriver_Refuel_Nutrition : JobDriver
|
||||||
|
{
|
||||||
|
private const TargetIndex RefuelableInd = TargetIndex.A;
|
||||||
|
private const TargetIndex FuelInd = TargetIndex.B;
|
||||||
|
private const int RefuelingDuration = 240;
|
||||||
|
|
||||||
|
protected Thing Refuelable => job.GetTarget(RefuelableInd).Thing;
|
||||||
|
|
||||||
|
// --- KEY CHANGE HERE ---
|
||||||
|
// We specifically target CompRefuelableNutrition and its children.
|
||||||
|
protected CompRefuelableNutrition RefuelableComp => Refuelable.TryGetComp<CompRefuelableNutrition>();
|
||||||
|
|
||||||
|
protected Thing Fuel => job.GetTarget(FuelInd).Thing;
|
||||||
|
|
||||||
|
public override bool TryMakePreToilReservations(bool errorOnFailed)
|
||||||
|
{
|
||||||
|
if (pawn.Reserve(Refuelable, job, 1, -1, null, errorOnFailed))
|
||||||
|
{
|
||||||
|
return pawn.Reserve(Fuel, job, 1, -1, null, errorOnFailed);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override IEnumerable<Toil> MakeNewToils()
|
||||||
|
{
|
||||||
|
this.FailOnDespawnedNullOrForbidden(RefuelableInd);
|
||||||
|
AddEndCondition(() => !RefuelableComp.IsFull ? JobCondition.Ongoing : JobCondition.Succeeded);
|
||||||
|
AddFailCondition(() => !job.playerForced && !RefuelableComp.ShouldAutoRefuelNowIgnoringFuelPct);
|
||||||
|
AddFailCondition(() => !RefuelableComp.allowAutoRefuel && !job.playerForced);
|
||||||
|
|
||||||
|
yield return Toils_General.DoAtomic(delegate
|
||||||
|
{
|
||||||
|
job.count = RefuelableComp.GetFuelCountToFullyRefuel();
|
||||||
|
});
|
||||||
|
|
||||||
|
Toil reserveFuel = Toils_Reserve.Reserve(FuelInd);
|
||||||
|
yield return reserveFuel;
|
||||||
|
yield return Toils_Goto.GotoThing(FuelInd, PathEndMode.ClosestTouch)
|
||||||
|
.FailOnDespawnedNullOrForbidden(FuelInd)
|
||||||
|
.FailOnSomeonePhysicallyInteracting(FuelInd);
|
||||||
|
yield return Toils_Haul.StartCarryThing(FuelInd, putRemainderInQueue: false, subtractNumTakenFromJobCount: true)
|
||||||
|
.FailOnDestroyedNullOrForbidden(FuelInd);
|
||||||
|
yield return Toils_Haul.CheckForGetOpportunityDuplicate(reserveFuel, FuelInd, TargetIndex.None, takeFromValidStorage: true);
|
||||||
|
yield return Toils_Goto.GotoThing(RefuelableInd, PathEndMode.Touch);
|
||||||
|
yield return Toils_General.Wait(RefuelingDuration)
|
||||||
|
.FailOnDestroyedNullOrForbidden(FuelInd)
|
||||||
|
.FailOnDestroyedNullOrForbidden(RefuelableInd)
|
||||||
|
.FailOnCannotTouch(RefuelableInd, PathEndMode.Touch)
|
||||||
|
.WithProgressBarToilDelay(RefuelableInd);
|
||||||
|
|
||||||
|
// Use our custom Refuel toil for CompRefuelableNutrition
|
||||||
|
yield return FinalizeRefueling_Nutrition();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom Finalize Toil that uses the specific Refuel method from CompRefuelableNutrition
|
||||||
|
public Toil FinalizeRefueling_Nutrition()
|
||||||
|
{
|
||||||
|
Toil toil = new Toil();
|
||||||
|
toil.initAction = delegate()
|
||||||
|
{
|
||||||
|
Pawn actor = toil.GetActor();
|
||||||
|
Job curJob = actor.jobs.curJob;
|
||||||
|
Thing refuelableThing = curJob.GetTarget(RefuelableInd).Thing;
|
||||||
|
CompRefuelableNutrition refuelableComp = refuelableThing.TryGetComp<CompRefuelableNutrition>();
|
||||||
|
|
||||||
|
if (actor.carryTracker.CarriedThing == null)
|
||||||
|
{
|
||||||
|
Log.Error(actor + " is not carrying anything to refuel with.");
|
||||||
|
// The correct way to end the job from within a Toil's action.
|
||||||
|
actor.jobs.EndCurrentJob(JobCondition.Incompletable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the specific Refuel method from our custom component
|
||||||
|
refuelableComp.Refuel(new List<Thing> { actor.carryTracker.CarriedThing });
|
||||||
|
};
|
||||||
|
toil.defaultCompleteMode = ToilCompleteMode.Instant;
|
||||||
|
return toil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using RimWorld;
|
||||||
|
using Verse;
|
||||||
|
using Verse.AI;
|
||||||
|
|
||||||
|
namespace ArachnaeSwarm
|
||||||
|
{
|
||||||
|
public class WorkGiver_Refuel_Nutrition : WorkGiver_Scanner
|
||||||
|
{
|
||||||
|
public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial);
|
||||||
|
|
||||||
|
public override PathEndMode PathEndMode => PathEndMode.Touch;
|
||||||
|
|
||||||
|
public override IEnumerable<Thing> PotentialWorkThingsGlobal(Pawn pawn)
|
||||||
|
{
|
||||||
|
// Find all buildings that have our special component.
|
||||||
|
return pawn.Map.listerBuildings.allBuildingsColonist.Where(b =>
|
||||||
|
b.GetComp<CompRefuelableNutrition>() != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||||||
|
{
|
||||||
|
var building = t as Building;
|
||||||
|
if (building == null) return false;
|
||||||
|
|
||||||
|
// --- KEY CHANGE HERE ---
|
||||||
|
// Target the specific nutrition component
|
||||||
|
var refuelableComp = building.GetComp<CompRefuelableNutrition>();
|
||||||
|
if (refuelableComp == null || refuelableComp.IsFull) return false;
|
||||||
|
|
||||||
|
if (!refuelableComp.ShouldAutoRefuelNow && !forced) return false;
|
||||||
|
|
||||||
|
if (building.IsForbidden(pawn) || !pawn.CanReserve(building, 1, -1, null, forced)) return false;
|
||||||
|
|
||||||
|
var fuel = FindBestFuel(pawn, refuelableComp);
|
||||||
|
if (fuel == null)
|
||||||
|
{
|
||||||
|
JobFailReason.Is("NoFuelToRefuel".Translate(refuelableComp.Props.fuelFilter.Summary));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||||||
|
{
|
||||||
|
var building = t as Building;
|
||||||
|
var refuelableComp = building.GetComp<CompRefuelableNutrition>();
|
||||||
|
var fuel = FindBestFuel(pawn, refuelableComp);
|
||||||
|
|
||||||
|
// Return our custom Job
|
||||||
|
return new Job(DefDatabase<JobDef>.GetNamed("ARA_Refuel_Nutrition"), building, fuel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Thing FindBestFuel(Pawn pawn, CompRefuelable refuelable)
|
||||||
|
{
|
||||||
|
var fuelFilter = refuelable.Props.fuelFilter;
|
||||||
|
return GenClosest.ClosestThingReachable(
|
||||||
|
pawn.Position,
|
||||||
|
pawn.Map,
|
||||||
|
ThingRequest.ForGroup(ThingRequestGroup.HaulableEver),
|
||||||
|
PathEndMode.ClosestTouch,
|
||||||
|
TraverseParms.For(pawn),
|
||||||
|
9999f,
|
||||||
|
thing => !thing.IsForbidden(pawn) && fuelFilter.Allows(thing) && pawn.CanReserve(thing)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user