Всякие приколы с телекристаллами (#564)
* Crossbow telecrystal * Other stuff * Less power
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
using Content.Server.Body.Systems;
|
||||
using System.Linq;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.GameTicking.Rules.Components;
|
||||
using Content.Server.Ghost.Components;
|
||||
using Content.Server.Kitchen.Components;
|
||||
using Content.Server.Mind.Components;
|
||||
using Content.Server.Roles;
|
||||
using Content.Shared.Body.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Nutrition.Components;
|
||||
@@ -59,6 +64,16 @@ public sealed class SharpSystem : EntitySystem
|
||||
return;
|
||||
}
|
||||
|
||||
// WD START
|
||||
if (butcher.SyndieRoleRequired && !HasComp<NukeOperativeComponent>(user) && !HasComp<GhostComponent>(user) &&
|
||||
TryComp(user, out MindContainerComponent? mc) && mc.Mind != null &&
|
||||
!mc.Mind.Roles.OfType<TraitorRole>().Any())
|
||||
{
|
||||
_popupSystem.PopupEntity("Вы не можете разделать столь милое существо.", user, user);
|
||||
return;
|
||||
}
|
||||
// WD END
|
||||
|
||||
if (TryComp<MobStateComponent>(target, out var mobState) && !_mobStateSystem.IsDead(target, mobState))
|
||||
return;
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ public sealed class PoweredSystem : EntitySystem
|
||||
[Dependency] private readonly BatterySystem _battery = default!;
|
||||
|
||||
private const string CellSlot = "cell_slot";
|
||||
private const string CrystalSlot = "crystal_slot";
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -27,7 +28,7 @@ public sealed class PoweredSystem : EntitySystem
|
||||
if (!TryGetBatteryComponent(uid, out var battery, out var batteryUid))
|
||||
return;
|
||||
|
||||
var (factor, charge) = GetFactor(component, battery, batteryUid.Value);
|
||||
var (factor, charge) = GetFactor(uid, component, battery, batteryUid.Value);
|
||||
|
||||
// Чтобы затриггерить взрыв на полную мощь, если есть плазма в батарейке
|
||||
_battery.SetCharge(batteryUid.Value, battery.CurrentCharge, battery);
|
||||
@@ -54,17 +55,24 @@ public sealed class PoweredSystem : EntitySystem
|
||||
!TryGetBatteryComponent(uid, out var battery, out var batteryUid))
|
||||
return 1f;
|
||||
|
||||
return 1f + GetFactor(component, battery, batteryUid.Value).Item1;
|
||||
return 1f + GetFactor(uid, component, battery, batteryUid.Value).Item1;
|
||||
}
|
||||
|
||||
private (float, float) GetFactor(PoweredComponent component, BatteryComponent battery, EntityUid batteryUid)
|
||||
private (float, float) GetFactor(EntityUid uid, PoweredComponent component, BatteryComponent battery, EntityUid batteryUid)
|
||||
{
|
||||
DebugTools.Assert(component.Charge != 0f);
|
||||
var charge = MathF.Min(battery.CurrentCharge, component.Charge);
|
||||
var factor = charge / component.Charge;
|
||||
var multiplier = 1f;
|
||||
|
||||
if (TryComp(batteryUid, out RiggableComponent? rig) && rig.IsRigged)
|
||||
factor *= 2f;
|
||||
multiplier += 1f;
|
||||
|
||||
if (_containers.TryGetContainer(uid, CrystalSlot, out var container) && container is ContainerSlot slot &&
|
||||
slot.ContainedEntity.HasValue)
|
||||
multiplier += 1f;
|
||||
|
||||
factor *= multiplier;
|
||||
|
||||
return (factor, charge);
|
||||
}
|
||||
|
||||
@@ -219,6 +219,9 @@ namespace Content.Shared.Containers.ItemSlots
|
||||
[DataField("priority")]
|
||||
public int Priority = 0;
|
||||
|
||||
[DataField("maxStackAmount")] // WD
|
||||
public int MaxStackAmount;
|
||||
|
||||
/// <summary>
|
||||
/// If false, errors when adding an item slot with a duplicate key are suppressed. Local==true implies that
|
||||
/// the slot was added via client component state handling.
|
||||
|
||||
@@ -8,6 +8,7 @@ using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Stacks;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
@@ -206,6 +207,20 @@ namespace Content.Shared.Containers.ItemSlots
|
||||
if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap, popup: args.User))
|
||||
continue;
|
||||
|
||||
// WD START
|
||||
if (slot.MaxStackAmount > 0 && TryComp(args.Used, out StackComponent? stack) &&
|
||||
stack.Count > slot.MaxStackAmount)
|
||||
{
|
||||
if (_netManager.IsClient && _timing.IsFirstTimePredicted)
|
||||
{
|
||||
_popupSystem.PopupEntity(
|
||||
$"Невозможно одновременно вставить {stack.Count}, максимум: {slot.MaxStackAmount}.", uid,
|
||||
args.User);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// WD END
|
||||
|
||||
// Drop the held item onto the floor. Return if the user cannot drop.
|
||||
if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands))
|
||||
return;
|
||||
|
||||
@@ -18,6 +18,9 @@ namespace Content.Shared.Nutrition.Components
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("butcheringType")]
|
||||
public ButcheringType Type = ButcheringType.Knife;
|
||||
|
||||
[DataField("syndieRoleRequired")] // WD
|
||||
public bool SyndieRoleRequired;
|
||||
|
||||
/// <summary>
|
||||
/// Prevents butchering same entity on two and more spikes simultaneously and multiple doAfters on the same Spike
|
||||
/// </summary>
|
||||
|
||||
@@ -531,6 +531,7 @@
|
||||
interactSuccessSound:
|
||||
path: /Audio/Animals/fox_squeak.ogg
|
||||
- type: Butcherable
|
||||
syndieRoleRequired: true
|
||||
spawned:
|
||||
- id: FoodMeat
|
||||
amount: 3
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
- type: Currency
|
||||
price:
|
||||
Telecrystal: 1
|
||||
- type: Tag
|
||||
tags:
|
||||
- Telecrystal
|
||||
|
||||
- type: entity
|
||||
parent: Telecrystal
|
||||
|
||||
@@ -34,17 +34,24 @@
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
cell_slot: !type:ContainerSlot
|
||||
crystal_slot: !type:ContainerSlot
|
||||
- type: PowerCellSlot
|
||||
cellSlotId: cell_slot
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
cell_slot:
|
||||
name: power-cell-slot-component-slot-name-default
|
||||
crystal_slot:
|
||||
name: Кристалл
|
||||
whitelist:
|
||||
tags:
|
||||
- Telecrystal
|
||||
maxStackAmount: 1
|
||||
- type: Drawable
|
||||
- type: Appearance
|
||||
- type: ModifyDamageOnShoot
|
||||
addEmbedding: true
|
||||
offset: 0.2,0.2
|
||||
offset: 0.1,0.1
|
||||
damage:
|
||||
types:
|
||||
Piercing: 15
|
||||
|
||||
@@ -119,6 +119,14 @@
|
||||
- to: snatcherprod
|
||||
steps:
|
||||
- material: Telecrystal
|
||||
traitorOnly: true
|
||||
- node: snatcherprod
|
||||
entity: Snatcherprod
|
||||
edges:
|
||||
- to: rod
|
||||
steps:
|
||||
- tool: Cutting
|
||||
doAfter: 5
|
||||
completed:
|
||||
- !type:SpawnPrototype
|
||||
prototype: Telecrystal1
|
||||
- !type:EmptyAllContainers
|
||||
|
||||
@@ -39,3 +39,6 @@
|
||||
|
||||
- type: Tag
|
||||
id: WallMountConsoleElectronics
|
||||
|
||||
- type: Tag
|
||||
id: Telecrystal
|
||||
|
||||
Reference in New Issue
Block a user