Skip to content

Commit

Permalink
[Game] Some changes:
Browse files Browse the repository at this point in the history
Changes made in SpawnManager:
- moved the declaration of the pattern & regexp variable to the outer area outside the loop;
Changes made in AlertBehavior and BaseCombatBehavior:
- If the Npc is aggressive, then he targets the approaching enemy;
Changes made in DoodadFuncDevote:
- Now information about the progress of construction of objects is saved in the database #123
  • Loading branch information
NL0bP committed Jun 5, 2024
1 parent cf7c357 commit 2ffc376
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 30 deletions.
4 changes: 2 additions & 2 deletions AAEmu.Game/Core/Managers/World/SpawnManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,13 @@ public void AddNpcSpawner(NpcSpawner npcSpawner)
else
{
// TODO добавил список спавнеров // added a list of spawners
var pattern = $@"\b{Regex.Escape(npcSpawner.UnitId.ToString())}\b";
var regex = new Regex(pattern);
foreach (var id in npcSpawnerIds)
{
// в template.Name обычно должно присутствовать templateId для нашего Npc, по нему будем брать нужный spawnerId
// in template.Name there should usually be a templateId for our Npc, we will use it to take the required spawnerId
var template = NpcGameData.Instance.GetNpcSpawnerTemplate(id);
var pattern = $@"\b{Regex.Escape(npcSpawner.UnitId.ToString())}\b";
var regex = new Regex(pattern);
var containsId = regex.IsMatch(template.Name);
if (containsId)
{
Expand Down
57 changes: 57 additions & 0 deletions AAEmu.Game/Models/Game/AI/v2/Behaviors/BaseCombatBehavior.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,63 @@ protected bool ShouldReturn
}
}

/// <summary>
/// Target the approaching enemy
/// Выбираем приближающегося врага в цель
/// </summary>
/// <returns></returns>
public bool SetTarget()
{
// We might want to optimize this somehow.
var aggroList = Ai.Owner.AggroTable.Values;
var abusers = aggroList.OrderByDescending(o => o.TotalAggro).Select(o => o.Owner).ToList();

foreach (var abuser in abusers)
{
Ai.Owner.LookTowards(abuser.Transform.World.Position); // смотрим на врага

if (AppConfiguration.Instance.World.GeoDataMode && Ai.Owner.Transform.WorldId > 0)
{
// включена геодата и не основной мир
// geodata enabled and not the main world
if (Ai.Owner.UnitIsVisible(abuser) && !abuser.IsDead)
{
if (Ai.Owner.CurrentAggroTarget != abuser.ObjId && !Ai.AlreadyTargetted)
{
// TODO найдем путь к abuser
Ai.Owner.FindPath(abuser);
}
Ai.Owner.CurrentAggroTarget = abuser.ObjId;
Ai.Owner.SetTarget(abuser);
return true;
}
}
else
{
if (Ai.Owner.UnitIsVisible(abuser) && !abuser.IsDead)
{
// check that such an Npc is in the database, there are cases that it is in the game, but not in the database
var currentTarget = abuser.ObjId > 0 ? WorldManager.Instance.GetUnit(abuser.ObjId) : null;
if (currentTarget == null)
continue;

Ai.Owner.CurrentAggroTarget = abuser.ObjId;
Ai.Owner.SetTarget(abuser);
return true;
}
}
Ai.Owner.ClearAggroOfUnit(abuser);
}

Ai.Owner.SetTarget(null);
return false;
}

/// <summary>
/// Select the most suitable target based on the damage caused
/// Выберем наиболее подходящую цель по нанесенному повреждению
/// </summary>
/// <returns></returns>
public bool UpdateTarget()
{
// We might want to optimize this somehow.
Expand Down
19 changes: 1 addition & 18 deletions AAEmu.Game/Models/Game/AI/v2/Behaviors/Common/AlertBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;

using AAEmu.Commons.Utils;
using AAEmu.Game.Models.Game.Models;
using AAEmu.Game.Models.Game.Skills.Static;
using AAEmu.Game.Models.Game.Units;

namespace AAEmu.Game.Models.Game.AI.v2.Behaviors.Common;
Expand Down Expand Up @@ -33,26 +31,11 @@ public override void Tick(TimeSpan delta)
if (!_enter)
return; // not initialized yet Enter()

if (!UpdateTarget() || ShouldReturn) // проверим, что таблица abuser не пустая и назначим текущую цель
if (!SetTarget() || ShouldReturn) // проверим, что таблица abuser не пустая и назначим текущую цель
{
Ai.GoToReturn();
//Ai.GoToRunCommandSet();
return;
}

if (Ai.Owner.CurrentTarget == null)
return;

if (CanStrafe && !IsUsingSkill)
MoveInRange(Ai.Owner.CurrentTarget, delta);

if (!CanUseSkill)
return;

// Will delay for 150 Milliseconds to eliminate the hanging of the skill
if (!Ai.Owner.CheckInterval(Delay)) { return; }
var targetDist = Ai.Owner.GetDistanceTo(Ai.Owner.CurrentTarget);
PickSkillAndUseIt(SkillUseConditionKind.OnAlert, Ai.Owner.CurrentTarget, targetDist); // используем скиллы на врага
}

public override void Exit()
Expand Down
47 changes: 37 additions & 10 deletions AAEmu.Game/Models/Game/DoodadObj/Funcs/DoodadFuncDevote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,47 @@ public override void Use(BaseUnit caster, Doodad owner, uint skillId, int nextPh
return;
}

var currentCount = ResidentManager.Instance.GetResidentTokenCount(character);
currentCount += ItemCount;
ResidentManager.Instance.UpdateResidentTokenCount(character, currentCount);
// сохраним инфу о doodad.Data в базе
owner.Data += ItemCount;

if (currentCount >= Count)
// если это база на o_shining_shore_1 или o_shining_shore_2
if (character.Transform.ZoneId == 282 || character.Transform.ZoneId == 301)
{
currentCount = 0;
character.SendPacket(new SCDoodadChangedPacket(owner.ObjId, currentCount));
ResidentManager.Instance.UpdateDevelopmentStage(character);
owner.ToNextPhase = true;
return;
if (owner.Data >= Count)
{
owner.Data = 0;
SaveDoodadData(owner);
character.SendPacket(new SCDoodadChangedPacket(owner.ObjId, owner.Data));
owner.ToNextPhase = true;
return;
}
}
else
{
// если это Residents
ResidentManager.Instance.UpdateResidentTokenCount(character, owner.Data);
if (owner.Data >= Count)
{
owner.Data = 0;
SaveDoodadData(owner);
character.SendPacket(new SCDoodadChangedPacket(owner.ObjId, owner.Data));
ResidentManager.Instance.UpdateDevelopmentStage(character);
owner.ToNextPhase = true;
return;
}
}

character.SendPacket(new SCDoodadChangedPacket(owner.ObjId, currentCount));
SaveDoodadData(owner);
character.SendPacket(new SCDoodadChangedPacket(owner.ObjId, owner.Data));
owner.ToNextPhase = false;
}

private static void SaveDoodadData(Doodad owner)
{
var persistent = owner.IsPersistent;
if (!owner.IsPersistent)
owner.IsPersistent = true;
owner.Save();
owner.IsPersistent = persistent;
}
}

0 comments on commit 2ffc376

Please sign in to comment.