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; // 冷却球体纹理路径 - 冷却状态下静止
}
}