Skip to content

Commit

Permalink
🐛 Fixed spawn commands finding Chars
Browse files Browse the repository at this point in the history
  • Loading branch information
decaprime committed Jun 11, 2023
1 parent 8395ab6 commit efbde10
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
40 changes: 25 additions & 15 deletions Commands/SpawnNpcCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,46 @@ namespace CommunityCommands.Commands;

internal static class SpawnCommands
{
[Command("spawnnpc", "spwn", description: "Spawns CHAR_ npcs", adminOnly: true)]
public static void SpawnNpc(ChatCommandContext ctx, string name, int count = 1)
{
var pos = Core.EntityManager.GetComponentData<LocalToWorld>(ctx.Event.SenderCharacterEntity).Position;
public record struct CharacterUnit(string Name, PrefabGUID Prefab);

if (!Character.Named.TryGetValue(name, out var unit) && Character.Named.TryGetValue("CHAR_" + name, out unit))
public class CharacterUnitConverter : CommandArgumentConverter<CharacterUnit>
{
public override CharacterUnit Parse(ICommandContext ctx, string input)
{
throw ctx.Error($"Can't find unit {name}");
if (Character.Named.TryGetValue(input, out var unit) || Character.Named.TryGetValue("CHAR_" + input, out unit))
{
return new (Character.NameFromPrefab[unit.GuidHash], unit);
}
// "CHAR_Bandit_Bomber": -1128238456,
if (int.TryParse(input, out var id) && Character.NameFromPrefab.TryGetValue(id, out var name))
{
return new (name, new(id));
}

throw ctx.Error($"Can't find unit {input.Bold()}");
}
}

[Command("spawnnpc", "spwn", description: "Spawns CHAR_ npcs", adminOnly: true)]
public static void SpawnNpc(ChatCommandContext ctx, CharacterUnit character, int count = 1)
{
var pos = Core.EntityManager.GetComponentData<LocalToWorld>(ctx.Event.SenderCharacterEntity).Position;

Core.UnitSpawner.Spawn(ctx.Event.SenderUserEntity, unit, count, new(pos.x, pos.z), 1, 2, -1);
ctx.Reply($"Spawning CustomNPC {name} at your position");
Core.UnitSpawner.Spawn(ctx.Event.SenderUserEntity, character.Prefab, count, new(pos.x, pos.z), 1, 2, -1);
ctx.Reply($"Spawning {character.Name.Bold()} at your position");
}

[Command("customspawn", "cspn", "customspawn <Prefab Name> [<BloodType> <BloodQuality> <Consumable(\"true/false\")> <Duration>]", "Spawns a modified NPC at your current position.", adminOnly: true)]
public static void CustomSpawnNpc(ChatCommandContext ctx, string name, BloodType type, int quality, bool consumable, int duration = -1)
public static void CustomSpawnNpc(ChatCommandContext ctx, CharacterUnit unit, BloodType type, int quality, bool consumable, int duration = -1)
{
var pos = Core.EntityManager.GetComponentData<LocalToWorld>(ctx.Event.SenderCharacterEntity).Position;

if (!Character.Named.TryGetValue(name, out var unit) && Character.Named.TryGetValue("CHAR_" + name, out unit))
{
throw ctx.Error($"Can't find unit {name}");
}

if (quality > 100 || quality < 0)
{
throw ctx.Error($"Blood Quality must be between 0 and 100");
}

Core.UnitSpawner.SpawnWithCallback(ctx.Event.SenderUserEntity, unit, pos.xz, duration, (Entity e) =>
Core.UnitSpawner.SpawnWithCallback(ctx.Event.SenderUserEntity, unit.Prefab, pos.xz, duration, (Entity e) =>
{
var blood = Core.EntityManager.GetComponentData<BloodConsumeSource>(e);
blood.UnitBloodType = new PrefabGUID((int)type);
Expand Down
4 changes: 3 additions & 1 deletion Data/Character.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace CommunityCommands.Data;
internal static class Character
{
public static ReadOnlyDictionary<string, PrefabGUID> Named = new(new Dictionary<string, PrefabGUID>()
public static ReadOnlyDictionary<string, PrefabGUID> Named = new(new Dictionary<string, PrefabGUID>(StringComparer.OrdinalIgnoreCase)
{
{ "CHAR_ArchMage_FlameSphere", new(2138173476) },
{ "CHAR_ArchMage_Summon", new(805231073) },
Expand Down Expand Up @@ -365,4 +365,6 @@ internal static class Character
{ "CHAR_Winter_Wolf", new(134039094) },
{ "CHAR_Winter_Yeti_VBlood", new(-1347412392) },
});
public static Dictionary<int, string> NameFromPrefab = Named.ToDictionary(x => x.Value.GuidHash, x => x.Key);

}

0 comments on commit efbde10

Please sign in to comment.