diff --git a/Client/Application/ViewModels/HeroSummaryInfoViewModel.cs b/Client/Application/ViewModels/HeroSummaryInfoViewModel.cs index 47f0d9b..a23411a 100644 --- a/Client/Application/ViewModels/HeroSummaryInfoViewModel.cs +++ b/Client/Application/ViewModels/HeroSummaryInfoViewModel.cs @@ -66,6 +66,14 @@ namespace Client.Application.ViewModels return 0; } } + + public CreatureListViewModel? Target + { + get + { + return target; + } + } public HeroSummaryInfoViewModel(Hero hero) { this.hero = hero; @@ -76,6 +84,24 @@ namespace Client.Application.ViewModels hero.Transform.PropertyChanged += Transform_PropertyChanged; hero.VitalStats.PropertyChanged += VitalStats_PropertyChanged; hero.InventoryInfo.PropertyChanged += InventoryInfo_PropertyChanged; + hero.PropertyChanged += Hero_PropertyChanged; + } + + private void Hero_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == "Target") + { + if (target == null && hero.Target != null) + { + target = new CreatureListViewModel(hero.Target, hero); + OnPropertyChanged("Target"); + } + else if (target != null && hero.Target == null) + { + target = null; + OnPropertyChanged("Target"); + } + } } private void InventoryInfo_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) @@ -109,5 +135,6 @@ namespace Client.Application.ViewModels } private readonly Hero hero; + private CreatureListViewModel? target; } } diff --git a/Client/Application/Views/MainWindow.xaml b/Client/Application/Views/MainWindow.xaml index 80e97ce..9f5cc80 100644 --- a/Client/Application/Views/MainWindow.xaml +++ b/Client/Application/Views/MainWindow.xaml @@ -97,9 +97,13 @@ - - - + + + + + + + @@ -109,53 +113,77 @@ + + + + Position: + Exp: + Weight: + Adena: + Inv. slots: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - Position: - Exp: - Weight: - Adena: - Inv. slots: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + Position: + Distance: + Delta Z: + + + + + + + + + + + + + + + + + diff --git a/Client/Bot.cs b/Client/Bot.cs index ee66314..602b007 100644 --- a/Client/Bot.cs +++ b/Client/Bot.cs @@ -9,6 +9,7 @@ using Client.Application.ViewModels; using Client.Domain.Events; using Client.Domain.Factories; using Client.Domain.Parsers; +using Client.Domain.Service; using Client.Domain.Transports; using Microsoft.Extensions.DependencyInjection; @@ -69,6 +70,13 @@ namespace Client eventBus.Subscrbe((EventHandlerInterface)viewModel); eventBus.Subscrbe((EventHandlerInterface)viewModel); eventBus.Subscrbe((EventHandlerInterface)viewModel); + eventBus.Subscrbe((EventHandlerInterface)viewModel); + eventBus.Subscrbe((EventHandlerInterface)viewModel); + eventBus.Subscrbe((EventHandlerInterface)viewModel); + + eventBus.Subscrbe((EventHandlerInterface)serviceProvider.GetRequiredService()); + eventBus.Subscrbe((EventHandlerInterface)serviceProvider.GetRequiredService()); + eventBus.Subscrbe((EventHandlerInterface)serviceProvider.GetRequiredService()); } private void OnMessage(string args) diff --git a/Client/Domain/Entities/Hero.cs b/Client/Domain/Entities/Hero.cs index addefe4..bcc80d4 100644 --- a/Client/Domain/Entities/Hero.cs +++ b/Client/Domain/Entities/Hero.cs @@ -1,29 +1,77 @@ -using Client.Domain.ValueObjects; +using Client.Domain.Common; +using Client.Domain.ValueObjects; +using System.ComponentModel; +using System.Diagnostics; namespace Client.Domain.Entities { - public class Hero : EntityInterface + public class Hero : NotifyPropertyChanged, EntityInterface, CreatureInterface { + private FullName fullName; + private Phenotype phenotype; + private CreatureInterface? target; + private uint targetId; + public uint Id { get; set; } public Transform Transform { get; set; } - public FullName FullName { get; set; } public VitalStats VitalStats { get; set; } - public Phenotype Phenotype { get; set; } public ExperienceInfo ExperienceInfo { get; set; } public PermanentStats PermanentStats { get; set; } public VariableStats VariableStats { get; set; } public Reputation Reputation { get; set; } public InventoryInfo InventoryInfo { get; set; } - public uint TargetId { get; set; } + public uint TargetId { get => targetId; set { if (value != targetId) { targetId = value; OnPropertyChanged("TargetId"); } } } + public CreatureInterface? Target { get => target; set { if (value != target) { target = value; OnPropertyChanged("Target"); } } } public bool IsStanding { get; set; } + public FullName FullName + { + get => fullName; + set + { + fullName = value; + if (fullName != null) + { + FullName.PropertyChanged += FullName_PropertyChanged; ; + } + } + } + + public Phenotype Phenotype + { + get => phenotype; + set + { + phenotype = value; + if (phenotype != null) + { + Phenotype.PropertyChanged += Phenotype_PropertyChanged; + } + } + } + + public string Name + { + get + { + return FullName.Nickname; + } + } + public string BriefInfo + { + get + { + //todo race and class strings + return Phenotype.Race.ToString() + ", " + Phenotype.Class.ToString(); + } + } public Hero(uint id, Transform transform, FullName fullName, VitalStats vitalStats, Phenotype phenotype, ExperienceInfo experienceInfo, PermanentStats permanentStats, VariableStats variableStats, Reputation reputation, InventoryInfo inventoryInfo, uint targetId, bool isStanding) { Id = id; Transform = transform; - FullName = fullName; + this.fullName = FullName = fullName; VitalStats = vitalStats; - Phenotype = phenotype; + this.phenotype = Phenotype = phenotype; ExperienceInfo = experienceInfo; PermanentStats = permanentStats; VariableStats = variableStats; @@ -32,5 +80,21 @@ namespace Client.Domain.Entities TargetId = targetId; IsStanding = isStanding; } + + private void Phenotype_PropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "Race" || e.PropertyName == "Class") + { + OnPropertyChanged("BriefInfo"); + } + } + + private void FullName_PropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "Nickname") + { + OnPropertyChanged("Name"); + } + } } } diff --git a/Client/Domain/Events/TargetChangedEvent.cs b/Client/Domain/Events/TargetChangedEvent.cs new file mode 100644 index 0000000..ea7b29d --- /dev/null +++ b/Client/Domain/Events/TargetChangedEvent.cs @@ -0,0 +1,19 @@ +using Client.Domain.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Client.Domain.Events +{ + public class TargetChangedEvent : EventInterface + { + public readonly Hero Hero; + + public TargetChangedEvent(Hero hero) + { + Hero = hero; + } + } +} diff --git a/Client/Domain/Service/EntityHandler.cs b/Client/Domain/Service/EntityHandler.cs index a9c9a04..92f9108 100644 --- a/Client/Domain/Service/EntityHandler.cs +++ b/Client/Domain/Service/EntityHandler.cs @@ -43,6 +43,15 @@ namespace Client.Domain.Service } } + public T? GetEntity(uint id) + { + T? result = null; + + entities.TryGetValue(id, out result); + + return result; + } + public virtual void OnCreate(T entity) { diff --git a/Client/Domain/Service/HeroHandler.cs b/Client/Domain/Service/HeroHandler.cs index 735da11..972726c 100644 --- a/Client/Domain/Service/HeroHandler.cs +++ b/Client/Domain/Service/HeroHandler.cs @@ -10,12 +10,13 @@ using System.Threading.Tasks; namespace Client.Domain.Service { - public class HeroHandler : EntityHandler + public class HeroHandler : EntityHandler, EventHandlerInterface { public override void OnCreate(Hero entity) { entity.ExperienceInfo.ExpToLevel = experienceHelper.GetExperienceToLevel(entity.ExperienceInfo.Level + 1); entity.ExperienceInfo.ExpToPrevLevel = experienceHelper.GetExperienceToLevel(entity.ExperienceInfo.Level); + entity.PropertyChanged += Hero_PropertyChanged; eventBus.Publish(new HeroCreatedEvent(entity)); } @@ -39,6 +40,31 @@ namespace Client.Domain.Service this.experienceHelper = experienceHelper; } + private void Hero_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (sender == null) + { + return; + } + + var hero = (Hero)sender; + if (e.PropertyName == "TargetId") + { + hero.Target = null; + eventBus.Publish(new TargetChangedEvent(hero)); + } + } + + public void Handle(TargetChangedEvent @event) + { + var target = GetEntity(@event.Hero.TargetId); + if (target == null) + { + return; + } + @event.Hero.Target = target; + } + private readonly EventBusInterface eventBus; private readonly ExperienceHelperInterface experienceHelper; } diff --git a/Client/Domain/Service/NpcHandler.cs b/Client/Domain/Service/NpcHandler.cs index 5af7ad6..419296b 100644 --- a/Client/Domain/Service/NpcHandler.cs +++ b/Client/Domain/Service/NpcHandler.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace Client.Domain.Service { - public class NpcHandler : EntityHandler + public class NpcHandler : EntityHandler, EventHandlerInterface { public override void OnCreate(NPC entity) { @@ -23,6 +23,16 @@ namespace Client.Domain.Service eventBus.Publish(new CreatureDeletedEvent(entity.Id)); } + public void Handle(TargetChangedEvent @event) + { + var target = GetEntity(@event.Hero.TargetId); + if (target == null) + { + return; + } + @event.Hero.Target = target; + } + public NpcHandler(EntityFactoryInterface factory, EventBusInterface eventBus, NpcInfoHelperInterface npcInfoHelper) : base(factory) { this.eventBus = eventBus; diff --git a/Client/Domain/Service/PlayerHandler.cs b/Client/Domain/Service/PlayerHandler.cs index 3be266c..1f2e37d 100644 --- a/Client/Domain/Service/PlayerHandler.cs +++ b/Client/Domain/Service/PlayerHandler.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace Client.Domain.Service { - public class PlayerHandler : EntityHandler + public class PlayerHandler : EntityHandler, EventHandlerInterface { public override void OnCreate(Player entity) { @@ -25,6 +25,16 @@ namespace Client.Domain.Service this.eventBus = eventBus; } + public void Handle(TargetChangedEvent @event) + { + var target = GetEntity(@event.Hero.TargetId); + if (target == null) + { + return; + } + @event.Hero.Target = target; + } + private readonly EventBusInterface eventBus; } }