Skip to content

Commit 8b9cecf

Browse files
authored
feature: adds new event triggers to items (AscensionGameDev#2208)
* feat: (Day) Add new item event triggers and update editor; no migration yet * feat: (Day) Add event triggers for new item events * feat: Migrations done * feat: (Day) Extend on-hit event trigger on items to other equipment * fix: (Day) Update to use a dictionary instead of many different fields for event triggers * fix: code comments * fix: (Day) Issue where updating an item's triggers wouldn't recache the triggers on the player * fix: (Day) Fix issue where mana costs would proc infinite loop
1 parent 60d6a35 commit 8b9cecf

File tree

12 files changed

+2136
-21
lines changed

12 files changed

+2136
-21
lines changed

Intersect (Core)/GameObjects/Events/Enums.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,15 @@ public enum FadeType
246246
FadeIn,
247247
FadeOut,
248248
}
249+
250+
public enum ItemEventTriggers
251+
{
252+
OnPickup = 0,
253+
OnDrop,
254+
OnUse,
255+
OnEquip,
256+
OnUnequip,
257+
OnHit,
258+
OnDamageReceived
259+
}
249260
}

Intersect (Core)/GameObjects/ItemBase.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,26 @@ public string EffectsJson
342342
[NotMapped, JsonIgnore]
343343
public ItemRange[] StatRanges => EquipmentProperties?.StatRanges?.Values.ToArray();
344344

345+
[Column(nameof(EventTriggers))]
346+
public string EventTriggersJson
347+
{
348+
get => JsonConvert.SerializeObject(EventTriggers);
349+
set => EventTriggers = JsonConvert.DeserializeObject<Dictionary<ItemEventTriggers, Guid>>(value ?? string.Empty) ?? new Dictionary<ItemEventTriggers, Guid>();
350+
}
351+
352+
public EventBase? GetEventTrigger(ItemEventTriggers eventTrigger)
353+
{
354+
if (!EventTriggers.TryGetValue(eventTrigger, out var trigger))
355+
{
356+
return null;
357+
}
358+
359+
return EventBase.Get(trigger);
360+
}
361+
362+
[NotMapped, JsonIgnore]
363+
public Dictionary<ItemEventTriggers, Guid> EventTriggers { get; set; } = new Dictionary<ItemEventTriggers, Guid>();
364+
345365
public bool TryGetRangeFor(Stat stat, out ItemRange range)
346366
{
347367
range = null;

Intersect.Editor/Forms/Editors/frmItem.Designer.cs

Lines changed: 78 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Intersect.Editor/Forms/Editors/frmItem.cs

Lines changed: 105 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Drawing.Imaging;
55
using System.Linq;
66
using System.Windows.Forms;
7-
87
using DarkUI.Forms;
98

109
using Intersect.Editor.Content;
@@ -143,9 +142,16 @@ private void frmItem_Load(object sender, EventArgs e)
143142
cmbTeachSpell.Items.Clear();
144143
cmbTeachSpell.Items.Add(Strings.General.None);
145144
cmbTeachSpell.Items.AddRange(SpellBase.Names);
146-
cmbEvent.Items.Clear();
147-
cmbEvent.Items.Add(Strings.General.None);
148-
cmbEvent.Items.AddRange(EventBase.Names);
145+
146+
var events = EventBase.Names;
147+
var eventElements = new List<ComboBox>() { cmbEvent, cmbEventTriggers };
148+
foreach (var element in eventElements)
149+
{
150+
element.Items.Clear();
151+
element.Items.Add(Strings.General.None);
152+
element.Items.AddRange(events);
153+
}
154+
149155
cmbMalePaperdoll.Items.Clear();
150156
cmbMalePaperdoll.Items.Add(Strings.General.None);
151157
cmbFemalePaperdoll.Items.Clear();
@@ -225,6 +231,9 @@ private void InitLocalization()
225231
cmbRarity.Items.Add(Strings.ItemEditor.rarity[rarityName]);
226232
}
227233

234+
grpEvents.Text = Strings.ItemEditor.EventGroup;
235+
lblEventForTrigger.Text = Strings.ItemEditor.EventGroupLabel;
236+
228237
grpEquipment.Text = Strings.ItemEditor.equipment;
229238
lblEquipmentSlot.Text = Strings.ItemEditor.slot;
230239
grpStatBonuses.Text = Strings.ItemEditor.bonuses;
@@ -540,6 +549,53 @@ private void RefreshExtendedData()
540549
}
541550

542551
mEditorItem.ItemType = (ItemType)cmbType.SelectedIndex;
552+
553+
PopulateEventTriggerList();
554+
}
555+
556+
private void PopulateEventTriggerList(int lastIndex = -1)
557+
{
558+
lstEventTriggers.Items.Clear();
559+
lstEventTriggers.SelectedIndex = -1;
560+
561+
// Some event triggers aren't valid for some item types - setup filters here
562+
var invalidNonEquipOperations = new List<ItemEventTriggers>() { ItemEventTriggers.OnEquip, ItemEventTriggers.OnUnequip, ItemEventTriggers.OnHit, ItemEventTriggers.OnDamageReceived };
563+
564+
var invalidEventOperations = new List<ItemEventTriggers>() { ItemEventTriggers.OnUse };
565+
invalidEventOperations.AddRange(invalidNonEquipOperations);
566+
567+
foreach (var triggerMapping in Strings.ItemEditor.EventTriggerSelections)
568+
{
569+
var trigger = triggerMapping.Key;
570+
var triggerText = triggerMapping.Value;
571+
572+
Strings.ItemEditor.EventTriggerNames.TryGetValue(trigger, out var triggerName);
573+
if (string.IsNullOrEmpty(triggerName))
574+
{
575+
triggerName = EventBase.Deleted;
576+
}
577+
578+
var evt = mEditorItem.GetEventTrigger(trigger);
579+
580+
if (mEditorItem.ItemType == ItemType.Event && invalidEventOperations.Contains(triggerMapping.Key))
581+
{
582+
lstEventTriggers.Items.Add(Strings.ItemEditor.EventTriggerDisabled.ToString(triggerName));
583+
continue;
584+
}
585+
586+
if (mEditorItem.ItemType != ItemType.Equipment && invalidNonEquipOperations.Contains(triggerMapping.Key))
587+
{
588+
lstEventTriggers.Items.Add(Strings.ItemEditor.EventTriggerDisabled.ToString(triggerName));
589+
continue;
590+
}
591+
592+
lstEventTriggers.Items.Add(triggerText.ToString(evt?.Name ?? Strings.General.None));
593+
}
594+
595+
if (lastIndex < lstEventTriggers.Items.Count && lastIndex != -1)
596+
{
597+
lstEventTriggers.SelectedIndex = lastIndex;
598+
}
543599
}
544600

545601
private void cmbType_SelectedIndexChanged(object sender, EventArgs e)
@@ -1345,7 +1401,7 @@ private string GetStatRangeRowText(Stat stat, LocalizedString? statName = null)
13451401
{
13461402
statName = Strings.General.None;
13471403
}
1348-
1404+
13491405
mEditorItem.TryGetRangeFor(stat, out var range);
13501406
return Strings.ItemEditor.StatRangeItem.ToString(statName, range?.LowRange ?? 0, range?.HighRange ?? 0);
13511407
}
@@ -1372,6 +1428,11 @@ private Stat? SelectedStatRange
13721428
get => Enum.IsDefined((Stat)lstStatRanges.SelectedIndex) ? (Stat)(lstStatRanges.SelectedIndex) : null;
13731429
}
13741430

1431+
private ItemEventTriggers? SelectedEventTrigger
1432+
{
1433+
get => Enum.IsDefined((ItemEventTriggers)lstEventTriggers.SelectedIndex) ? (ItemEventTriggers)(lstEventTriggers.SelectedIndex) : null;
1434+
}
1435+
13751436
private void lstBonusEffects_SelectedIndexChanged(object sender, EventArgs e)
13761437
{
13771438
if (!IsValidBonusSelection)
@@ -1443,6 +1504,45 @@ private void lstStatRanges_SelectedIndexChanged(object sender, EventArgs e)
14431504
nudStatRangeLow.Value = range.LowRange;
14441505
nudStatRangeHigh.Value = range.HighRange;
14451506
}
1507+
1508+
private void lstEventTriggers_SelectedIndexChanged(object sender, EventArgs e)
1509+
{
1510+
var triggerSelected = lstEventTriggers.SelectedIndex >= 0;
1511+
cmbEventTriggers.Enabled = triggerSelected;
1512+
1513+
if (!SelectedEventTrigger.HasValue)
1514+
{
1515+
if (cmbEventTriggers.Items.Count > 0)
1516+
{
1517+
cmbEventTriggers.SelectedIndex = 0;
1518+
}
1519+
return;
1520+
}
1521+
1522+
var trigger = mEditorItem.GetEventTrigger(SelectedEventTrigger.Value);
1523+
if (trigger == null)
1524+
{
1525+
if (cmbEventTriggers.Items.Count > 0)
1526+
{
1527+
cmbEventTriggers.SelectedIndex = 0;
1528+
}
1529+
return;
1530+
}
1531+
1532+
cmbEventTriggers.SelectedIndex = EventBase.ListIndex(trigger.Id) + 1;
1533+
}
1534+
1535+
private void cmbEventTriggers_SelectedIndexChanged(object sender, EventArgs e)
1536+
{
1537+
if (!SelectedEventTrigger.HasValue)
1538+
{
1539+
return;
1540+
}
1541+
1542+
mEditorItem.EventTriggers[SelectedEventTrigger.Value] = EventBase.IdFromList(cmbEventTriggers.SelectedIndex - 1);
1543+
1544+
PopulateEventTriggerList(lstEventTriggers.SelectedIndex);
1545+
}
14461546
}
14471547

14481548
}

Intersect.Editor/Localization/Strings.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3737,6 +3737,37 @@ public partial struct ItemEditor
37373737

37383738
public static LocalizedString Event = @"Event:";
37393739

3740+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
3741+
public static LocalizedString EventGroup = @"Event Triggers";
3742+
3743+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
3744+
public static LocalizedString EventGroupLabel = @"Event";
3745+
3746+
public static Dictionary<ItemEventTriggers, LocalizedString> EventTriggerNames = new Dictionary<ItemEventTriggers, LocalizedString>
3747+
{
3748+
{ItemEventTriggers.OnPickup, @"On Pickup"},
3749+
{ItemEventTriggers.OnDrop, @"On Drop"},
3750+
{ItemEventTriggers.OnUse, @"On Use"},
3751+
{ItemEventTriggers.OnEquip, @"On Equip"},
3752+
{ItemEventTriggers.OnUnequip, @"On Unequip"},
3753+
{ItemEventTriggers.OnHit, @"On Hit"},
3754+
{ItemEventTriggers.OnDamageReceived, @"On Damage Received"},
3755+
};
3756+
3757+
public static Dictionary<ItemEventTriggers, LocalizedString> EventTriggerSelections = new Dictionary<ItemEventTriggers, LocalizedString>
3758+
{
3759+
{ItemEventTriggers.OnPickup, @"On Pickup: {00}"},
3760+
{ItemEventTriggers.OnDrop, @"On Drop: {00}"},
3761+
{ItemEventTriggers.OnUse, @"On Use: {00}"},
3762+
{ItemEventTriggers.OnEquip, @"On Equip: {00}"},
3763+
{ItemEventTriggers.OnUnequip, @"On Unequip: {00}"},
3764+
{ItemEventTriggers.OnHit, @"On Hit: {00}"},
3765+
{ItemEventTriggers.OnDamageReceived, @"On Damage Received: {00}"},
3766+
};
3767+
3768+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
3769+
public static LocalizedString EventTriggerDisabled = @"'{00}' trigger is disabled for this item type";
3770+
37403771
public static LocalizedString eventpanel = @"Event";
37413772

37423773
public static LocalizedString femalepaperdoll = @"Female Paperdoll:";

Intersect.Server.Core/Database/DbInterface.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,11 @@ private static void LoadGameObjects(GameObjectType gameObjectType)
764764

765765
break;
766766
case GameObjectType.Item:
767-
foreach (var itm in context.Items.Include(i => i.EquipmentProperties))
767+
768+
var loadedItems = context.Items
769+
.Include(i => i.EquipmentProperties);
770+
771+
foreach (var itm in loadedItems)
768772
{
769773
ItemBase.Lookup.Set(itm.Id, itm);
770774
}

0 commit comments

Comments
 (0)