Skip to content

Commit

Permalink
Refactor PowerLoader
Browse files Browse the repository at this point in the history
  • Loading branch information
Crypto137 committed Feb 16, 2024
1 parent 858b82a commit f67198a
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 9,059 deletions.
47 changes: 1 addition & 46 deletions src/MHServerEmu/Common/Helpers/DataHelper.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections;
using Gazillion;
using Gazillion;
using Google.ProtocolBuffers;
using MHServerEmu.Common.Logging;
using MHServerEmu.Games.Entities;
Expand Down Expand Up @@ -49,49 +48,5 @@ public static void ParseEntityCreateFromPacket(string packetName)
}
}
}

public static ulong GetPropertyIdHash(ulong propertyId)
{
BitArray bitArray = new(BitConverter.GetBytes(propertyId >> 12));

bool[] buffer = new bool[14];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = bitArray[i];
}

for (int i = 0; i < buffer.Length; i++)
{
bitArray[i] = buffer[buffer.Length - 1 - i];
}

byte[] hashBytes = new byte[8];
bitArray.CopyTo(hashBytes, 0);

return BitConverter.ToUInt64(hashBytes);
}

public static ulong ReconstructPowerPropertyIdFromHash(ulong hash)
{
BitArray bitArray = new(BitConverter.GetBytes(hash));

bool[] buffer = new bool[14];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = bitArray[i];
}

for (int i = 0; i < buffer.Length; i++)
{
bitArray[i] = buffer[buffer.Length - 1 - i];
}

byte[] propertyIdBytes = new byte[8];
bitArray.CopyTo(propertyIdBytes, 0);

ulong propertyId = (BitConverter.ToUInt64(propertyIdBytes) << 12) + 0x3ba;

return propertyId;
}
}
}
14 changes: 13 additions & 1 deletion src/MHServerEmu/Games/Entities/Avatars/AvatarEnums.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace MHServerEmu.Games.Entities.Avatars
using MHServerEmu.Games.GameData;

namespace MHServerEmu.Games.Entities.Avatars
{
public static class AvatarPrototypeEnumExtensions
{
Expand All @@ -7,6 +9,16 @@ public static HardcodedAvatarEntityId ToEntityId(this AvatarPrototypeId prototyp
return Enum.Parse<HardcodedAvatarEntityId>(Enum.GetName(prototype));
}

public static PrototypeId ToAvatarPrototypeId(this HardcodedAvatarEntityId avatarEntityId)
{
return (PrototypeId)Enum.Parse<AvatarPrototypeId>(Enum.GetName(avatarEntityId));
}

public static HardcodedAvatarPropertyCollectionReplicationId ToPropertyCollectionReplicationId(this HardcodedAvatarEntityId avatarEntityId)
{
return Enum.Parse<HardcodedAvatarPropertyCollectionReplicationId>(Enum.GetName(avatarEntityId));
}

public static HardcodedAvatarPropertyCollectionReplicationId ToPropertyCollectionReplicationId(this AvatarPrototypeId prototype)
{
return Enum.Parse<HardcodedAvatarPropertyCollectionReplicationId>(Enum.GetName(prototype));
Expand Down
36 changes: 18 additions & 18 deletions src/MHServerEmu/Games/Events/EventManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ private List<QueuedGameMessage> HandleEvent(GameEvent queuedEvent)
powerId = (PrototypeId)queuedEvent.Data;
switch (powerId)
{
case (PrototypeId)PowerPrototypes.GhostRider.GhostRiderRide:
case (PrototypeId)PowerPrototypes.Travel.GhostRiderRide:
Logger.Trace($"EventStart GhostRiderRide");
// Player.Avatar.EvalOnCreate.AssignProp.ProcProp.Param1
conditionArchive = new(avatarEntityId, 666, conditionSerializationFlags, powerId, 0); // TODO: generate and save Condition.Id
Expand All @@ -270,14 +270,14 @@ private List<QueuedGameMessage> HandleEvent(GameEvent queuedEvent)

break;

case (PrototypeId)PowerPrototypes.Wolverine.WolverineRide:
case (PrototypeId)PowerPrototypes.Deadpool.DeadpoolRide:
case (PrototypeId)PowerPrototypes.NickFury.NickFuryRide:
case (PrototypeId)PowerPrototypes.Cyclops.CyclopsRide:
case (PrototypeId)PowerPrototypes.BlackWidow.BlackWidowRide:
case (PrototypeId)PowerPrototypes.Blade.BladeRide:
case (PrototypeId)PowerPrototypes.AntMan.AntmanFlight:
case (PrototypeId)PowerPrototypes.Thing.ThingFlight:
case (PrototypeId)PowerPrototypes.Travel.WolverineRide:
case (PrototypeId)PowerPrototypes.Travel.DeadpoolRide:
case (PrototypeId)PowerPrototypes.Travel.NickFuryRide:
case (PrototypeId)PowerPrototypes.Travel.CyclopsRide:
case (PrototypeId)PowerPrototypes.Travel.BlackWidowRide:
case (PrototypeId)PowerPrototypes.Travel.BladeRide:
case (PrototypeId)PowerPrototypes.Travel.AntmanFlight:
case (PrototypeId)PowerPrototypes.Travel.ThingFlight:
Logger.Trace($"EventStart Ride");
conditionArchive = new(avatarEntityId, 667, conditionSerializationFlags, powerId, 0);
messageList.Add(new(client, new(NetMessageAddCondition.CreateBuilder()
Expand All @@ -293,7 +293,7 @@ private List<QueuedGameMessage> HandleEvent(GameEvent queuedEvent)
powerId = (PrototypeId)queuedEvent.Data;
switch (powerId)
{
case (PrototypeId)PowerPrototypes.GhostRider.GhostRiderRide:
case (PrototypeId)PowerPrototypes.Travel.GhostRiderRide:
Logger.Trace($"EventEnd GhostRiderRide");

messageList.Add(new(client, new(NetMessageDeleteCondition.CreateBuilder()
Expand All @@ -308,14 +308,14 @@ private List<QueuedGameMessage> HandleEvent(GameEvent queuedEvent)

break;

case (PrototypeId)PowerPrototypes.Wolverine.WolverineRide:
case (PrototypeId)PowerPrototypes.Deadpool.DeadpoolRide:
case (PrototypeId)PowerPrototypes.NickFury.NickFuryRide:
case (PrototypeId)PowerPrototypes.Cyclops.CyclopsRide:
case (PrototypeId)PowerPrototypes.BlackWidow.BlackWidowRide:
case (PrototypeId)PowerPrototypes.Blade.BladeRide:
case (PrototypeId)PowerPrototypes.AntMan.AntmanFlight:
case (PrototypeId)PowerPrototypes.Thing.ThingFlight:
case (PrototypeId)PowerPrototypes.Travel.WolverineRide:
case (PrototypeId)PowerPrototypes.Travel.DeadpoolRide:
case (PrototypeId)PowerPrototypes.Travel.NickFuryRide:
case (PrototypeId)PowerPrototypes.Travel.CyclopsRide:
case (PrototypeId)PowerPrototypes.Travel.BlackWidowRide:
case (PrototypeId)PowerPrototypes.Travel.BladeRide:
case (PrototypeId)PowerPrototypes.Travel.AntmanFlight:
case (PrototypeId)PowerPrototypes.Travel.ThingFlight:
Logger.Trace($"EventEnd Ride");
messageList.Add(new(client, new(NetMessageDeleteCondition.CreateBuilder()
.SetIdEntity(avatarEntityId)
Expand Down
14 changes: 0 additions & 14 deletions src/MHServerEmu/Games/GameData/DataDirectory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -523,20 +523,6 @@ public IEnumerable<AssetType> IterateAssetTypes()
return AssetDirectory.IterateAssetTypes();
}

public List<ulong> GetPowerPropertyIdList(string filter)
{
// TO BE REMOVED: temp bruteforcing of power property ids

PrototypeId[] powerTable = _prototypeClassLookupDict[typeof(PowerPrototype)].EnumValueToPrototypeLookup;
List<ulong> propertyIdList = new();

for (int i = 1; i < powerTable.Length; i++)
if (GameDatabase.GetPrototypeName(powerTable[i]).Contains(filter))
propertyIdList.Add(DataHelper.ReconstructPowerPropertyIdFromHash((ulong)i));

return propertyIdList;
}

/// <summary>
/// Checks if the specified <see cref="PrototypeId"/> refers to a child <see cref="Prototype"/> that is related to a parent prototype.
/// If the parent is a default prototype, checks the <see cref="Blueprint"/> hierarchy. Otherwise, checks prototype data hierarchy.
Expand Down
Loading

0 comments on commit f67198a

Please sign in to comment.