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 @@ -64,6 +64,8 @@ public void ChangeState(DungeonState state) {
}

player.Session.Dungeon.CompleteDungeon(clearTimestamp);
player.Session.ConditionUpdate(ConditionType.dungeon_clear,
codeLong: DungeonId);

}
}
Expand Down
34 changes: 18 additions & 16 deletions Maple2.Server.Game/Trigger/TriggerContext.Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -247,22 +247,24 @@ public bool QuestUserDetected(int[] boxIds, int[] questIds, int[] questStates, i
continue;
}

switch (questStates[0]) {
case 1: // Started
if (quest.State == QuestState.Started) {
return !negate;
}
break;
case 2: // Started and Can Complete
if (quest.State == QuestState.Started && player.Session.Quest.CanComplete(quest)) {
return !negate;
}
break;
case 3: // Completed
if (quest.State == QuestState.Completed) {
return !negate;
}
break;
foreach (int questState in questStates) {
switch (questState) {
case 1: // Started (but NOT ready to complete)
if (quest.State == QuestState.Started && !player.Session.Quest.CanComplete(quest)) {
return !negate;
}
break;
case 2: // Started and Can Complete
if (quest.State == QuestState.Started && player.Session.Quest.CanComplete(quest)) {
return !negate;
}
break;
case 3: // Completed
if (quest.State == QuestState.Completed) {
return !negate;
}
break;
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions Maple2.Server.Game/Util/ConditionUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ private static bool CheckCode(this ConditionMetadata.Parameters code, GameSessio
case ConditionType.quest_accept:
case ConditionType.quest_clear_by_chapter:
case ConditionType.quest_clear:
case ConditionType.dungeon_clear:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Search for dungeon_clear condition definitions in metadata to verify if Target parameters are used.

# Search for dungeon_clear references in XML/JSON metadata files
rg -i -C5 'dungeon_clear' --type=xml --type=json

# Also search in any condition/quest metadata files
fd -e xml -e json | xargs rg -l -i 'condition.*dungeon'

Repository: MS2Community/Maple2

Length of output: 47


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show relevant portions of ConditionUtil.cs around the referenced lines
FILE="Maple2.Server.Game/Util/ConditionUtil.cs"
echo "=== $FILE (around CheckCode / CheckTarget) ==="
nl -ba "$FILE" | sed -n '60,120p'
nl -ba "$FILE" | sed -n '260,360p'

# Broad search for dungeon_clear in code
echo "=== rg 'dungeon_clear' in repo ==="
rg -n --hidden --no-ignore -i 'dungeon_clear' .

# Search for ConditionType.dungeon_clear usage explicitly
echo "=== rg 'ConditionType\.dungeon_clear' in repo ==="
rg -n --hidden --no-ignore -i 'ConditionType\.dungeon_clear' .

# Safer metadata search (avoid xargs failure on empty input)
echo "=== metadata search for dungeon_clear in xml/json ==="
rg -n -C3 --hidden --no-ignore -i 'dungeon_clear' --type=xml --type=json . || true

echo "=== list files containing 'condition.*dungeon' for xml/json ==="
# Use fd to enumerate candidate files; only run rg if we actually find files.
CANDIDATES=$(fd --hidden --no-ignore -e xml -e json .)
if [ -n "$CANDIDATES" ]; then
  echo "$CANDIDATES" | xargs -r rg -l -i --no-heading 'condition.*dungeon' || true
else
  echo "No xml/json files found by fd (or fd returned nothing)."
fi

Repository: MS2Community/Maple2

Length of output: 206


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="Maple2.Server.Game/Util/ConditionUtil.cs"
echo "=== $FILE around CheckCode / CheckTarget ==="
awk 'NR>=60 && NR<=120 {printf "%6d\t%s\n", NR, $0}' "$FILE"
echo "=== $FILE around CheckTarget (260-360) ==="
awk 'NR>=260 && NR<=360 {printf "%6d\t%s\n", NR, $0}' "$FILE"

echo "=== rg 'dungeon_clear' in repo (limit output to hits) ==="
rg -n --hidden --no-ignore -i 'dungeon_clear' . | head -n 200

echo "=== rg 'ConditionType\\.dungeon_clear' in repo ==="
rg -n --hidden --no-ignore -i 'ConditionType\.dungeon_clear' . | head -n 200

echo "=== metadata search for dungeon_clear in xml/json ==="
# Avoid xargs empty-input issues by only running rg if we find candidates.
CANDIDATES=$(fd --hidden --no-ignore -e xml -e json .)
if [ -n "$CANDIDATES" ]; then
  echo "$CANDIDATES" | xargs -r rg -n -i -C2 'dungeon_clear' || true
else
  echo "No xml/json files found by fd."
fi

Repository: MS2Community/Maple2

Length of output: 9025


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="Maple2.Server.Game/Util/ConditionUtil.cs"

echo "=== method signature locations ==="
rg -n "CheckTarget|CheckCode" "$FILE"

echo "=== ConditionUtil.cs around CheckTarget definition ==="
# Print wider range around the first match to include signature + body
LINE_CHECKTARGET=$(rg -n "CheckTarget" "$FILE" | head -n1 | cut -d: -f1)
START=$((LINE_CHECKTARGET-60))
END=$((LINE_CHECKTARGET+160))
awk -v s=$START -v e=$END 'NR>=s && NR<=e {printf "%6d\t%s\n", NR, $0}' "$FILE"

echo "=== occurrences of .Target or Target in ConditionUtil.cs ==="
rg -n "\bTarget\b|\.Target\b" "$FILE" | head -n 200

echo "=== ConditionMetadata definition (search) ==="
rg -n "class ConditionMetadata|struct ConditionMetadata|ConditionMetadata" Maple2.Server.Game/Util/ConditionUtil.cs Maple2.Server.Game -S || true

echo "=== occurrences of CheckTarget call sites ==="
rg -n "CheckTarget\\(" Maple2.Server.Game -S || true

Repository: MS2Community/Maple2

Length of output: 18361


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="Maple2.Server.Game/Util/ConditionUtil.cs"

echo "=== CheckTarget full body (approx 160-340) ==="
awk 'NR>=160 && NR<=340 {printf "%6d\t%s\n", NR, $0}' "$FILE"

echo "=== lines with quest_clear / dungeon_clear inside ConditionUtil.cs ==="
rg -n "quest_clear|dungeon_clear" "$FILE"

echo "=== non-.cs occurrences of dungeon_clear in repo ==="
rg -n -i --glob '!*.cs' 'dungeon_clear' . | head -n 50 || true

echo "=== non-.cs occurrences of quest_clear in repo ==="
rg -n -i --glob '!*.cs' 'quest_clear' . | head -n 50 || true

Repository: MS2Community/Maple2

Length of output: 9629


Add ConditionType.dungeon_clear to CheckTarget

ConditionUtil.CheckCode includes case ConditionType.dungeon_clear:, but CheckTarget’s switch (conditionType) has no dungeon_clear case and falls back to return false (end of method). If a dungeon_clear condition provides Target parameters, ConditionUtil.Check evaluates target && code, so the condition can fail even when the code part matches (similar to how quest_clear is handled in CheckTarget).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Maple2.Server.Game/Util/ConditionUtil.cs` at line 89, The switch in
ConditionUtil.CheckTarget is missing a case for ConditionType.dungeon_clear
causing target-matching to always fall through to false; add a case
ConditionType.dungeon_clear in CheckTarget and implement the same
target-evaluation logic used for ConditionType.quest_clear so that when a
dungeon_clear condition provides Target parameters the method returns the
target-match result (allowing ConditionUtil.Check's "target && code" evaluation
to succeed when appropriate).

case ConditionType.buff:
case ConditionType.enchant_result:
case ConditionType.dialogue:
Expand Down
Loading