diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index e90b4a1..9bbea60 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml b/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml index 61d6189..1731f49 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml @@ -11,7 +11,7 @@ ArachnaeSwarm/Building/ARA_HiveShip_Heart_Icon Graphic_Single - ArachnaeSwarm/Building/ARA_HiveShip_Heart_Pedestal + ArachnaeSwarm/Weapon/ARA_Weapon_Empty (3.25,3.25) true @@ -25,9 +25,9 @@
  • - UI/Commands/Inspect ArachnaeSwarm/Building/ARA_HiveShip_Heart ArachnaeSwarm/Building/ARA_HiveShip_Heart + ArachnaeSwarm/Building/ARA_HiveShip_Heart_Pedestal
  • (3,3) diff --git a/About/About.xml b/About/About.xml index 34efeb3..dce076a 100644 --- a/About/About.xml +++ b/About/About.xml @@ -38,12 +38,18 @@ Humanoid Alien Races 2.0 https://steamcommunity.com/sharedfiles/filedetails/?id=839005762 +
  • + Nals.FacialAnimation + [NL] Facial Animation - WIP + https://steamcommunity.com/sharedfiles/filedetails/?id=1635901197 +
  • brrainz.harmony
  • Ludeon.RimWorld
  • erdelf.HumanoidAlienRaces
  • +
  • Nals.FacialAnimation
  • \ No newline at end of file diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index b0d8646..e8c46e6 100644 Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json index 581d4ba..88225bc 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -6,6 +6,10 @@ "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_arachnaegravengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_arachnaegravengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\building_comps\\ara_building_refuelingvat\\building_refuelingvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_building_refuelingvat\\building_refuelingvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, { "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_hediffterrainspawn\\comphediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_hediffterrainspawn\\comphediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" @@ -22,12 +26,25 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 1, + "SelectedChildIndex": 2, "Children": [ { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "Building_RefuelingVat.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "RelativeToolTip": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "ViewState": "AgIAAEQAAAAAAAAAAAAAAEABAAAQAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-10-24T06:16:14.743Z", + "EditorCaption": "" + }, { "$type": "Document", "DocumentIndex": 0, @@ -36,14 +53,14 @@ "RelativeDocumentMoniker": "Buildings\\Building_ArachnaeGravEngine.cs", "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ArachnaeGravEngine.cs", "RelativeToolTip": "Buildings\\Building_ArachnaeGravEngine.cs", - "ViewState": "AgIAAK0AAAAAAAAAAAAUwL4AAAANAAAAAAAAAA==", + "ViewState": "AgIAAHwAAAAAAAAAAAAgwJcAAAAJAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2025-10-24T02:30:45.288Z", "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 1, + "DocumentIndex": 2, "Title": "CompHediffTerrainSpawn.cs", "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", "RelativeDocumentMoniker": "Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", @@ -56,7 +73,7 @@ }, { "$type": "Document", - "DocumentIndex": 2, + "DocumentIndex": 3, "Title": "CompAbilityEffect_RandomHediff.cs", "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\CompAbilityEffect_RandomHediff.cs", "RelativeDocumentMoniker": "Abilities\\CompAbilityEffect_RandomHediff.cs", diff --git a/Source/ArachnaeSwarm/Buildings/Building_ArachnaeGravEngine.cs b/Source/ArachnaeSwarm/Buildings/Building_ArachnaeGravEngine.cs index a5f2776..9025b30 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_ArachnaeGravEngine.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_ArachnaeGravEngine.cs @@ -13,10 +13,14 @@ namespace ArachnaeSwarm // 通过 ModExtension 暴露的纹理路径 private ArachnaeGravEngineExtension modExtension; - // 覆盖的纹理资源 - private Texture2D customInspectCommandTex; - private CachedMaterial customOrbMat; - private Graphic customOnCooldownGraphic; + // 自定义图形组件 + private Graphic customBaseGraphic; // 基座图形 - 始终静止 + private Graphic customOrbGraphic; // 球体图形 - 正常状态下浮动 + private Graphic customCooldownGraphic; // 冷却球体图形 - 冷却状态下静止 + + // 渲染相关的变量 + private float orbFloatOffset = 0f; + private int lastTick = -1; public ArachnaeGravEngineExtension ModExtension { @@ -30,64 +34,67 @@ namespace ArachnaeSwarm } } - // 重写 Graphic 属性以使用自定义纹理 - public override Graphic Graphic + // 基座图形 - 始终静止 + private Graphic CustomBaseGraphic { get { - if (Find.TickManager.TicksGame >= cooldownCompleteTick) + if (customBaseGraphic == null) { - return base.Graphic; - } - return CustomOnCooldownGraphic; - } - } - - private Texture2D CustomInspectCommandTex - { - get - { - if (customInspectCommandTex == null && ModExtension?.inspectCommandTexPath != null) - { - customInspectCommandTex = ContentFinder.Get(ModExtension.inspectCommandTexPath); - } - return customInspectCommandTex ?? ContentFinder.Get("UI/Commands/Inspect"); - } - } - - private CachedMaterial CustomOrbMat - { - get - { - if (customOrbMat == null && ModExtension?.orbTexPath != null) - { - customOrbMat = new CachedMaterial(ModExtension.orbTexPath, ShaderDatabase.Cutout); - } - return customOrbMat ?? new CachedMaterial("Things/Building/GravEngine/GravEngine_Orb", ShaderDatabase.Cutout); - } - } - - private Graphic CustomOnCooldownGraphic - { - get - { - if (customOnCooldownGraphic == null && ModExtension?.cooldownTexPath != null) - { - customOnCooldownGraphic = GraphicDatabase.Get( - ModExtension.cooldownTexPath, + string basePath = ModExtension?.baseTexPath ?? "ArachnaeSwarm/Building/ARA_HiveShip_Heart_Pedestal"; + customBaseGraphic = GraphicDatabase.Get( + basePath, ShaderDatabase.Cutout, - Vector2.one * 3f, + def.graphicData?.drawSize ?? Vector2.one * 3f, Color.white); } - return customOnCooldownGraphic ?? GraphicDatabase.Get("Things/Building/GravEngine/GravEngine_Cooldown", ShaderDatabase.Cutout, Vector2.one * 3f, Color.white); + return customBaseGraphic; } } + // 球体图形 - 正常状态下浮动 + private Graphic CustomOrbGraphic + { + get + { + if (customOrbGraphic == null) + { + string orbPath = ModExtension?.orbTexPath ?? "ArachnaeSwarm/Building/ARA_HiveShip_Heart"; + customOrbGraphic = GraphicDatabase.Get( + orbPath, + ShaderDatabase.Cutout, + Vector2.one * 2f, + Color.white); + } + return customOrbGraphic; + } + } + + // 冷却球体图形 - 冷却状态下静止 + private Graphic CustomCooldownGraphic + { + get + { + if (customCooldownGraphic == null) + { + string cooldownPath = ModExtension?.cooldownTexPath ?? "ArachnaeSwarm/Building/ARA_HiveShip_Heart_Cooldown"; + customCooldownGraphic = GraphicDatabase.Get( + cooldownPath, + ShaderDatabase.Cutout, + Vector2.one * 2f, // 注意:这里应该和球体大小一致,而不是基座大小 + Color.white); + } + return customCooldownGraphic; + } + } + + // 重写 Graphic 属性返回 null,让基础渲染系统不工作 + public override Graphic Graphic => null; + // 禁用检查系统 - 重写 Inspect 方法为空 public new void Inspect(bool silent = false) { // 完全禁用检查系统,不执行任何操作 - // 虫群建筑不需要人类的研究检查流程 } // 重写 GetGizmos 方法,移除检查相关的 gizmo @@ -112,7 +119,6 @@ namespace ArachnaeSwarm defaultLabel = "DEV: Spawn Arachnae Swarm", action = delegate { - // 虫群特有的调试功能 SpawnArachnaeSwarm(); } }; @@ -142,7 +148,7 @@ namespace ArachnaeSwarm { return result; } - return true; // 总是返回 true,忽略检查限制 + return true; } // 重写 GetInspectString 方法,移除检查相关的文本 @@ -169,40 +175,73 @@ namespace ArachnaeSwarm // 虫群特有的方法 private void SpawnArachnaeSwarm() { - // 虫群特有的生成逻辑 - // 这里可以添加生成虫群单位的代码 Messages.Message("ArachnaeSwarmActivated".Translate(), this, MessageTypeDefOf.PositiveEvent); } - // 重写 DrawAt 方法以完全控制绘制过程 + // 完全重写 DrawAt 方法,实现自定义渲染系统 protected override void DrawAt(Vector3 drawLoc, bool flip = false) { - // 不调用 base.DrawAt,而是直接绘制建筑主体 - // 复制父类 Building 的 DrawAt 逻辑,但不包括 orb 的绘制 - if (def.graphicData != null) + // 不调用基类的 DrawAt,完全自定义渲染 + + // 更新浮动效果 + UpdateFloatOffsets(); + + // 基础位置 - 底座始终静止 + Vector3 baseDrawPos = drawLoc; + baseDrawPos.y += 0.03658537f; // 固定的高度偏移 + + // 球体位置 - 根据状态决定 + Vector3 orbDrawPos = drawLoc; + orbDrawPos.y += 0.03658537f; // 基础高度偏移 + orbDrawPos.z += 0.05f; // 球体稍微向前偏移,避免与底座重叠 + + // 始终绘制底座 + CustomBaseGraphic.Draw(baseDrawPos, flip ? base.Rotation.Opposite : base.Rotation, this, 0f); + + // 根据状态绘制球体 + if (Find.TickManager.TicksGame >= cooldownCompleteTick) { - Graphic graphic = Graphic; - if (graphic != null) - { - graphic.Draw(drawLoc, flip ? base.Rotation.Opposite : base.Rotation, this, 0f); - } + // 正常状态:球体浮动 + orbDrawPos.y += orbFloatOffset; + CustomOrbGraphic.Draw(orbDrawPos, flip ? base.Rotation.Opposite : base.Rotation, this, 0f); } - if (base.Spawned) + else { - // 应用浮动效果(与父类相同) + // 冷却状态:球体静止,使用冷却贴图 + CustomCooldownGraphic.Draw(orbDrawPos, flip ? base.Rotation.Opposite : base.Rotation, this, 0f); + } + } + + // 更新浮动效果 - 只更新球体浮动 + private void UpdateFloatOffsets() + { + int currentTick = Find.TickManager.TicksGame; + + if (currentTick != lastTick) + { + // 只在非冷却状态下更新球体浮动 if (Find.TickManager.TicksGame >= cooldownCompleteTick) { - // 使用 Mathf 替代 MathF - drawLoc.z += 0.5f * (1f + Mathf.Sin(Mathf.PI * 2f * (float)GenTicks.TicksGame / 500f)) * 0.3f; + // 球体浮动 - 上下浮动 + orbFloatOffset = Mathf.Sin((float)currentTick / 100f) * 0.1f; } - drawLoc.y += 0.03658537f; - Vector3 s = new Vector3(def.graphicData.drawSize.x, 1f, def.graphicData.drawSize.y); - - // 只使用自定义的球体材质,不绘制默认 orb - Graphics.DrawMesh(MeshPool.plane10Back, Matrix4x4.TRS(drawLoc, base.Rotation.AsQuat, s), CustomOrbMat.Material, 0, null, 0); + else + { + // 冷却状态下球体不浮动 + orbFloatOffset = 0f; + } + + lastTick = currentTick; } } + // 重写额外的绘制阶段(如果需要) + public override void DrawExtraSelectionOverlays() + { + // 可以在这里添加选择时的额外效果 + base.DrawExtraSelectionOverlays(); + } + public override void SpawnSetup(Map map, bool respawningAfterLoad) { base.SpawnSetup(map, respawningAfterLoad); @@ -217,15 +256,19 @@ namespace ArachnaeSwarm Find.ResearchManager.gravEngineInspected = true; } - // 由于父类的私有字段无法访问,我们移除 UpdateSubstructureIfNeeded 的重写 - // 如果需要修改子结构逻辑,可能需要通过其他方式 + // 保存和加载自定义数据 + public override void ExposeData() + { + base.ExposeData(); + // 如果需要保存自定义状态,可以在这里添加 + } } - // ModExtension 定义,用于在 XML 中配置纹理路径 + // 扩展 ModExtension 定义,添加基座纹理路径 public class ArachnaeGravEngineExtension : DefModExtension { - public string inspectCommandTexPath; - public string orbTexPath; - public string cooldownTexPath; + public string baseTexPath; // 基座纹理路径 - 始终静止 + public string orbTexPath; // 球体纹理路径 - 正常状态下浮动 + public string cooldownTexPath; // 冷却球体纹理路径 - 冷却状态下静止 } }