Convert familiars to GhostRoleMobSpawner (#9525)

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
Rane
2022-07-15 03:53:42 -04:00
committed by GitHub
parent 1cf501303f
commit 5c7eea3e42
7 changed files with 90 additions and 8 deletions

View File

@@ -10,6 +10,8 @@ using Content.Server.Cooldown;
using Content.Server.Bible.Components;
using Content.Server.MobState;
using Content.Server.Popups;
using Content.Server.Ghost.Roles.Components;
using Content.Server.Ghost.Roles.Events;
using Content.Shared.IdentityManagement;
using Content.Shared.Popups;
using Robust.Shared.Random;
@@ -39,6 +41,7 @@ namespace Content.Server.Bible
SubscribeLocalEvent<SummonableComponent, GetItemActionsEvent>(GetSummonAction);
SubscribeLocalEvent<SummonableComponent, SummonActionEvent>(OnSummon);
SubscribeLocalEvent<FamiliarComponent, MobStateChangedEvent>(OnFamiliarDeath);
SubscribeLocalEvent<FamiliarComponent, GhostRoleSpawnerUsedEvent>(OnSpawned);
}
private readonly Queue<EntityUid> _addQueue = new();
@@ -194,6 +197,17 @@ namespace Content.Server.Bible
}
}
/// <summary>
/// When the familiar spawns, set its source to the bible.
/// </summary>
private void OnSpawned(EntityUid uid, FamiliarComponent component, GhostRoleSpawnerUsedEvent args)
{
if (!TryComp<SummonableComponent>(Transform(args.Spawner).ParentUid, out var summonable))
return;
component.Source = summonable.Owner;
summonable.Summon = uid;
}
private void AttemptSummon(SummonableComponent component, EntityUid user, TransformComponent? position)
{
@@ -212,12 +226,11 @@ namespace Content.Server.Bible
var familiar = EntityManager.SpawnEntity(component.SpecialItemPrototype, position.Coordinates);
component.Summon = familiar;
// We only want to add the familiar component to mobs
if (HasComp<MobStateComponent>(familiar))
// If this is going to use a ghost role mob spawner, attach it to the bible.
if (HasComp<GhostRoleMobSpawnerComponent>(familiar))
{
// Make this Summon the familiar's source
var familiarComp = EnsureComp<FamiliarComponent>(familiar);
familiarComp.Source = component.Owner;
_popupSystem.PopupEntity(Loc.GetString("bible-summon-requested"), user, Filter.Pvs(user), PopupType.Medium);
Transform(familiar).AttachParent(component.Owner);
}
component.AlreadySummoned = true;
_actionsSystem.RemoveAction(user, component.SummonAction);

View File

@@ -4,6 +4,7 @@ using JetBrains.Annotations;
using Robust.Server.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Content.Server.Ghost.Roles.Events;
namespace Content.Server.Ghost.Roles.Components
{
@@ -38,6 +39,11 @@ namespace Content.Server.Ghost.Roles.Components
throw new NullReferenceException("Prototype string cannot be null or empty!");
var mob = _entMan.SpawnEntity(Prototype, _entMan.GetComponent<TransformComponent>(Owner).Coordinates);
var xform = _entMan.GetComponent<TransformComponent>(mob);
xform.AttachToGridOrMap();
var spawnedEvent = new GhostRoleSpawnerUsedEvent(Owner, mob);
_entMan.EventBus.RaiseLocalEvent(mob, spawnedEvent, false);
if (MakeSentient)
MakeSentientCommand.MakeSentient(mob, _entMan);
@@ -53,7 +59,7 @@ namespace Content.Server.Ghost.Roles.Components
Taken = true;
if (_deleteOnSpawn)
_entMan.DeleteEntity(Owner);
_entMan.QueueDeleteEntity(Owner);
return true;
}

View File

@@ -0,0 +1,25 @@
namespace Content.Server.Ghost.Roles.Events
{
/// <summary>
/// Raised on a spawned entity after they use a ghost role mob spawner.
/// </summary>
public sealed class GhostRoleSpawnerUsedEvent : EntityEventArgs
{
/// <summary>
/// The entity that spawned this.
/// </summary>
public EntityUid Spawner;
/// <summary>
/// The entity spawned.
/// </summary>
public EntityUid Spawned;
public GhostRoleSpawnerUsedEvent(EntityUid spawner, EntityUid spawned)
{
Spawner = spawner;
Spawned = spawned;
}
}
}

View File

@@ -5,6 +5,7 @@ bible-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE(
bible-sizzle = The book sizzles in your hands!
bible-summon-verb = Summon familiar
bible-summon-verb-desc = Summon a familiar that will aid you and gain humanlike intelligence once inhabited by a soul.
bible-summon-requested = Your familiar will arrive once a willing soul comes forth.
bible-summon-respawn-ready = {CAPITALIZE(THE($book))} surges with ethereal power. {CAPITALIZE(POSS-ADJ($book))} resident is home again.
necro-heal-success-self = You hit {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts!
necro-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts!

View File

@@ -14,3 +14,38 @@
layers:
- state: green
- texture: Mobs/Animals/regalrat.rsi/icon.png
- type: entity
id: SpawnPointGhostRemilia
name: ghost role spawn point
suffix: Remilia
parent: MarkerBase
components:
- type: GhostRoleMobSpawner
prototype: MobBatRemilia
name: Remilia, the chaplain's familiar
description: Obey your master. Eat fruit.
rules: You are an intelligent fruit bat. Follow the chaplain around. Don't cause any trouble unless the chaplain tells you to.
- type: Sprite
sprite: Markers/jobs.rsi
layers:
- state: green
- texture: Mobs/Animals/bat.rsi/bat.png
- type: entity
id: SpawnPointGhostCerberus
name: ghost role spawn point
suffix: cerberus
parent: MarkerBase
components:
- type: GhostRoleMobSpawner
prototype: MobCorgiCerberus
name: Cerberus, Evil Familiar
description: Obey your master. Spread chaos.
rules: You are an intelligent, demonic dog. Try to help the chaplain and any of his flock. As an antagonist, you're otherwise unrestrained.
- type: Sprite
sprite: Markers/jobs.rsi
layers:
- state: green
- texture: Mobs/Pets/corgi.rsi/narsian.png

View File

@@ -22,6 +22,7 @@
- type: Mind
showExamineInfo: true
- type: Alerts
- type: Familiar
- type: entity
name: Cerberus
@@ -71,3 +72,4 @@
- Chapel
- type: Mind
showExamineInfo: true
- type: Familiar

View File

@@ -17,7 +17,7 @@
groups:
Burn: 30
- type: Summonable
specialItem: MobBatRemilia
specialItem: SpawnPointGhostRemilia
- type: ItemCooldown
- type: Sprite
netsync: false
@@ -58,7 +58,7 @@
healSound: "/Audio/Effects/lightburn.ogg"
cooldownTime: 1.3
- type: Summonable
specialItem: MobCorgiCerberus
specialItem: SpawnPointGhostCerberus
respawnTime: 300
- type: Sprite
netsync: false