Доработка вампира и мелочи (#598)
* init * fix vampire polymorph * fix vampire metabolizm * upd * теперь при бане будет указываться номер раунда, хд * fix * fix * fix locale * change speed * new nukeops shuttle * FULLY FIX EBANY VAMPIRE OBJECTIVES * fix faction * fix drank objective * try fix status icon * fix changelings * fix zombie faction * vampire status icon fix * upd roadmap * vampire blood amount alert * drain objective up * upd * upd
|
|
@ -1,25 +1,42 @@
|
|||
using System.Linq;
|
||||
using Content.Client.Alerts;
|
||||
using Content.Client.UserInterface.Systems.Alerts.Controls;
|
||||
using Content.Shared.StatusIcon;
|
||||
using Content.Shared.StatusIcon.Components;
|
||||
using Content.Shared.Vampire;
|
||||
using Content.Shared.Vampire.Components;
|
||||
using Content.Shared.StatusIcon.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Vampire;
|
||||
|
||||
public sealed partial class VampireSystem : EntitySystem
|
||||
public sealed class VampireSystem : EntitySystem
|
||||
{
|
||||
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<VampireComponent, GetStatusIconsEvent>(GetVampireIcon);
|
||||
SubscribeLocalEvent<VampireIconComponent, GetStatusIconsEvent>(GetVampireIcon);
|
||||
SubscribeLocalEvent<VampireAlertComponent, UpdateAlertSpriteEvent>(OnUpdateAlert);
|
||||
}
|
||||
|
||||
private void GetVampireIcon(Entity<VampireComponent> ent, ref GetStatusIconsEvent args)
|
||||
{
|
||||
var iconPrototype = _prototype.Index(ent.Comp.StatusIcon);
|
||||
private void GetVampireIcon(EntityUid uid, VampireIconComponent component, ref GetStatusIconsEvent args)
|
||||
{
|
||||
var iconPrototype = _prototype.Index(component.StatusIcon);
|
||||
args.StatusIcons.Add(iconPrototype);
|
||||
}
|
||||
|
||||
private void OnUpdateAlert(EntityUid uid, VampireAlertComponent component, ref UpdateAlertSpriteEvent args)
|
||||
{
|
||||
if (args.Alert.ID != component.BloodAlert)
|
||||
return;
|
||||
|
||||
var sprite = args.SpriteViewEnt.Comp;
|
||||
var blood = Math.Clamp(component.BloodAmount, 0, 999);
|
||||
sprite.LayerSetState(VampireVisualLayers.Digit1, $"{(blood / 100) % 10}");
|
||||
sprite.LayerSetState(VampireVisualLayers.Digit2, $"{(blood / 10) % 10}");
|
||||
sprite.LayerSetState(VampireVisualLayers.Digit3, $"{blood % 10}");
|
||||
}
|
||||
}
|
||||
|
|
@ -43,6 +43,7 @@ namespace Content.IntegrationTests.Tests
|
|||
"/Maps/Shuttles/cargo.yml",
|
||||
"/Maps/Shuttles/emergency.yml",
|
||||
"/Maps/Shuttles/infiltrator.yml",
|
||||
"/Maps/_Sunrise/Shuttles/infiltrator.yml",
|
||||
};
|
||||
|
||||
private static readonly string[] GameMaps =
|
||||
|
|
|
|||
|
|
@ -222,7 +222,8 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
|
|||
("name", targetName),
|
||||
("ip", addressRangeString),
|
||||
("hwid", hwidString),
|
||||
("reason", reason));
|
||||
("reason", reason),
|
||||
("round", roundId == null ? Loc.GetString("server-ban-unknown-round") : roundId));
|
||||
|
||||
_sawmill.Info(logMessage);
|
||||
_chat.SendAdminAlert(logMessage);
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ using Content.Server.Mind;
|
|||
using Content.Server.Objectives;
|
||||
using Content.Server.Roles;
|
||||
using Content.Server.Vampire;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Vampire.Components;
|
||||
using Content.Shared.NPC.Prototypes;
|
||||
using Content.Shared.NPC.Systems;
|
||||
|
|
@ -25,6 +26,7 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
|
|||
{
|
||||
[Dependency] private readonly MindSystem _mind = default!;
|
||||
[Dependency] private readonly AntagSelectionSystem _antag = default!;
|
||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||
[Dependency] private readonly SharedRoleSystem _role = default!;
|
||||
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
|
||||
[Dependency] private readonly ObjectivesSystem _objective = default!;
|
||||
|
|
@ -82,6 +84,8 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
|
|||
|
||||
// make sure it's initial chems are set to max
|
||||
var vampireComponent = EnsureComp<VampireComponent>(target);
|
||||
EnsureComp<VampireIconComponent>(target);
|
||||
var vampireAlertComponent = EnsureComp<VampireAlertComponent>(target);
|
||||
var interfaceComponent = EnsureComp<UserInterfaceComponent>(target);
|
||||
|
||||
if (HasComp<UserInterfaceComponent>(target))
|
||||
|
|
@ -99,6 +103,7 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
|
|||
|
||||
_vampire.AddStartingAbilities(vampire);
|
||||
_vampire.MakeVulnerableToHoly(vampire);
|
||||
_alerts.ShowAlert(vampire, vampireAlertComponent.BloodAlert);
|
||||
|
||||
Random random = new Random();
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ using Content.Shared.Interaction;
|
|||
using Content.Shared.Mobs;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Polymorph;
|
||||
using Content.Shared.Prying.Components;
|
||||
using Content.Shared.Stealth.Components;
|
||||
using Content.Shared.Store.Events;
|
||||
|
|
@ -324,10 +325,29 @@ public sealed partial class VampireSystem
|
|||
}
|
||||
private void PolymorphSelf(Entity<VampireComponent> vampire, string? polymorphTarget)
|
||||
{
|
||||
if (polymorphTarget == null)
|
||||
if (string.IsNullOrEmpty(polymorphTarget))
|
||||
return;
|
||||
|
||||
var prototypeId = polymorphTarget switch
|
||||
{
|
||||
"MobMouse" => "VampireMouse",
|
||||
"mobBatVampire" => "VampireBat",
|
||||
_ => null
|
||||
};
|
||||
|
||||
_polymorph.PolymorphEntity(vampire, polymorphTarget);
|
||||
if (prototypeId == null)
|
||||
{
|
||||
Logger.Warning($"Unknown polymorph target: {polymorphTarget}. Polymorph operation aborted.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_prototypeManager.TryIndex<PolymorphPrototype>(prototypeId, out var prototype))
|
||||
{
|
||||
Logger.Warning($"Unknown prototype: {prototypeId}. Polymorph operation aborted.");
|
||||
return;
|
||||
}
|
||||
|
||||
_polymorph.PolymorphEntity(vampire, prototype);
|
||||
}
|
||||
private void BloodSteal(Entity<VampireComponent> vampire)
|
||||
{
|
||||
|
|
@ -652,7 +672,7 @@ public sealed partial class VampireSystem
|
|||
|
||||
if (_mind.TryGetMind(entity, out var mindId, out var mind))
|
||||
if (_mind.TryGetObjectiveComp<BloodDrainConditionComponent>(mindId, out var objective, mind))
|
||||
objective.BloodDranked += entity.Comp.TotalBloodDrank;
|
||||
objective.BloodDranked = entity.Comp.TotalBloodDrank;
|
||||
|
||||
//Slurp
|
||||
_audio.PlayPvs(entity.Comp.BloodDrainSound, entity.Owner, AudioParams.Default.WithVolume(-3f));
|
||||
|
|
|
|||
|
|
@ -12,14 +12,13 @@ public sealed partial class VampireSystem
|
|||
|
||||
private void InitializeObjectives()
|
||||
{
|
||||
|
||||
SubscribeLocalEvent<BloodDrainConditionComponent, ObjectiveGetProgressEvent>(OnBloodDrainGetProgress);
|
||||
}
|
||||
|
||||
private void OnBloodDrainGetProgress(EntityUid uid, BloodDrainConditionComponent comp, ref ObjectiveGetProgressEvent args)
|
||||
{
|
||||
var target = _number.GetTarget(uid);
|
||||
if (target != 0)
|
||||
if (target > 0)
|
||||
args.Progress = MathF.Min(comp.BloodDranked / target, 1f);
|
||||
else args.Progress = 1f;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
[Dependency] private readonly SharedHandsSystem _hands = default!;
|
||||
[Dependency] private readonly MetabolizerSystem _metabolism = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
|
||||
[Dependency] private readonly SharedVampireSystem _vampire = default!;
|
||||
|
||||
private Dictionary<string, EntityUid> _actionEntities = new();
|
||||
|
||||
|
|
@ -214,16 +215,19 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
|
||||
private void OnVampireBloodChangedEvent(EntityUid uid, VampireComponent component, VampireBloodChangedEvent args)
|
||||
{
|
||||
if (TryComp<VampireAlertComponent>(uid, out var alertComp))
|
||||
_vampire.SetAlertBloodAmount(alertComp,_vampire.GetBloodEssence(uid).Int());
|
||||
|
||||
EntityUid? newEntity = null;
|
||||
EntityUid entity = default;
|
||||
// Mutations
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(50) && !_actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(50) && !_actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity, VampireComponent.MutationsActionPrototype);
|
||||
if (newEntity != null)
|
||||
_actionEntities[VampireComponent.MutationsActionPrototype] = newEntity.Value;
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(50) && _actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(50) && _actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -235,7 +239,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
|
||||
//Hemomancer
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBloodSteal", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBloodSteal", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireBloodSteal");
|
||||
if (newEntity != null)
|
||||
|
|
@ -247,7 +251,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBloodSteal", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBloodSteal", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -257,7 +261,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
_actionEntities.Remove("ActionVampireBloodSteal");
|
||||
}
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireScreech", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireScreech", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireScreech");
|
||||
if (newEntity != null)
|
||||
|
|
@ -269,7 +273,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireScreech", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireScreech", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -281,7 +285,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
|
||||
//Umbrae
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireGlare", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireGlare", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireGlare");
|
||||
if (newEntity != null)
|
||||
|
|
@ -293,7 +297,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireGlare", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireGlare", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -303,7 +307,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
_actionEntities.Remove("ActionVampireGlare");
|
||||
}
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireCloakOfDarkness");
|
||||
if (newEntity != null)
|
||||
|
|
@ -315,7 +319,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -327,7 +331,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
|
||||
//Gargantua
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireUnnaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireUnnaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
|
||||
{
|
||||
var vampire = new Entity<VampireComponent>(uid, component);
|
||||
|
||||
|
|
@ -336,7 +340,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
_actionEntities["ActionVampireUnnaturalStrength"] = vampire;
|
||||
}
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireSupernaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireSupernaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
|
||||
{
|
||||
var vampire = new Entity<VampireComponent>(uid, component);
|
||||
|
||||
|
|
@ -347,7 +351,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
|
||||
//Bestia
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBatform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBatform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireBatform");
|
||||
if (newEntity != null)
|
||||
|
|
@ -359,7 +363,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBatform", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBatform", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -369,7 +373,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
_actionEntities.Remove("ActionVampireBatform");
|
||||
}
|
||||
|
||||
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireMouseform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
|
||||
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireMouseform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
|
||||
{
|
||||
_action.AddAction(uid, ref newEntity , "ActionVampireMouseform");
|
||||
if (newEntity != null)
|
||||
|
|
@ -381,7 +385,7 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireMouseform", out entity))
|
||||
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireMouseform", out entity))
|
||||
{
|
||||
if (!TryComp(uid, out ActionsComponent? comp))
|
||||
return;
|
||||
|
|
@ -391,17 +395,6 @@ public sealed partial class VampireSystem : EntitySystem
|
|||
_actionEntities.Remove("ActionVampireMouseform");
|
||||
}
|
||||
}
|
||||
|
||||
private FixedPoint2 GetBloodEssence(EntityUid vampire)
|
||||
{
|
||||
if (!TryComp<VampireComponent>(vampire, out var comp))
|
||||
return 0;
|
||||
|
||||
if (!comp.Balance.TryGetValue(VampireComponent.CurrencyProto, out var val))
|
||||
return 0;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
private void DoSpaceDamage(Entity<VampireComponent> vampire)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ public sealed partial class ChangelingComponent : Component
|
|||
/// The status icon corresponding to the Changlings.
|
||||
/// </summary>
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "HivemindFaction";
|
||||
[DataField("changelingStatusIcon")]
|
||||
public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "HivemindFaction";
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ public sealed partial class LayingDownComponent : Component
|
|||
public float StandingUpTime { get; set; } = 1f;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public float SpeedModify { get; set; } = 0.4f;
|
||||
public float SpeedModify { get; set; } = 0.25f;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool AutoGetUp;
|
||||
|
|
|
|||
24
Content.Shared/Vampire/SharedVampireSystem.cs
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
using Content.Shared.Vampire.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
|
||||
namespace Content.Shared.Vampire;
|
||||
|
||||
public sealed class SharedVampireSystem : EntitySystem
|
||||
{
|
||||
public FixedPoint2 GetBloodEssence(EntityUid vampire)
|
||||
{
|
||||
if (!TryComp<VampireComponent>(vampire, out var comp))
|
||||
return 0;
|
||||
|
||||
if (comp.Balance != null && comp.Balance.TryGetValue(VampireComponent.CurrencyProto, out var val))
|
||||
return val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void SetAlertBloodAmount(VampireAlertComponent component, int amount)
|
||||
{
|
||||
component.BloodAmount = amount;
|
||||
Dirty(component.Owner, component);
|
||||
}
|
||||
}
|
||||
15
Content.Shared/Vampire/VampireAlertComponent.cs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
using Content.Shared.Alert;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.Vampire.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class VampireAlertComponent : Component
|
||||
{
|
||||
[DataField("vampireBloodAlert")]
|
||||
public ProtoId<AlertPrototype> BloodAlert { get; set; } = "VampireBlood";
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public int BloodAmount = 0;
|
||||
}
|
||||
|
|
@ -75,9 +75,6 @@ public sealed partial class VampireComponent : Component
|
|||
|
||||
[ValidatePrototypeId<VampirePowerProtype>]
|
||||
public static readonly string DrinkBloodPrototype = "DrinkBlood";
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "VampireFaction";
|
||||
|
||||
/// <summary>
|
||||
/// Total blood drank, counter for end of round screen
|
||||
|
|
@ -251,6 +248,14 @@ public enum VampireMutationUiKey : byte
|
|||
Key
|
||||
}
|
||||
|
||||
[NetSerializable, Serializable]
|
||||
public enum VampireVisualLayers : byte
|
||||
{
|
||||
Digit1,
|
||||
Digit2,
|
||||
Digit3
|
||||
}
|
||||
|
||||
/*[Serializable, NetSerializable]
|
||||
public enum VampirePowerKey : byte
|
||||
{
|
||||
|
|
|
|||
12
Content.Shared/Vampire/VampireIconComponent.cs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
using Content.Shared.StatusIcon;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.Vampire.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class VampireIconComponent : Component
|
||||
{
|
||||
[DataField("vampireStatusIcon")]
|
||||
public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "VampireFaction";
|
||||
}
|
||||
|
|
@ -43,16 +43,6 @@ blood-cult-name = Культ крови (Нар`Си)
|
|||
blood-cult-desc = Культ который идёт за богом Нар`Си, цель культа призвать своего покровителя который позже уничтожит станцию.
|
||||
economy-name = Экономика
|
||||
economy-desc = Добавление денег, зарплаты, почта будет давать деньги а вендоматы будут брать деньги за еду.
|
||||
extend-med-name = Расширение мед. отдела
|
||||
extend-med-desc = Добавление новых механик, ролей.
|
||||
pathologist-name = Паталогоанатом
|
||||
pathologist-desc = Новая роль мед.отдела. Задача которой следить за моргом.
|
||||
arena-name = Арена для призраков
|
||||
arena-desc = Арена где призраки могут занять своё время что-бы не летать по станции в ожидании конца раунда.
|
||||
limbo-name = Лимбо
|
||||
limbo-desc = Отдельный мирок для призраков где нет правил.
|
||||
taipan-name = Тайпан
|
||||
taipan-desc = Отдельная станция синдиката с своими задачами на смену.
|
||||
##########
|
||||
|
||||
# 2025 #
|
||||
|
|
@ -88,6 +78,16 @@ plasmamens-name = Раса плазмаменов
|
|||
plasmamens-desc = Раса крутых плазменных чувачков.
|
||||
centcomm-update-name = Обновление ЦК
|
||||
centcomm-update-desc = Обновление карты центрального коммандования и возможное обновление ролей.
|
||||
extend-med-name = Расширение мед. отдела
|
||||
extend-med-desc = Добавление новых механик, ролей.
|
||||
pathologist-name = Паталогоанатом
|
||||
pathologist-desc = Новая роль мед.отдела. Задача которой следить за моргом.
|
||||
arena-name = Арена для призраков
|
||||
arena-desc = Арена где призраки могут занять своё время что-бы не летать по станции в ожидании конца раунда.
|
||||
limbo-name = Лимбо
|
||||
limbo-desc = Отдельный мирок для призраков где нет правил.
|
||||
taipan-name = Тайпан
|
||||
taipan-desc = Отдельная станция синдиката с своими задачами на смену.
|
||||
##########
|
||||
|
||||
# 2026 #
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ uplink-clothing-backpack-syndie-siar52-name = Набор SIAR-52
|
|||
uplink-clothing-backpack-syndie-siar52-desc = Включает в себя пулемёт SIAR-52 и два магазина патрон.
|
||||
uplink-weapon-syndie-laser-minigun-name = UVL-21 «Виверна»
|
||||
uplink-weapon-syndie-laser-gun-name = S-13 «Чёрная мамба»
|
||||
uplink-weapon-bauer-127-name = винтовка Bauer SR-127
|
||||
|
||||
## Cyborgs
|
||||
|
||||
|
|
|
|||
|
|
@ -69,10 +69,11 @@ ban-panel-permanent = Постоянный
|
|||
ban-panel-ip-hwid-tooltip = Оставьте пустым и установите флажок ниже, чтобы использовать данные последнего подключения
|
||||
ban-panel-severity = Тяжесть:
|
||||
# Ban string
|
||||
server-ban-string = { $admin } создал бан на сервере с уровнем строгости { $severity }, который истекает { $expires } для [{ $name }, { $ip }, { $hwid }], с причиной: { $reason }
|
||||
server-ban-string = { $admin } создал бан на сервере с уровнем строгости { $severity }, который истекает { $expires } для [{ $name }, { $ip }, { $hwid }], с причиной: { $reason }, раунд: { $round }
|
||||
ban-panel-erase = Стереть сообщения в чате и игрока из раунда
|
||||
server-ban-string-never = никогда
|
||||
server-ban-string-no-pii = { $admin } установил серверный бан { $severity } тяжести, который истечёт { $expires } у { $name } с причиной: { $reason }
|
||||
server-ban-string-no-pii = { $admin } установил серверный бан { $severity } тяжести, который истечёт { $expires } у { $name } с причиной: { $reason }, раунд: { $round }
|
||||
server-ban-unknown-round = Неизвестный
|
||||
cmd-ban_exemption_get-arg-player = <player>
|
||||
# Kick on ban
|
||||
ban-kick-reason = You have been banned
|
||||
|
|
|
|||
|
|
@ -1749,7 +1749,7 @@ entities:
|
|||
- type: GridFill
|
||||
addComponents:
|
||||
- type: NukeOpsShuttle
|
||||
path: /Maps/Shuttles/infiltrator.yml
|
||||
path: /Maps/_Sunrise/Shuttles/infiltrator.yml # Sunrise-edit
|
||||
- uid: 2481
|
||||
components:
|
||||
- type: Transform
|
||||
|
|
|
|||
5667
Resources/Maps/_Sunrise/Shuttles/infiltrator.yml
Normal file
22
Resources/Prototypes/Alerts/vampire.yml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
- type: alert
|
||||
id: VampireBlood
|
||||
icons:
|
||||
- sprite: /Textures/Interface/Alerts/blood_counter.rsi
|
||||
state: background
|
||||
alertViewEntity: AlertVampireBloodSpriteView
|
||||
name: alerts-vampire-blood-name
|
||||
description: alerts-vampire-blood-desc
|
||||
|
||||
- type: entity
|
||||
id: AlertVampireBloodSpriteView
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: /Textures/Interface/Alerts/blood_counter.rsi
|
||||
layers:
|
||||
- map: [ "enum.AlertVisualLayers.Base" ]
|
||||
- map: [ "enum.VampireVisualLayers.Digit1" ]
|
||||
offset: -0.35, 0
|
||||
- map: [ "enum.VampireVisualLayers.Digit2" ]
|
||||
offset: -0.150, 0
|
||||
- map: [ "enum.VampireVisualLayers.Digit3" ]
|
||||
|
|
@ -1033,6 +1033,7 @@
|
|||
- DetectiveArmorVest
|
||||
- DetectiveCoat
|
||||
- DetectiveCoatGrey
|
||||
- DetectiveCoatDark # Sunrise-edit
|
||||
|
||||
- type: loadoutGroup
|
||||
id: SecurityCadetJumpsuit
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@
|
|||
- type: Objective
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_vampire.rsi
|
||||
state: deathsembrace
|
||||
state: survive_icon
|
||||
|
||||
- type: entity
|
||||
parent: [BaseVampireObjective, BaseLivingObjective]
|
||||
|
|
@ -162,10 +162,10 @@
|
|||
- type: Objective
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_vampire.rsi
|
||||
state: fangs_extended
|
||||
state: blood_drain_icon
|
||||
- type: NumberObjective
|
||||
min: 100
|
||||
max: 500
|
||||
min: 300
|
||||
max: 600
|
||||
title: objective-condition-drain-title
|
||||
description: objective-condition-drain-description
|
||||
- type: BloodDrainCondition
|
||||
|
|
@ -188,6 +188,13 @@
|
|||
revertOnDeath: false
|
||||
|
||||
#Vampire
|
||||
- type: polymorph
|
||||
id: VampireMouse
|
||||
configuration:
|
||||
entity: MobMouse
|
||||
revertOnDeath: true
|
||||
revertOnCrit: true
|
||||
|
||||
- type: polymorph
|
||||
id: VampireBat
|
||||
configuration:
|
||||
|
|
|
|||
|
|
@ -478,6 +478,9 @@
|
|||
- !type:OrganType
|
||||
type: Animal
|
||||
shouldHave: false
|
||||
- !type:OrganType
|
||||
type: Vampire
|
||||
shouldHave: false
|
||||
type: Local
|
||||
visualType: MediumCaution
|
||||
messages: [ "generic-reagent-effect-sick" ]
|
||||
|
|
@ -488,11 +491,17 @@
|
|||
- !type:OrganType
|
||||
type: Animal
|
||||
shouldHave: false
|
||||
- !type:OrganType
|
||||
type: Vampire
|
||||
shouldHave: false
|
||||
- !type:HealthChange
|
||||
conditions:
|
||||
- !type:OrganType
|
||||
type: Animal
|
||||
shouldHave: false
|
||||
- !type:OrganType
|
||||
type: Vampire
|
||||
shouldHave: false
|
||||
damage:
|
||||
types:
|
||||
Poison: 1
|
||||
|
|
@ -501,6 +510,9 @@
|
|||
- !type:OrganType
|
||||
type: Animal
|
||||
shouldHave: true
|
||||
- !type:OrganType
|
||||
type: Vampire
|
||||
shouldHave: true
|
||||
reagent: Protein
|
||||
amount: 0.5
|
||||
|
||||
|
|
|
|||
|
|
@ -66,11 +66,13 @@
|
|||
|
||||
- type: factionIcon
|
||||
id: VampireFaction
|
||||
isShaded: true
|
||||
priority: 11
|
||||
locationPreference: Left
|
||||
showTo:
|
||||
components:
|
||||
- ShowAntagIcons
|
||||
- Vampire
|
||||
- VampireIcon
|
||||
icon:
|
||||
sprite: /Textures/Interface/Misc/job_icons.rsi
|
||||
state: Vampire
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
- type: entity
|
||||
parent: ClothingBackpackDuffelSyndicateBundle
|
||||
id: ClothingBackpackDuffelSyndicateFilledBauer
|
||||
name: Bauer-127 bundle
|
||||
description: "The iconic Bauer-127 magazine rifle with 2 raspy magazines in the set."
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: WeaponRifleBauer127
|
||||
- id: MagazineBauer127Extended
|
||||
- id: MagazineBauer127Extended
|
||||
|
|
@ -232,6 +232,22 @@
|
|||
whitelist:
|
||||
tags:
|
||||
- NukeOpsUplink
|
||||
|
||||
- type: listing
|
||||
id: UplinkWeaponBauer127
|
||||
name: uplink-weapon-bauer-127-name
|
||||
productEntity: ClothingBackpackDuffelSyndicateFilledBauer
|
||||
description: uplink-weapon-bauer-127-name
|
||||
icon: { sprite: _Sunrise/Objects/Weapons/Guns/Snipers/bauer127/big.rsi, state: icon }
|
||||
cost:
|
||||
Telecrystal: 18
|
||||
categories:
|
||||
- UplinkWeaponry
|
||||
conditions:
|
||||
- !type:StoreWhitelistCondition
|
||||
whitelist:
|
||||
tags:
|
||||
- NukeOpsUplink
|
||||
|
||||
- type: listing
|
||||
id: UplinkHardsuitSyndieCommander
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
- type: loadout
|
||||
id: DetectiveCoatDark
|
||||
equipment:
|
||||
outerClothing: ClothingOuterCoatDetectiveDark
|
||||
|
|
@ -54,21 +54,16 @@
|
|||
name: Full Translation Of Everything
|
||||
desc: translation of all the items, menus. In order to simplify gameplay.
|
||||
state: Complete
|
||||
night-vision:
|
||||
id: night-vision
|
||||
name: Night Vision
|
||||
desc: NVD, night vision in some animals/race.
|
||||
state: Complete
|
||||
mechs:
|
||||
id: mechs
|
||||
name: Mechs
|
||||
desc: Controlled mechanoids, created to work in difficult places, as well as in facilitating the transportation of goods and other tasks where man himself can not cope.
|
||||
state: Partial
|
||||
state: Complete
|
||||
ipc:
|
||||
id: ipc
|
||||
name: IPC
|
||||
desc: A race of intelligent machines, in reworking.
|
||||
state: Partial
|
||||
state: InProgress
|
||||
blob:
|
||||
id: blob
|
||||
name: Blob
|
||||
|
|
@ -109,44 +104,24 @@
|
|||
name: Economy
|
||||
desc: Adding money, wages, the post office will give money and vendomats will take money for food.
|
||||
state: InProgress
|
||||
2025:
|
||||
name: 2025
|
||||
goals:
|
||||
extend-med:
|
||||
id: extend-med
|
||||
name: Medical Department Expansion
|
||||
desc: Adding new mechanics, roles.
|
||||
state: Planned
|
||||
pathologist:
|
||||
id: pathologist
|
||||
name: Pathologist
|
||||
desc: A new role for the medical department. To keep an eye on the morgue.
|
||||
state: Planned
|
||||
arena:
|
||||
id: arena
|
||||
name: Ghosts Arena
|
||||
desc: An arena where ghosts can occupy their time so they don't have to fly around the station waiting for the end of the round.
|
||||
state: Planned
|
||||
limbo:
|
||||
id: limbo
|
||||
name: Limbo
|
||||
desc: A separate world for ghosts where there are no rules.
|
||||
state: Planned
|
||||
taipan:
|
||||
id: taipan
|
||||
name: Taipan
|
||||
desc: A separate syndicate station with its own shift tasks.
|
||||
state: Planned
|
||||
2025:
|
||||
name: 2025
|
||||
goals:
|
||||
mail:
|
||||
id: mail
|
||||
name: Mail
|
||||
desc: Sending parcels to different parts of the station for which the station will receive money.
|
||||
state: InProgress
|
||||
state: Partial
|
||||
ai:
|
||||
id: ai
|
||||
name: AI
|
||||
desc: A new artificial intelligence profession aimed at helping the station destroy itself?
|
||||
state: Partial
|
||||
mail:
|
||||
id: mail
|
||||
name: Mail
|
||||
desc: Sending parcels to different parts of the station for which the station will receive money.
|
||||
state: InProgress
|
||||
borer:
|
||||
id: borer
|
||||
name: Brainworm
|
||||
|
|
@ -202,10 +177,20 @@
|
|||
name: A race of plasmamens
|
||||
desc: A race of cool plasma dudes.
|
||||
state: Planned
|
||||
centcomm-update:
|
||||
id: centcomm-update
|
||||
name: Centcomm Update
|
||||
desc: Central Command map update and possible role update.
|
||||
arena:
|
||||
id: arena
|
||||
name: Ghosts Arena
|
||||
desc: An arena where ghosts can occupy their time so they don't have to fly around the station waiting for the end of the round.
|
||||
state: Planned
|
||||
limbo:
|
||||
id: limbo
|
||||
name: Limbo
|
||||
desc: A separate world for ghosts where there are no rules.
|
||||
state: Planned
|
||||
taipan:
|
||||
id: taipan
|
||||
name: Taipan
|
||||
desc: A separate syndicate station with its own shift tasks.
|
||||
state: Planned
|
||||
2026:
|
||||
name: 2026
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@
|
|||
- Passive
|
||||
- PetsNT
|
||||
- Revolutionary
|
||||
- Changeling
|
||||
- Vampire
|
||||
|
||||
- type: npcFaction
|
||||
id: Revolutionary
|
||||
|
|
@ -98,4 +100,6 @@
|
|||
- NanoTrasen
|
||||
- Syndicate
|
||||
- Zombie
|
||||
- Revolutionary
|
||||
- Revolutionary
|
||||
- Changeling
|
||||
- Xeno
|
||||
|
After Width: | Height: | Size: 822 B |
|
|
@ -54,6 +54,12 @@
|
|||
},
|
||||
{
|
||||
"name": "fullpotential"
|
||||
},
|
||||
{
|
||||
"name": "survive_icon"
|
||||
},
|
||||
{
|
||||
"name": "blood_drain_icon"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 381 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/0.png
Normal file
|
After Width: | Height: | Size: 249 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/1.png
Normal file
|
After Width: | Height: | Size: 191 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/2.png
Normal file
|
After Width: | Height: | Size: 230 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/3.png
Normal file
|
After Width: | Height: | Size: 214 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/4.png
Normal file
|
After Width: | Height: | Size: 216 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/5.png
Normal file
|
After Width: | Height: | Size: 224 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/6.png
Normal file
|
After Width: | Height: | Size: 243 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/7.png
Normal file
|
After Width: | Height: | Size: 231 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/8.png
Normal file
|
After Width: | Height: | Size: 243 B |
BIN
Resources/Textures/Interface/Alerts/blood_counter.rsi/9.png
Normal file
|
After Width: | Height: | Size: 246 B |
|
After Width: | Height: | Size: 4.4 KiB |
|
|
@ -0,0 +1,73 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CLA",
|
||||
"copyright": "SUNRISE",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "background",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "0"
|
||||
},
|
||||
{
|
||||
"name": "1"
|
||||
},
|
||||
{
|
||||
"name": "2"
|
||||
},
|
||||
{
|
||||
"name": "3"
|
||||
},
|
||||
{
|
||||
"name": "4"
|
||||
},
|
||||
{
|
||||
"name": "5"
|
||||
},
|
||||
{
|
||||
"name": "6"
|
||||
},
|
||||
{
|
||||
"name": "7"
|
||||
},
|
||||
{
|
||||
"name": "8"
|
||||
},
|
||||
{
|
||||
"name": "9"
|
||||
}
|
||||
]
|
||||
}
|
||||