3 using Microsoft.Xna.Framework;
4 using Microsoft.Xna.Framework.Graphics;
6 using System.Collections.Generic;
9 using System.Threading.Tasks;
10 using System.Xml.Linq;
14 partial class RepairTool
20 public Vector2 DrawSize
22 get {
return GameMain.DebugDraw ? Vector2.One *
Range : Vector2.Zero; }
26 private readonly List<ParticleEmitter> particleEmitters =
new List<ParticleEmitter>();
27 private readonly List<ParticleEmitter> particleEmitterHitStructure =
new List<ParticleEmitter>();
28 private readonly List<ParticleEmitter> particleEmitterHitCharacter =
new List<ParticleEmitter>();
29 private readonly List<(RelatedItem relatedItem,
ParticleEmitter emitter)> particleEmitterHitItem =
new List<(RelatedItem relatedItem,
ParticleEmitter emitter)>();
31 private float prevProgressBarState;
32 private Item prevProgressBarTarget =
null;
34 partial
void InitProjSpecific(ContentXElement element)
36 foreach (var subElement
in element.Elements())
38 switch (subElement.Name.ToString().ToLowerInvariant())
40 case "particleemitter":
43 case "particleemitterhititem":
44 Identifier[] identifiers = subElement.GetAttributeIdentifierArray(
"identifiers", Array.Empty<Identifier>());
45 if (identifiers.Length == 0) { identifiers = subElement.GetAttributeIdentifierArray(
"identifier", Array.Empty<Identifier>()); }
46 Identifier[] excludedIdentifiers = subElement.GetAttributeIdentifierArray(
"excludedidentifiers", Array.Empty<Identifier>());
47 if (excludedIdentifiers.Length == 0) { excludedIdentifiers = subElement.GetAttributeIdentifierArray(
"excludedidentifier", Array.Empty<Identifier>()); }
49 particleEmitterHitItem.Add((
new RelatedItem(identifiers, excludedIdentifiers),
new ParticleEmitter(subElement)));
51 case "particleemitterhitstructure":
54 case "particleemitterhitcharacter":
62 partial
void UseProjSpecific(
float deltaTime, Vector2 raystart)
72 deltaTime, ConvertUnits.ToDisplayUnits(raystart),
77 partial
void FixStructureProjSpecific(Character user,
float deltaTime, Structure targetStructure,
int sectionIndex)
79 Vector2 progressBarPos = targetStructure.SectionPosition(sectionIndex);
80 if (targetStructure.Submarine !=
null)
82 progressBarPos += targetStructure.Submarine.DrawPosition;
85 var progressBar = user.UpdateHUDProgressBar(
86 targetStructure.ID * 1000 + sectionIndex,
88 MathUtils.InverseLerp(targetStructure.Prefab.MinHealth, targetStructure.Health, targetStructure.Health - targetStructure.SectionDamage(sectionIndex)),
89 GUIStyle.Red, GUIStyle.Green);
91 if (progressBar !=
null) progressBar.Size =
new Vector2(60.0f, 20.0f);
93 Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition);
94 if (targetStructure.Submarine !=
null) particlePos += targetStructure.Submarine.DrawPosition;
95 foreach (var emitter
in particleEmitterHitStructure)
98 emitter.Emit(deltaTime, particlePos,
item.
CurrentHull, particleAngle + MathHelper.Pi, -particleAngle + MathHelper.Pi);
102 partial
void FixCharacterProjSpecific(Character user,
float deltaTime, Character targetCharacter)
104 Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition);
105 if (targetCharacter.Submarine !=
null) particlePos += targetCharacter.Submarine.DrawPosition;
106 foreach (var emitter
in particleEmitterHitCharacter)
109 emitter.Emit(deltaTime, particlePos,
item.
CurrentHull, particleAngle + MathHelper.Pi, -particleAngle + MathHelper.Pi);
113 partial
void FixItemProjSpecific(Character user,
float deltaTime,
Item targetItem,
bool showProgressBar)
117 float progressBarState = targetItem.ConditionPercentage / 100.0f;
118 if (!MathUtils.NearlyEqual(progressBarState, prevProgressBarState) || prevProgressBarTarget != targetItem)
120 var door = targetItem.GetComponent<
Door>();
121 if (door ==
null || door.Stuck <= 0)
123 Vector2 progressBarPos = targetItem.DrawPosition;
124 var progressBar = user?.UpdateHUDProgressBar(
128 GUIStyle.Red, GUIStyle.Green,
129 progressBarState < prevProgressBarState ?
"progressbar.cutting" :
"");
130 if (progressBar !=
null) { progressBar.Size =
new Vector2(60.0f, 20.0f); }
132 prevProgressBarState = progressBarState;
133 prevProgressBarTarget = targetItem;
137 Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition);
138 if (targetItem.Submarine !=
null) particlePos += targetItem.Submarine.DrawPosition;
139 foreach ((RelatedItem relatedItem,
ParticleEmitter emitter) in particleEmitterHitItem)
141 if (!relatedItem.MatchesItem(targetItem)) {
continue; }
143 emitter.
Emit(deltaTime, particlePos,
item.
CurrentHull, particleAngle + MathHelper.Pi, -particleAngle + MathHelper.Pi);
147 public void Draw(SpriteBatch spriteBatch,
bool editing,
float itemDepth = -1, Color? overrideColor =
null)
151 GUI.DrawLine(spriteBatch,
152 new Vector2(debugRayStartPos.X, -debugRayStartPos.Y),
153 new Vector2(debugRayEndPos.X, -debugRayEndPos.Y),
154 Color.Yellow, width: 3f);
readonly ParticleEmitterPrefab Prefab
void Emit(float deltaTime, Vector2 position, Hull? hullGuess=null, float angle=0.0f, float particleRotation=0.0f, float velocityMultiplier=1.0f, float sizeMultiplier=1.0f, float amountMultiplier=1.0f, Color? colorMultiplier=null, ParticlePrefab? overrideParticle=null, bool mirrorAngle=false, Tuple< Vector2, Vector2 >? tracerPoints=null)
readonly ParticleEmitterProperties Properties