暂存
This commit is contained in:
Binary file not shown.
@@ -210,9 +210,6 @@
|
|||||||
<Compile Include="Wormhole\Building_WormholePortal_B.cs" />
|
<Compile Include="Wormhole\Building_WormholePortal_B.cs" />
|
||||||
<Compile Include="Wormhole\CompLaunchableWormhole.cs" />
|
<Compile Include="Wormhole\CompLaunchableWormhole.cs" />
|
||||||
<Compile Include="Wormhole\Dialog_WormholeTransfer.cs" />
|
<Compile Include="Wormhole\Dialog_WormholeTransfer.cs" />
|
||||||
<Compile Include="HarmonyPatches\Patch_Site_ShouldRemoveMapNow.cs" />
|
|
||||||
<Compile Include="HarmonyPatches\Patch_SettlementDefeatUtility_CheckDefeated.cs" />
|
|
||||||
<Compile Include="HarmonyPatches\Patch_Game_DeinitAndRemoveMap.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
using HarmonyLib;
|
|
||||||
using Verse;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
|
||||||
{
|
|
||||||
[HarmonyPatch(typeof(Game), "DeinitAndRemoveMap")]
|
|
||||||
public static class Patch_Game_DeinitAndRemoveMap
|
|
||||||
{
|
|
||||||
[HarmonyPrefix]
|
|
||||||
public static bool Prefix(Map map)
|
|
||||||
{
|
|
||||||
// 如果地图上存在B端传送门,则阻止该地图被销毁
|
|
||||||
if (map != null && map.listerBuildings.AllBuildingsColonistOfClass<Building_WormholePortal_B>().Any())
|
|
||||||
{
|
|
||||||
return false; // 返回 false, 阻止原版方法执行
|
|
||||||
}
|
|
||||||
|
|
||||||
// 否则,正常执行原版方法
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
using HarmonyLib;
|
|
||||||
using RimWorld;
|
|
||||||
using RimWorld.Planet;
|
|
||||||
using Verse;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
|
||||||
{
|
|
||||||
[HarmonyPatch(typeof(SettlementDefeatUtility), "CheckDefeated")]
|
|
||||||
public static class Patch_SettlementDefeatUtility_CheckDefeated
|
|
||||||
{
|
|
||||||
[HarmonyPrefix]
|
|
||||||
public static bool Prefix(Settlement factionBase)
|
|
||||||
{
|
|
||||||
// 如果目标没有地图,或者地图上存在B端传送门,则跳过原版的失败检查
|
|
||||||
if (!factionBase.HasMap || factionBase.Map.listerBuildings.AllBuildingsColonistOfClass<Building_WormholePortal_B>().Any())
|
|
||||||
{
|
|
||||||
return false; // 返回 false, 阻止原版方法执行
|
|
||||||
}
|
|
||||||
|
|
||||||
// 否则,正常执行原版方法
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
using HarmonyLib;
|
|
||||||
using RimWorld.Planet;
|
|
||||||
using Verse;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
|
||||||
{
|
|
||||||
[HarmonyPatch(typeof(Site), "ShouldRemoveMapNow")]
|
|
||||||
public static class Patch_Site_ShouldRemoveMapNow
|
|
||||||
{
|
|
||||||
[HarmonyPostfix]
|
|
||||||
public static void Postfix(MapParent __instance, ref bool __result)
|
|
||||||
{
|
|
||||||
// 如果原方法已经决定不移除,我们就不需要干预
|
|
||||||
if (!__result)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果地图上存在B端传送门,则推翻原方法的决定,阻止地图被移除
|
|
||||||
if (__instance.HasMap && __instance.Map.listerBuildings.AllBuildingsColonistOfClass<Building_WormholePortal_B>().Any())
|
|
||||||
{
|
|
||||||
__result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -35,6 +35,7 @@ namespace ArachnaeSwarm
|
|||||||
|
|
||||||
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
|
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
|
||||||
{
|
{
|
||||||
|
Log.Message($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) is despawning. Notifying and destroying Portal B ({linkedPortalB?.GetUniqueLoadID() ?? "null"}).");
|
||||||
if (linkedPortalB != null && !linkedPortalB.Destroyed)
|
if (linkedPortalB != null && !linkedPortalB.Destroyed)
|
||||||
{
|
{
|
||||||
linkedPortalB.Notify_A_Destroyed();
|
linkedPortalB.Notify_A_Destroyed();
|
||||||
@@ -50,6 +51,7 @@ namespace ArachnaeSwarm
|
|||||||
Notify_B_Destroyed();
|
Notify_B_Destroyed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Log.Message($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) is linking to Portal B ({portalB?.GetUniqueLoadID() ?? "null"}).");
|
||||||
linkedPortalB = portalB;
|
linkedPortalB = portalB;
|
||||||
status = WormholePortalStatus.Linked;
|
status = WormholePortalStatus.Linked;
|
||||||
Messages.Message("WormholePortalLinked".Translate(this.Label, portalB.Map.Parent.LabelCap), this, MessageTypeDefOf.PositiveEvent);
|
Messages.Message("WormholePortalLinked".Translate(this.Label, portalB.Map.Parent.LabelCap), this, MessageTypeDefOf.PositiveEvent);
|
||||||
@@ -57,6 +59,7 @@ namespace ArachnaeSwarm
|
|||||||
|
|
||||||
public void Notify_B_Destroyed()
|
public void Notify_B_Destroyed()
|
||||||
{
|
{
|
||||||
|
Log.Warning($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) received notification that Portal B was destroyed. Resetting status to Idle.");
|
||||||
linkedPortalB = null;
|
linkedPortalB = null;
|
||||||
status = WormholePortalStatus.Idle;
|
status = WormholePortalStatus.Idle;
|
||||||
Messages.Message("WormholePortalB_Destroyed".Translate(this.Label), this, MessageTypeDefOf.NegativeEvent);
|
Messages.Message("WormholePortalB_Destroyed".Translate(this.Label), this, MessageTypeDefOf.NegativeEvent);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ namespace ArachnaeSwarm
|
|||||||
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
|
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
|
||||||
{
|
{
|
||||||
// 如果B被摧毁,通知A
|
// 如果B被摧毁,通知A
|
||||||
|
Log.Warning($"[ArachnaeSwarm] Portal B ({this.GetUniqueLoadID()}) is despawning. Notifying Portal A ({linkedPortalA?.GetUniqueLoadID() ?? "null"}).");
|
||||||
if (linkedPortalA != null && !linkedPortalA.Destroyed)
|
if (linkedPortalA != null && !linkedPortalA.Destroyed)
|
||||||
{
|
{
|
||||||
linkedPortalA.Notify_B_Destroyed();
|
linkedPortalA.Notify_B_Destroyed();
|
||||||
@@ -34,6 +35,7 @@ namespace ArachnaeSwarm
|
|||||||
|
|
||||||
public void SetLinkedPortal(Building_WormholePortal_A portalA)
|
public void SetLinkedPortal(Building_WormholePortal_A portalA)
|
||||||
{
|
{
|
||||||
|
Log.Message($"[ArachnaeSwarm] Portal B ({this.GetUniqueLoadID()}) is linking to Portal A ({portalA?.GetUniqueLoadID() ?? "null"}).");
|
||||||
linkedPortalA = portalA;
|
linkedPortalA = portalA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Verse;
|
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using RimWorld.Planet;
|
using RimWorld.Planet;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
namespace ArachnaeSwarm
|
||||||
{
|
{
|
||||||
@@ -27,8 +27,8 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
|
|
||||||
Command_Action launchCommand = new Command_Action();
|
Command_Action launchCommand = new Command_Action();
|
||||||
launchCommand.defaultLabel = "CommandDeployWormholePortalB".Translate();
|
launchCommand.defaultLabel = "CommandDeployWormholePortalB_Pilot".Translate();
|
||||||
launchCommand.defaultDesc = "CommandDeployWormholePortalBDesc".Translate();
|
launchCommand.defaultDesc = "CommandDeployWormholePortalB_PilotDesc".Translate();
|
||||||
launchCommand.icon = ContentFinder<Texture2D>.Get("UI/Commands/LaunchShip");
|
launchCommand.icon = ContentFinder<Texture2D>.Get("UI/Commands/LaunchShip");
|
||||||
|
|
||||||
if (refuelableComp.Fuel < this.Props.fuelNeededToLaunch)
|
if (refuelableComp.Fuel < this.Props.fuelNeededToLaunch)
|
||||||
@@ -38,23 +38,42 @@ namespace ArachnaeSwarm
|
|||||||
|
|
||||||
launchCommand.action = delegate
|
launchCommand.action = delegate
|
||||||
{
|
{
|
||||||
StartChoosingDestination();
|
var targetingParameters = new TargetingParameters
|
||||||
|
{
|
||||||
|
canTargetPawns = true,
|
||||||
|
canTargetBuildings = false,
|
||||||
|
mapObjectTargetsMustBeAutoAttackable = false,
|
||||||
|
validator = (TargetInfo target) =>
|
||||||
|
{
|
||||||
|
if (!target.HasThing) return false;
|
||||||
|
Pawn p = target.Thing as Pawn;
|
||||||
|
return p != null && p.IsColonistPlayerControlled && !p.Downed && !p.IsBurning();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Find.Targeter.BeginTargeting(targetingParameters, (LocalTargetInfo target) =>
|
||||||
|
{
|
||||||
|
Pawn pilot = target.Pawn;
|
||||||
|
if (pilot != null)
|
||||||
|
{
|
||||||
|
StartChoosingDestination(pilot);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
yield return launchCommand;
|
yield return launchCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartChoosingDestination()
|
public void StartChoosingDestination(Pawn pilot)
|
||||||
{
|
{
|
||||||
CameraJumper.TryJump(CameraJumper.GetWorldTarget(this.parent));
|
CameraJumper.TryJump(CameraJumper.GetWorldTarget(this.parent));
|
||||||
Find.WorldSelector.ClearSelection();
|
Find.WorldSelector.ClearSelection();
|
||||||
int tile = this.parent.Map.Tile;
|
int tile = this.parent.Map.Tile;
|
||||||
Find.WorldTargeter.BeginTargeting(ChoseWorldTarget, true, CompLaunchable.TargeterMouseAttachment, true, delegate
|
Find.WorldTargeter.BeginTargeting((GlobalTargetInfo t) => ChoseWorldTarget(t, pilot), true, CompLaunchable.TargeterMouseAttachment, true, delegate
|
||||||
{
|
{
|
||||||
GenDraw.DrawWorldRadiusRing(tile, this.Props.maxLaunchDistance);
|
GenDraw.DrawWorldRadiusRing(tile, this.Props.maxLaunchDistance);
|
||||||
}, (GlobalTargetInfo t) => "Select target tile");
|
}, (GlobalTargetInfo t) => "Select target tile");
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ChoseWorldTarget(GlobalTargetInfo t)
|
private bool ChoseWorldTarget(GlobalTargetInfo t, Pawn pilot)
|
||||||
{
|
{
|
||||||
if (!t.IsValid)
|
if (!t.IsValid)
|
||||||
{
|
{
|
||||||
@@ -70,33 +89,39 @@ namespace ArachnaeSwarm
|
|||||||
MapParent mapParent = Find.World.worldObjects.MapParentAt(t.Tile);
|
MapParent mapParent = Find.World.worldObjects.MapParentAt(t.Tile);
|
||||||
if (mapParent?.HasMap ?? false)
|
if (mapParent?.HasMap ?? false)
|
||||||
{
|
{
|
||||||
Deploy(mapParent, t);
|
Deploy(mapParent, pilot);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LongEventHandler.QueueLongEvent(delegate
|
LongEventHandler.QueueLongEvent(delegate
|
||||||
{
|
{
|
||||||
var newMap = GetOrGenerateMapUtility.GetOrGenerateMap(t.Tile, WorldObjectDefOf.Camp);
|
var newMap = GetOrGenerateMapUtility.GetOrGenerateMap(t.Tile, WorldObjectDefOf.Camp);
|
||||||
Deploy(newMap.Parent, t);
|
Deploy(newMap.Parent, pilot);
|
||||||
}, "GeneratingMap", doAsynchronously: false, null);
|
}, "GeneratingMap", doAsynchronously: false, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Deploy(MapParent mapParent, Pawn pilot)
|
||||||
|
|
||||||
private void Deploy(MapParent mapParent, GlobalTargetInfo t)
|
|
||||||
{
|
{
|
||||||
refuelableComp.ConsumeFuel(this.Props.fuelNeededToLaunch);
|
refuelableComp.ConsumeFuel(this.Props.fuelNeededToLaunch);
|
||||||
|
|
||||||
|
// 传送驾驶员
|
||||||
|
pilot.DeSpawn();
|
||||||
|
|
||||||
EffecterDefOf.Skip_Entry.Spawn(this.parent.Position, this.parent.Map);
|
EffecterDefOf.Skip_Entry.Spawn(this.parent.Position, this.parent.Map);
|
||||||
|
|
||||||
Building_WormholePortal_B portalB = (Building_WormholePortal_B)ThingMaker.MakeThing(ThingDef.Named("ARA_WormholePortal_B"));
|
Building_WormholePortal_B portalB = (Building_WormholePortal_B)ThingMaker.MakeThing(ThingDef.Named("ARA_WormholePortal_B"));
|
||||||
IntVec3 cell = DropCellFinder.RandomDropSpot(mapParent.Map);
|
IntVec3 cell = DropCellFinder.RandomDropSpot(mapParent.Map);
|
||||||
GenSpawn.Spawn(portalB, cell, mapParent.Map, WipeMode.Vanish);
|
GenSpawn.Spawn(portalB, cell, mapParent.Map, WipeMode.Vanish);
|
||||||
|
|
||||||
EffecterDefOf.Skip_Exit.Spawn(cell, mapParent.Map);
|
|
||||||
|
|
||||||
|
// 在B端生成驾驶员
|
||||||
|
IntVec3 pilotSpawnCell = CellFinder.RandomSpawnCellForPawnNear(portalB.Position, mapParent.Map, 5);
|
||||||
|
GenSpawn.Spawn(pilot, pilotSpawnCell, mapParent.Map, WipeMode.Vanish);
|
||||||
|
|
||||||
|
EffecterDefOf.Skip_Exit.Spawn(cell, mapParent.Map);
|
||||||
|
|
||||||
PortalA.SetLinkedPortal(portalB);
|
PortalA.SetLinkedPortal(portalB);
|
||||||
portalB.SetLinkedPortal(PortalA);
|
portalB.SetLinkedPortal(PortalA);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user