Skip to content
Merged

p34.8 #512

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
2 changes: 2 additions & 0 deletions src/Perpetuum.Bootstrapper/PerpetuumBootstrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,7 @@ private void InitRelayManager()
_ = _builder.RegisterType<AffectOutpostStability>();
_ = _builder.RegisterType<PortalSpawner>();
_ = _builder.RegisterType<NpcStateAnnouncer>();
_ = _builder.RegisterType<SapStateAnnouncer>();
_ = _builder.RegisterType<OreNpcSpawner>().As<NpcSpawnEventHandler<OreNpcSpawnMessage>>();
_ = _builder.RegisterType<NpcReinforcementSpawner>().As<NpcSpawnEventHandler<NpcReinforcementsMessage>>();
_ = _builder.RegisterType<EventListenerService>().SingleInstance().OnActivated(e =>
Expand All @@ -563,6 +564,7 @@ private void InitRelayManager()
e.Instance.AttachListener(e.Context.Resolve<NpcChatEcho>());
e.Instance.AttachListener(e.Context.Resolve<PortalSpawner>());
e.Instance.AttachListener(e.Context.Resolve<NpcStateAnnouncer>());
e.Instance.AttachListener(e.Context.Resolve<SapStateAnnouncer>());
GameTimeObserver obs = new GameTimeObserver(e.Instance);
obs.Subscribe(e.Context.Resolve<IGameTimeService>());
});
Expand Down
3 changes: 3 additions & 0 deletions src/Perpetuum/Perpetuum.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -348,12 +348,15 @@
<Compile Include="Services\EventServices\EventMessages\NpcReinforcementsMessage.cs" />
<Compile Include="Services\EventServices\EventMessages\NpcState.cs" />
<Compile Include="Services\EventServices\EventMessages\NpcStateMessage.cs" />
<Compile Include="Services\EventServices\EventMessages\SapState.cs" />
<Compile Include="Services\EventServices\EventMessages\SapStateMessage.cs" />
<Compile Include="Services\EventServices\EventMessages\SpawnPortalMessage.cs" />
<Compile Include="Services\EventServices\EventProcessors\NpcSpawnEventHandlers\NpcSpawnEventHandler.cs" />
<Compile Include="Services\EventServices\EventProcessors\NpcSpawnEventHandlers\NpcReinforcementSpawner.cs" />
<Compile Include="Services\EventServices\EventProcessors\EnvironmentalEffectHandler.cs" />
<Compile Include="Services\EventServices\EventProcessors\NpcStateAnnouncer.cs" />
<Compile Include="Services\EventServices\EventProcessors\PortalSpawner.cs" />
<Compile Include="Services\EventServices\EventProcessors\SapStateAnnouncer.cs" />
<Compile Include="Services\EventServices\EventType.cs" />
<Compile Include="Services\GameTime\GameTimeObserver.cs" />
<Compile Include="Services\GameTime\GameTimeInfo.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Perpetuum.Services.EventServices.EventMessages
{
public enum SapState
{
Opened,
Completed,
Closed,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;

namespace Perpetuum.Services.EventServices.EventMessages
{

public class SapStateMessage : IEventMessage
{
public SapStateMessage(long eId, string sapEname, SapState state, DateTime time)
{
Eid = eId;
SapEname = sapEname;
State = state;
TimeStamp = time;
}

public EventType Type => EventType.NpcState;

public long Eid { get; }

public string SapEname { get; }

public SapState State { get; }

public DateTime TimeStamp { get; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
using Perpetuum.Accounting.Characters;
using Perpetuum.Log;
using Perpetuum.Services.Channels;
using Perpetuum.Services.EventServices.EventMessages;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace Perpetuum.Services.EventServices.EventProcessors
{
public class SapStateAnnouncer : EventProcessor
{
private readonly IChannelManager channelManager;
private const string SENDER_CHARACTER_NICKNAME = "[OPP] Announcer";
private const string CHANNEL = "Syndicate Intel";
private readonly Character announcer;
private readonly IDictionary<string, object> nameDictionary;
private readonly IDictionary<long, SapStateMessage> state;

public SapStateAnnouncer(
IChannelManager channelManager,
ICustomDictionary customDictionary)
{
announcer = Character.GetByNick(SENDER_CHARACTER_NICKNAME);
this.channelManager = channelManager;
nameDictionary = customDictionary.GetDictionary(0);
state = new Dictionary<long, SapStateMessage>();
}

//TODO use ChannelMessageHandler w/ PreMadeChatMessages
private readonly IList<string> openedMessages = new List<string>()
{
"SAP has started",
};

private readonly IList<string> completedMessages = new List<string>()
{
"SAP has been completed",
};

private readonly IList<string> closedMessages = new List<string>()
{
"SAP has ended",
};

private string GetOutpostName(string ename)
{
if (nameDictionary.TryGetValue(ename, out string name) != true)
{
WriteNPCStateAnnouncerLog($"Missing localized name for {ename}");
}
return name ?? string.Empty;
}

private void WriteNPCStateAnnouncerLog(string message)
{
LogEvent e = new LogEvent
{
LogType = LogType.Error,
Tag = "NpcStateAnnouncer",
Message = message
};

Logger.Log(e);
}

private string GetStateMessage(SapStateMessage msg)
{
switch (msg.State)
{
case SapState.Opened:
return openedMessages[FastRandom.NextInt(openedMessages.Count - 1)];
case SapState.Completed:
return completedMessages[FastRandom.NextInt(completedMessages.Count - 1)];
case SapState.Closed:
return closedMessages[FastRandom.NextInt(closedMessages.Count - 1)];
default:
return string.Empty;

}
}

private string BuildChatAnnouncement(SapStateMessage msg)
{
string outpostName = GetOutpostName(msg.SapEname);
if (outpostName == string.Empty)
{
return string.Empty;
}

string stateMessage = GetStateMessage(msg);

return stateMessage == string.Empty ? string.Empty : $"{outpostName} {stateMessage}";
}

private static string Strip(string str)
{
return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "");
}

private static string Abbreviate(string name, int charLim)
{
string[] words = name.Split(' ');
int perWordLen = (charLim / words.Length.Max(1)).Clamp(3, 24);
for (int i = 0; i < words.Length; i++)
{
words[i] = Strip(words[i]).Clamp(perWordLen) ?? "";
}
return string.Join(" ", words);
}

private string BuildTopicFromState()
{
string topic = "Current: ";
int allowableNameLens = (190 / state.Count.Max(1)).Clamp(3, 64);
foreach (KeyValuePair<long, SapStateMessage> pair in state)
{
string name = Abbreviate(GetOutpostName(pair.Value.SapEname), allowableNameLens);
if (name == string.Empty)
{
continue;
}

if (pair.Value.State == SapState.Opened)
{
topic += $"{name}|";
}
}

return topic;
}

private bool IsUpdatable(SapStateMessage current, SapStateMessage next)
{
return next.TimeStamp > current.TimeStamp;
}

private bool UpdateState(SapStateMessage msg)
{
if (!state.ContainsKey((int)msg.Eid) || IsUpdatable(state[msg.Eid], msg))
{
state[msg.Eid] = msg;

return true;
}

return false;
}

public override EventType Type => EventType.NpcState;
public override void HandleMessage(IEventMessage value)
{
if (value is SapStateMessage msg)
{
if (UpdateState(msg))
{
string announcement = BuildChatAnnouncement(msg);
string motd = BuildTopicFromState();
if (!announcement.IsNullOrEmpty())
{
channelManager.Announcement(CHANNEL, announcer, announcement);
}
if (!motd.IsNullOrEmpty())
{
channelManager.SetTopic(CHANNEL, announcer, motd);
}
}
}
}
}
}
17 changes: 10 additions & 7 deletions src/Perpetuum/Zones/Intrusion/ActiveHackingSAP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,27 @@ namespace Perpetuum.Zones.Intrusion
public class ActiveHackingSAP : SAP
{
private const int MAX_MODULE_CYCLE = 120;

public ActiveHackingSAP() : base(BeamType.attackpoint_usage_enter, BeamType.attackpoint_usage_out)
{
}

protected override int MaxScore => MAX_MODULE_CYCLE;

protected override void AppendTopScoresToPacket(Packet packet,int count)
protected override void AppendTopScoresToPacket(Packet packet, int count)
{
AppendPlayerTopScoresToPacket(this,packet,count);
AppendPlayerTopScoresToPacket(this, packet, count);
}

public void OnModuleUse(Player player)
{
Zone.CreateBeam(BeamType.loot_bolt,b => b.WithSource(this)
.WithTarget(player)
.WithState(BeamState.Hit)
.WithDuration(3000));
Zone.CreateBeam(
BeamType.loot_bolt,
b => b
.WithSource(this)
.WithTarget(player)
.WithState(BeamState.Hit)
.WithDuration(3000));
IncrementPlayerScore(player, 1);
}
}
Expand Down
15 changes: 9 additions & 6 deletions src/Perpetuum/Zones/Intrusion/DestructionSAP.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Linq;
using Perpetuum.ExportedTypes;
using Perpetuum.Units;
using Perpetuum.Zones.DamageProcessors;
using System.Linq;

namespace Perpetuum.Zones.Intrusion
{
Expand All @@ -18,9 +18,11 @@ protected override void OnDamageTaken(Unit source, DamageTakenEventArgs e)
{
base.OnDamageTaken(source, e);

var player = Zone.ToPlayerOrGetOwnerPlayer(source);
Players.Player player = Zone.ToPlayerOrGetOwnerPlayer(source);
if (player == null)
{
return;
}

IncrementPlayerScore(player, (int)e.TotalDamage);
}
Expand All @@ -33,14 +35,14 @@ protected override void OnDead(Unit killer)

protected override int MaxScore => 0;

protected override void AppendTopScoresToPacket(Packet packet,int count)
protected override void AppendTopScoresToPacket(Packet packet, int count)
{
var topScores = GetCorporationTopScores(count);
System.Collections.Generic.IList<IntrusionCorporationScore> topScores = GetCorporationTopScores(count);

packet.AppendInt(topScores.Count);
packet.AppendByte(sizeof(long));

foreach (var topScore in topScores)
foreach (IntrusionCorporationScore topScore in topScores)
{
packet.AppendLong(topScore.corporationEid);
packet.AppendInt(topScore.score);
Expand All @@ -49,7 +51,8 @@ protected override void AppendTopScoresToPacket(Packet packet,int count)

public override long GetWinnerCorporationEid()
{
var score = GetCorporationTopScores(1).FirstOrDefault();
IntrusionCorporationScore score = GetCorporationTopScores(1).FirstOrDefault();

return score.corporationEid;
}
}
Expand Down
Loading