Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ public partial class MovementState {
public class NpcStandbyTask : NpcTask {
private readonly MovementState movement;
public IActor? Target { get; init; }
public string Sequence { get; init; } = string.Empty;
public bool IsIdle { get; init; }
private string Sequence { get; init; }
private bool IsIdle { get; init; }
public override bool CancelOnInterrupt => true;

public NpcStandbyTask(TaskState taskState, MovementState movement, string sequence, NpcTaskPriority priority, bool isIdle) : base(taskState, priority) {
this.movement = movement;
Sequence = sequence;
IsIdle = isIdle;
}

protected override void TaskResumed() {
Expand Down
8 changes: 4 additions & 4 deletions Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public short SequenceId {
public readonly AnimationSequenceMetadata? JumpSequence;
public readonly AnimationSequenceMetadata? WalkSequence;
public readonly AnimationSequenceMetadata? FlySequence;
public readonly AnimationSequenceMetadata? SpawnSequence;
public readonly string? SpawnAnimation;
private readonly WeightedSet<string> defaultRoutines;
public readonly AiState AiState;
public readonly MovementState MovementState;
Expand All @@ -100,7 +100,7 @@ public FieldNpc(FieldManager field, int objectId, DtCrowdAgent? agent, Npc npc,
JumpSequence = npc.Animations.GetValueOrDefault("Jump_A") ?? npc.Animations.GetValueOrDefault("Jump_B");
WalkSequence = npc.Animations.GetValueOrDefault("Walk_A");
FlySequence = npc.Animations.GetValueOrDefault("Fly_A");
SpawnSequence = npc.Animations.GetValueOrDefault(spawnAnimation);
SpawnAnimation = spawnAnimation;
defaultRoutines = new WeightedSet<string>();
foreach (NpcAction action in Value.Metadata.Action.Actions) {
defaultRoutines.Add(action.Name, action.Probability);
Expand Down Expand Up @@ -250,7 +250,7 @@ public override void KeyframeEvent(string keyName) {
if (!Value.Animations.TryGetValue(routineName, out AnimationSequenceMetadata? animationSequence)) {
break;
}
return MovementState.TryEmote(animationSequence.Name, SpawnSequence is not null);
return MovementState.TryEmote(animationSequence.Name, SpawnAnimation is not null);
}

Logger.Warning("Unhandled routine: {Routine} for npc {NpcId}", routineName, Value.Metadata.Id);
Expand Down Expand Up @@ -337,7 +337,7 @@ public virtual void Animate(string sequenceName, float duration = -1f) {
}

public void Talk() {
if (SpawnSequence is not null) {
if (SpawnAnimation is not null) {
return;
}
idleTask = MovementState.TryTalk();
Expand Down
10 changes: 7 additions & 3 deletions Maple2.Server.Game/Trigger/TriggerContext.Npc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public void ChangeMonster(int removeSpawnId, int addSpawnId) {
public void SpawnMonster(int[] spawnIds, bool spawnAnimation, int arg3) {
WarnLog("[CreateMonster] spawnIds:{SpawnIds}, spawnAnimation:{SpawnAnimation}, arg3:{Arg3}", string.Join(", ", spawnIds), spawnAnimation, arg3);
foreach (int spawnId in spawnIds) {
SpawnNpc(spawnId);
SpawnNpc(spawnId, spawnAnimation);
}
}

Expand Down Expand Up @@ -277,7 +277,7 @@ private IEnumerable<FieldNpc> NpcsInBox(params int[] boxIds) {
return Field.EnumerateNpcs().Where(mob => boxes.Any(box => box.Contains(mob.Position)));
}

private void SpawnNpc(int spawnId) {
private void SpawnNpc(int spawnId, bool useSpawnAnimation = false) {
if (!Field.Entities.EventNpcSpawns.TryGetValue(spawnId, out EventSpawnPointNPC? spawn)) {
logger.Error("[SpawnNpc] Invalid spawnId:{SpawnId}", spawnId);
return;
Expand All @@ -290,7 +290,11 @@ private void SpawnNpc(int spawnId) {
}

for (int i = 0; i < entry.Count; i++) {
FieldNpc? fieldNpc = Field.SpawnNpc(npc, spawn.Position, spawn.Rotation, spawnAnimation: spawn.SpawnAnimation);
string spawnAnimationString = string.Empty;
if (!string.IsNullOrEmpty(spawn.SpawnAnimation) && useSpawnAnimation) {
spawnAnimationString = spawn.SpawnAnimation;
}
FieldNpc? fieldNpc = Field.SpawnNpc(npc, spawn.Position, spawn.Rotation, spawnAnimation: spawnAnimationString);
if (fieldNpc == null) {
logger.Error("[SpawnNpc] Failed to spawn npcId:{NpcId}", entry.NpcId);
continue;
Expand Down