Skip to content

Commit 2fff601

Browse files
committed
Various MonsterAI fixes & GM commands
1 parent 7a1bfb1 commit 2fff601

File tree

6 files changed

+132
-35
lines changed

6 files changed

+132
-35
lines changed
76 Bytes
Binary file not shown.

Zolian.Server.Base/CommandSystem/Commander.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Darkages.Database;
2+
using Darkages.Enums;
23
using Darkages.GameScripts.Formulas;
34
using Darkages.Network.Client;
45
using Darkages.Network.Server;
@@ -427,7 +428,7 @@ private static void OnSexChange(object? ctx, ParsedArgs args)
427428
if (player != null)
428429
player.Gender = (Gender)sResult;
429430

430-
client.ClientRefreshed();
431+
player.SendTargetedClientMethod(PlayerScope.NearbyAislings, c => c.ClientRefreshed());
431432
ServerSetup.EventsLogger($"{client.RemoteIp} used GM Command -Sex Change- on character: {client.Aisling.Username}");
432433
}
433434

@@ -457,16 +458,29 @@ private static void OnMonsterSummon(object? ctx, ParsedArgs args)
457458
var who = args.GetString(0);
458459
var amount = args.GetInt32Or(1, 1);
459460
if (amount <= 0) amount = 1;
461+
var summoned = 0;
460462

461463
for (var i = 0; i < amount; i++)
462464
{
463465
if (!ServerSetup.Instance.GlobalMonsterTemplateCache.TryGetValue(who, out var summon) || summon is null)
464466
return;
465467

466-
Monster.CreateFromTemplate(summon, client.Aisling.Map);
468+
var mob = Monster.Create(summon, client.Aisling.Map);
469+
if (mob != null)
470+
{
471+
ObjectManager.AddObject(mob);
472+
summoned++;
473+
}
474+
}
475+
476+
if (summoned == 0)
477+
{
478+
client.SendServerMessage(ServerMessageType.ActiveMessage, $"Failed to summon monster: {who}");
479+
return;
467480
}
468481

469-
ServerSetup.EventsLogger($"{client.RemoteIp} used GM Command -Summon Monster- on character: {client.Aisling.Username}");
482+
client.Aisling.SendTargetedClientMethod(PlayerScope.NearbyAislings, c => c.SendServerMessage(ServerMessageType.ActiveMessage, $"Death Summoned: {who} x{summoned}"));
483+
ServerSetup.EventsLogger($"{client.RemoteIp} used GM Command -Summon Monster- {who} x{summoned}");
470484
}
471485

472486
private static void OnRemoteGroup(object? ctx, ParsedArgs args)

Zolian.Server.Base/GameScripts/Monsters/AdvancedMonsterAI.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,7 +1749,9 @@ public override void Update(TimeSpan elapsedTime)
17491749
if (Monster.IsVulnerable || Monster.IsPoisoned)
17501750
{
17511751
var pos = Monster.Pos;
1752-
Monster.SendAnimationNearby(75, new Position(pos));
1752+
var diceRoll = Generator.RandNumGen100();
1753+
if (diceRoll >= 80)
1754+
Monster.SendAnimationNearby(75, new Position(pos));
17531755

17541756
foreach (var debuff in Monster.Debuffs.Values)
17551757
debuff?.OnEnded(Monster, debuff);
@@ -2053,7 +2055,9 @@ public override void Update(TimeSpan elapsedTime)
20532055
if (_vulnerabilityWatch.Elapsed.TotalMilliseconds > 1000)
20542056
{
20552057
var pos = Monster.Pos;
2056-
Monster.SendAnimationNearby(75, new Position(pos));
2058+
var diceRoll = Generator.RandNumGen100();
2059+
if (diceRoll >= 80)
2060+
Monster.SendAnimationNearby(75, new Position(pos));
20572061

20582062
foreach (var debuff in Monster.Debuffs.Values)
20592063
debuff?.OnEnded(Monster, debuff);
@@ -2351,7 +2355,9 @@ public override void Update(TimeSpan elapsedTime)
23512355
if (Monster.IsVulnerable || Monster.IsPoisoned)
23522356
{
23532357
var pos = Monster.Pos;
2354-
Monster.SendAnimationNearby(75, new Position(pos));
2358+
var diceRoll = Generator.RandNumGen100();
2359+
if (diceRoll >= 80)
2360+
Monster.SendAnimationNearby(75, new Position(pos));
23552361

23562362
foreach (var debuff in Monster.Debuffs.Values)
23572363
debuff?.OnEnded(Monster, debuff);

Zolian.Server.Base/GameScripts/Monsters/BossMonsterAI.cs

Lines changed: 103 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Darkages.Enums;
55
using Darkages.Network.Client;
66
using Darkages.Network.Server;
7+
using Darkages.Object;
78
using Darkages.ScriptingBase;
89
using Darkages.Sprites;
910
using Darkages.Sprites.Entity;
@@ -49,7 +50,9 @@ public override void Update(TimeSpan elapsedTime)
4950
if (Monster.IsVulnerable || Monster.IsPoisoned)
5051
{
5152
var pos = Monster.Pos;
52-
Monster.SendAnimationNearby(75, new Position(pos));
53+
var diceRoll = Generator.RandNumGen100();
54+
if (diceRoll >= 80)
55+
Monster.SendAnimationNearby(75, new Position(pos));
5356

5457
foreach (var debuff in Monster.Debuffs.Values)
5558
debuff?.OnEnded(Monster, debuff);
@@ -344,7 +347,9 @@ public override void Update(TimeSpan elapsedTime)
344347
if (Monster.IsVulnerable || Monster.IsPoisoned)
345348
{
346349
var pos = Monster.Pos;
347-
Monster.SendAnimationNearby(75, new Position(pos));
350+
var diceRoll = Generator.RandNumGen100();
351+
if (diceRoll >= 80)
352+
Monster.SendAnimationNearby(75, new Position(pos));
348353

349354
foreach (var debuff in Monster.Debuffs.Values)
350355
debuff?.OnEnded(Monster, debuff);
@@ -643,7 +648,9 @@ public override void Update(TimeSpan elapsedTime)
643648
if (Monster.IsVulnerable || Monster.IsPoisoned)
644649
{
645650
var pos = Monster.Pos;
646-
Monster.SendAnimationNearby(75, new Position(pos));
651+
var diceRoll = Generator.RandNumGen100();
652+
if (diceRoll >= 80)
653+
Monster.SendAnimationNearby(75, new Position(pos));
647654

648655
foreach (var debuff in Monster.Debuffs.Values)
649656
debuff?.OnEnded(Monster, debuff);
@@ -669,9 +676,24 @@ private void UpdatePhases()
669676
var foundB = templates.TryGetValue(t => t.Name == "SnowmanB", out var templateB);
670677
var foundC = templates.TryGetValue(t => t.Name == "SnowmanC", out var templateC);
671678

672-
if (foundA) Monster.CreateFromTemplate(templateA, Monster.Map);
673-
if (foundB) Monster.CreateFromTemplate(templateB, Monster.Map);
674-
if (foundC) Monster.CreateFromTemplate(templateC, Monster.Map);
679+
if (foundA)
680+
{
681+
var mob1 = Monster.Create(templateA, Monster.Map);
682+
if (mob1 is not null)
683+
ObjectManager.AddObject(mob1);
684+
}
685+
if (foundB)
686+
{
687+
var mob2 = Monster.Create(templateB, Monster.Map);
688+
if (mob2 is not null)
689+
ObjectManager.AddObject(mob2);
690+
}
691+
if (foundC)
692+
{
693+
var mob3 = Monster.Create(templateC, Monster.Map);
694+
if (mob3 is not null)
695+
ObjectManager.AddObject(mob3);
696+
}
675697

676698
_phaseOne = true;
677699
}
@@ -687,11 +709,36 @@ private void UpdatePhases()
687709
var foundD = templates.TryGetValue(t => t.Name == "SnowmanD", out var templateD);
688710
var foundE = templates.TryGetValue(t => t.Name == "SnowmanE", out var templateE);
689711

690-
if (foundA) Monster.CreateFromTemplate(templateA, Monster.Map);
691-
if (foundB) Monster.CreateFromTemplate(templateB, Monster.Map);
692-
if (foundC) Monster.CreateFromTemplate(templateC, Monster.Map);
693-
if (foundD) Monster.CreateFromTemplate(templateD, Monster.Map);
694-
if (foundE) Monster.CreateFromTemplate(templateE, Monster.Map);
712+
if (foundA)
713+
{
714+
var mob1 = Monster.Create(templateA, Monster.Map);
715+
if (mob1 is not null)
716+
ObjectManager.AddObject(mob1);
717+
}
718+
if (foundB)
719+
{
720+
var mob2 = Monster.Create(templateB, Monster.Map);
721+
if (mob2 is not null)
722+
ObjectManager.AddObject(mob2);
723+
}
724+
if (foundC)
725+
{
726+
var mob3 = Monster.Create(templateC, Monster.Map);
727+
if (mob3 is not null)
728+
ObjectManager.AddObject(mob3);
729+
}
730+
if (foundD)
731+
{
732+
var mob4 = Monster.Create(templateD, Monster.Map);
733+
if (mob4 is not null)
734+
ObjectManager.AddObject(mob4);
735+
}
736+
if (foundE)
737+
{
738+
var mob5 = Monster.Create(templateE, Monster.Map);
739+
if (mob5 is not null)
740+
ObjectManager.AddObject(mob5);
741+
}
695742

696743
_phaseTwo = true;
697744
}
@@ -709,13 +756,48 @@ private void UpdatePhases()
709756
var foundF = templates.TryGetValue(t => t.Name == "SnowmanF", out var templateF);
710757
var foundG = templates.TryGetValue(t => t.Name == "SnowmanG", out var templateG);
711758

712-
if (foundA) Monster.CreateFromTemplate(templateA, Monster.Map);
713-
if (foundB) Monster.CreateFromTemplate(templateB, Monster.Map);
714-
if (foundC) Monster.CreateFromTemplate(templateC, Monster.Map);
715-
if (foundD) Monster.CreateFromTemplate(templateD, Monster.Map);
716-
if (foundE) Monster.CreateFromTemplate(templateE, Monster.Map);
717-
if (foundF) Monster.CreateFromTemplate(templateF, Monster.Map);
718-
if (foundG) Monster.CreateFromTemplate(templateG, Monster.Map);
759+
if (foundA)
760+
{
761+
var mob1 = Monster.Create(templateA, Monster.Map);
762+
if (mob1 is not null)
763+
ObjectManager.AddObject(mob1);
764+
}
765+
if (foundB)
766+
{
767+
var mob2 = Monster.Create(templateB, Monster.Map);
768+
if (mob2 is not null)
769+
ObjectManager.AddObject(mob2);
770+
}
771+
if (foundC)
772+
{
773+
var mob3 = Monster.Create(templateC, Monster.Map);
774+
if (mob3 is not null)
775+
ObjectManager.AddObject(mob3);
776+
}
777+
if (foundD)
778+
{
779+
var mob4 = Monster.Create(templateD, Monster.Map);
780+
if (mob4 is not null)
781+
ObjectManager.AddObject(mob4);
782+
}
783+
if (foundE)
784+
{
785+
var mob5 = Monster.Create(templateE, Monster.Map);
786+
if (mob5 is not null)
787+
ObjectManager.AddObject(mob5);
788+
}
789+
if (foundF)
790+
{
791+
var mob6 = Monster.Create(templateF, Monster.Map);
792+
if (mob6 is not null)
793+
ObjectManager.AddObject(mob6);
794+
}
795+
if (foundG)
796+
{
797+
var mob7 = Monster.Create(templateG, Monster.Map);
798+
if (mob7 is not null)
799+
ObjectManager.AddObject(mob7);
800+
}
719801

720802
_phaseThree = true;
721803
}
@@ -1001,7 +1083,9 @@ public override void Update(TimeSpan elapsedTime)
10011083
if (Monster.IsVulnerable || Monster.IsPoisoned)
10021084
{
10031085
var pos = Monster.Pos;
1004-
Monster.SendAnimationNearby(75, new Position(pos));
1086+
var diceRoll = Generator.RandNumGen100();
1087+
if (diceRoll >= 80)
1088+
Monster.SendAnimationNearby(75, new Position(pos));
10051089

10061090
foreach (var debuff in Monster.Debuffs.Values)
10071091
debuff?.OnEnded(Monster, debuff);

Zolian.Server.Base/Network/Components/ClientCreationLimit.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ protected internal override async Task Update()
2424
continue;
2525
}
2626

27-
CleanupCreationLimits();
27+
CleanupCreationLimitsAndIPBlocksOnPasswordAttempt();
2828

2929
var postElapsed = sw.Elapsed.TotalMilliseconds;
3030
var overshoot = postElapsed - ComponentSpeed;
@@ -37,9 +37,10 @@ protected internal override async Task Update()
3737
}
3838
}
3939

40-
private static void CleanupCreationLimits()
40+
private static void CleanupCreationLimitsAndIPBlocksOnPasswordAttempt()
4141
{
4242
if (!ServerSetup.Instance.Running) return;
43+
ServerSetup.Instance.GlobalPasswordAttempt.Clear();
4344

4445
var dict = ServerSetup.Instance.GlobalCreationCount;
4546

Zolian.Server.Base/Sprites/Entity/Monster.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -332,14 +332,6 @@ private static void TrackingNpcAndText(IAisling aisling, byte responseId, bool r
332332
mundane.AIScript?.OnResponse(aisling.Client, responseId, $"{mundane.Serial}");
333333
}
334334

335-
public static void CreateFromTemplate(MonsterTemplate template, Area map)
336-
{
337-
var newObj = Create(template, map);
338-
339-
if (newObj == null) return;
340-
ObjectManager.AddObject(newObj);
341-
}
342-
343335
private void Patrol()
344336
{
345337
if (CurrentWaypoint != null) WalkTo(CurrentWaypoint.X, CurrentWaypoint.Y);

0 commit comments

Comments
 (0)