Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions Content.Client/Weapons/Ranged/Systems/GunSystem.Hybrid.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Events;

namespace Content.Client.Weapons.Ranged.Systems;

public sealed partial class GunSystem
{
private void InitializeHybrid()
{
SubscribeLocalEvent<HybridAmmoProviderComponent, UpdateAmmoCounterEvent>(OnHybridUpdateAmmo);
SubscribeLocalEvent<HybridAmmoProviderComponent, AmmoCounterControlEvent>(OnHybridControl);
}

private void OnHybridUpdateAmmo(EntityUid uid, HybridAmmoProviderComponent component, UpdateAmmoCounterEvent args)
{
if (args.Control is DefaultStatusControl control)
{
var ev = new GetAmmoCountEvent();
RaiseLocalEvent(uid, ref ev, false);
control.Update(ev.Count, ev.Capacity);
}
}

private void OnHybridControl(EntityUid uid, HybridAmmoProviderComponent component, AmmoCounterControlEvent args)
{
args.Control = new DefaultStatusControl();
}
}
1 change: 1 addition & 0 deletions Content.Client/Weapons/Ranged/Systems/GunSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ public override void Initialize()

InitializeMagazineVisuals();
InitializeSpentAmmo();
InitializeHybrid();
}

private void OnUpdateClientAmmo(EntityUid uid, AmmoCounterComponent ammoComp, ref UpdateClientAmmoEvent args)
Expand Down
125 changes: 125 additions & 0 deletions Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Events;
using Content.Server.Power.EntitySystems;
using Content.Shared.Power.Components;
using Robust.Shared.Containers;
using Robust.Shared.Map;
using Content.Server.Power.Components;

namespace Content.Server.Weapons.Ranged.Systems;

public sealed partial class GunSystem
{
private void InitializeHybrid()
{
SubscribeLocalEvent<HybridAmmoProviderComponent, TakeAmmoEvent>(OnHybridTakeAmmo);
SubscribeLocalEvent<HybridAmmoProviderComponent, GetAmmoCountEvent>(OnHybridGetAmmoCount);
SubscribeLocalEvent<HybridAmmoProviderComponent, EntInsertedIntoContainerMessage>(OnHybridMagazineInsert);
SubscribeLocalEvent<HybridAmmoProviderComponent, EntRemovedFromContainerMessage>(OnHybridMagazineRemove);
}

private void OnHybridMagazineInsert(EntityUid uid, HybridAmmoProviderComponent component, EntInsertedIntoContainerMessage args)
{
if (component.MagazineSlot != args.Container.ID)
return;
UpdateAmmoCount(uid);
}

private void OnHybridMagazineRemove(EntityUid uid, HybridAmmoProviderComponent component, EntRemovedFromContainerMessage args)
{
if (component.MagazineSlot != args.Container.ID)
return;
UpdateAmmoCount(uid);
}

private void OnHybridTakeAmmo(EntityUid uid, HybridAmmoProviderComponent component, TakeAmmoEvent args)
{
// 1. Получаем магазин из слота
var magazineEntity = GetMagazineEntity(uid);
if (magazineEntity == null)
{
args.Reason = Loc.GetString("gun-no-magazine");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Проверить наличие ключей локализации
for key in gun-no-magazine gun-no-ammo gun-no-battery gun-not-enough-energy; do
  echo "=== $key ==="
  rg -n "^${key}\s*=" --glob '*.ftl' || echo "НЕ НАЙДЕН"
done

Repository: Echo-DreamMaker/Sirius_Fallout

Length of output: 305


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- gun key usages ---'
rg -n --hidden --glob '!*.git/*' 'gun-(no-magazine|no-ammo|no-battery|not-enough-energy)' .

printf '%s\n' '--- localization files and nearby gun entries ---'
git ls-files '*.ftl' | head -80
rg -n -i --glob '*.ftl' 'gun|magazine|battery|enough.energy|no.ammo' . | head -200

printf '%s\n' '--- relevant source context ---'
sed -n '1,110p' Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs

Repository: Echo-DreamMaker/Sirius_Fallout

Length of output: 37095


Добавьте ключи локализации для сообщений оружия.

Ключи gun-no-magazine, gun-no-ammo, gun-no-battery и gun-not-enough-energy отсутствуют во всех .ftl. Они также используются в SharedFlamerAmmoSystem.cs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs` at line 41,
Добавьте ключи локализации gun-no-magazine, gun-no-ammo, gun-no-battery и
gun-not-enough-energy во все необходимые .ftl-файлы, включая сообщения для
оружия и использования в SharedFlamerAmmoSystem.cs, с корректными переводами и
доступностью для Loc.GetString.

return;
}

// 2. Проверяем патроны (BallisticAmmoProvider)
if (!TryComp<BallisticAmmoProviderComponent>(magazineEntity.Value, out var ballistic))
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}

// Получаем текущее количество патронов
var currentCount = GetBallisticShots(ballistic);
if (currentCount <= 0)
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}

// 3. Проверяем энергию (BatteryComponent)
if (!TryComp<BatteryComponent>(magazineEntity.Value, out var battery))
{
args.Reason = Loc.GetString("gun-no-battery");
return;
}
if (battery.CurrentCharge < component.FireCost)
{
args.Reason = Loc.GetString("gun-not-enough-energy");
return;
}
Comment on lines +60 to +70

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Батарея берётся только из магазина.

component.BatteryEntity не используется. Заряд читается из BatteryComponent магазина. Комментарий в HybridAmmoProviderComponent описывает другое поведение: «если null, используем свой uid». Приведите код и комментарий к одному поведению.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs` around lines 60 -
70, Синхронизируйте проверку энергии в обработчике стрельбы с контрактом
HybridAmmoProviderComponent: используйте component.BatteryEntity, а при его
отсутствии — magazineEntity.Value как источник BatteryComponent. Обновите
получение батареи и связанные проверки в текущем участке, чтобы заряд и списание
обращались к выбранной сущности, сохранив существующие причины отказа.


// 4. Тратим патрон: удаляем последний патрон из контейнера или уменьшаем UnspawnedCount
if (ballistic.Entities.Count > 0)
{
var lastEntity = ballistic.Entities[^1];
ballistic.Entities.RemoveAt(ballistic.Entities.Count - 1);
Containers.Remove(lastEntity, ballistic.Container);
QueueDel(lastEntity); // Удаляем сущность патрона (гильза не нужна)
}
else if (ballistic.UnspawnedCount > 0)
{
ballistic.UnspawnedCount--;
}
else
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}
Comment on lines +72 to +88

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Не изменяйте ballistic.Entities напрямую.

Containers.Remove сам поднимает EntRemovedFromContainerMessage, а BallisticAmmoProviderComponent обрабатывает это сообщение и удаляет сущность из Entities. Здесь список изменяется вручную до вызова Containers.Remove. Если Containers.Remove вернёт false, патрон исчезнет из счётчика, но останется в контейнере. Это рассинхронизирует состояние магазина.

Удаляйте патрон только через контейнер и проверяйте результат.

🐛 Предлагаемое исправление
         if (ballistic.Entities.Count > 0)
         {
             var lastEntity = ballistic.Entities[^1];
-            ballistic.Entities.RemoveAt(ballistic.Entities.Count - 1);
-            Containers.Remove(lastEntity, ballistic.Container);
+            if (!Containers.Remove(lastEntity, ballistic.Container))
+            {
+                args.Reason = Loc.GetString("gun-no-ammo");
+                return;
+            }
             QueueDel(lastEntity); // Удаляем сущность патрона (гильза не нужна)
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 4. Тратим патрон: удаляем последний патрон из контейнера или уменьшаем UnspawnedCount
if (ballistic.Entities.Count > 0)
{
var lastEntity = ballistic.Entities[^1];
ballistic.Entities.RemoveAt(ballistic.Entities.Count - 1);
Containers.Remove(lastEntity, ballistic.Container);
QueueDel(lastEntity); // Удаляем сущность патрона (гильза не нужна)
}
else if (ballistic.UnspawnedCount > 0)
{
ballistic.UnspawnedCount--;
}
else
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}
// 4. Тратим патрон: удаляем последний патрон из контейнера или уменьшаем UnspawnedCount
if (ballistic.Entities.Count > 0)
{
var lastEntity = ballistic.Entities[^1];
if (!Containers.Remove(lastEntity, ballistic.Container))
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}
QueueDel(lastEntity); // Удаляем сущность патрона (гильза не нужна)
}
else if (ballistic.UnspawnedCount > 0)
{
ballistic.UnspawnedCount--;
}
else
{
args.Reason = Loc.GetString("gun-no-ammo");
return;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs` around lines 72 -
88, В блоке расходования боеприпаса в GunSystem удалите прямое изменение
ballistic.Entities: передайте последний патрон в Containers.Remove и проверьте
успешность операции. Учитывайте UnspawnedCount только если контейнерных
сущностей нет; при неуспешном удалении не изменяйте счётчики и обработайте
отсутствие боеприпаса через существующий gun-no-ammo путь.


// 5. Тратим энергию
_battery.UseCharge(magazineEntity.Value, component.FireCost);

// 6. Создаём снаряд в координатах выстрела
var fromCoordinates = args.Coordinates;
var mapCoords = fromCoordinates.ToMap(EntityManager, TransformSystem);
var projectile = Spawn(component.Prototype, mapCoords);

// 7. Добавляем снаряд в список для выстрела (основной GunSystem обработает его)
args.Ammo.Add((projectile, EnsureShootable(projectile)));

// 8. Обновляем счётчик на клиенте
Dirty(magazineEntity.Value, ballistic);
UpdateAmmoCount(uid);
}
Comment on lines +35 to +104

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Обработчик игнорирует args.Shots.

TakeAmmoEvent.Shots задаёт количество запрошенных выстрелов. Другие провайдеры (например, BallisticAmmoProvider) выдают до Shots единиц боеприпасов за одно событие. Здесь всегда выдаётся ровно один снаряд. При FullAuto или высоком fireRate оружие будет стрелять медленнее ожидаемого.

Оберните шаги 2–7 в цикл по args.Shots и прерывайте его при нехватке патронов или энергии.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs` around lines 35 -
104, Update OnHybridTakeAmmo to process up to args.Shots requests instead of
always creating one projectile. Wrap the ammo, energy, projectile creation, and
args.Ammo addition flow in a loop, stopping when ammunition or battery charge is
insufficient; preserve the existing failure reason and ensure each successful
iteration consumes one round, spends FireCost, and updates the ballistic state
appropriately.


private void OnHybridGetAmmoCount(EntityUid uid, HybridAmmoProviderComponent component, ref GetAmmoCountEvent args)
{
var magazineEntity = GetMagazineEntity(uid);
if (magazineEntity != null && TryComp<BallisticAmmoProviderComponent>(magazineEntity.Value, out var ballistic))
{
args.Count = GetBallisticShots(ballistic);
args.Capacity = ballistic.Capacity;
}
else
{
args.Count = 0;
args.Capacity = 0;
}
}

private int GetBallisticShots(BallisticAmmoProviderComponent component)
{
return component.UnspawnedCount + component.Entities.Count;
}
}
15 changes: 7 additions & 8 deletions Content.Server/Weapons/Ranged/Systems/GunSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ public override void Initialize()
SubscribeLocalEvent<BallisticAmmoProviderComponent, PriceCalculationEvent>(OnBallisticPrice);
Subs.CVar(_config, PerformanceCVars.GunPredictionAabbEnlargement, v => _lagCompAabbEnlargement = v, true);
Subs.CVar(_config, PerformanceCVars.GunPredictionHitscanSearchPadding, v => _lagCompHitscanSearchPadding = v, true);
InitializeHybrid();
}

private void OnBallisticPrice(EntityUid uid, BallisticAmmoProviderComponent component, ref PriceCalculationEvent args)
Expand Down Expand Up @@ -170,11 +171,7 @@ void MarkPredicted(EntityUid uid)
if (!cartridge.Spent)
{
var uid = Spawn(cartridge.Prototype, fromEnt);
// #Misfits Add: применяем бонус к снаряду
ApplyBonusDamageToProjectile(uid, gunUid);
base.ShootOrThrow(uid, mapDirection, gunVelocity, gun, gunUid, user);
shotProjectiles.Add(uid);
MarkPredicted(uid);
CreateAndFireProjectiles(uid, cartridge);

RaiseLocalEvent(ent!.Value, new AmmoShotEvent()
{
Expand All @@ -192,24 +189,26 @@ void MarkPredicted(EntityUid uid)
Audio.PlayPredicted(gun.SoundEmpty, gunUid, user);
}

// Something like ballistic might want to leave it in the container still
if (!cartridge.DeleteOnSpawn && !Containers.IsEntityInContainer(ent!.Value))
EjectCartridge(ent.Value, angle);

Dirty(ent!.Value, cartridge);
break;

// Ammo shoots itself
case AmmoComponent newAmmo:
if (ent == null)
break;
// #Sirius Change: используем обновлённую функцию с бонусом
CreateAndFireProjectiles(ent.Value, newAmmo);
break;

break;
case HitscanPrototype hitscan:
if (TryResolveGunHitscan(gunUid, out var resolvedHitscan))
hitscan = resolvedHitscan;

EntityUid? lastHit = null;

var from = fromMap;
var fromEffect = GetShotEffectCoordinates(fromMap);
var dir = mapDirection.Normalized();
Expand All @@ -236,6 +235,7 @@ void MarkPredicted(EntityUid uid)
}

lastHit = hit;

FireEffects(fromEffect, distance, dir.Normalized().ToAngle(), hitscan, hit, userSession);

var ev = new HitScanReflectAttemptEvent(user, gunUid, hitscan.Reflective, dir, false);
Expand Down Expand Up @@ -382,7 +382,6 @@ void CreateAndFireProjectiles(EntityUid ammoEnt, AmmoComponent ammoComp)
return shotProjectiles;
}


private bool TryGetHitscanResult(
MapCoordinates from,
Vector2 direction,
Expand Down
2 changes: 1 addition & 1 deletion Content.Shared/Weapons/Ranged/Components/AmmoComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public partial class AmmoComponent : Component, IShootable
{
// Muzzle flash stored on ammo because if we swap a gun to whatever we may want to override it.

[ViewVariables(VVAccess.ReadWrite), DataField("muzzleFlash", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
[ViewVariables(VVAccess.ReadWrite), DataField("muzzleFlash", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string? MuzzleFlash = "MuzzleFlashEffect";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;

namespace Content.Shared.Weapons.Ranged.Components;

[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class HybridAmmoProviderComponent : Component
{
[DataField("proto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string Prototype = default!;

[DataField("capacity"), AutoNetworkedField]
public int Capacity = 10;

[DataField("count"), AutoNetworkedField]
public int Count = 10;

[DataField("fireCost")]
public float FireCost = 100f;

// Ссылка на батарею (если null, используем свой uid)
[DataField("battery")]
public EntityUid? BatteryEntity;

// Ссылка на слот магазина (для автоматической загрузки патронов)
[DataField("magazineSlot")]
public string? MagazineSlot;
Comment on lines +13 to +28

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Контракт HybridAmmoProviderComponent не реализован: состояние боеприпасов не доходит до клиента. Компонент объявляет сетевые поля Count, Capacity и поле BatteryEntity, но серверная логика их не заполняет и не читает. Из-за этого клиентский счётчик боеприпасов всегда показывает 0.

  • Content.Shared/Weapons/Ranged/Components/HybridAmmoProviderComponent.cs#L13-L28: либо удалите Capacity, Count и BatteryEntity, либо сделайте их единственным источником состояния для клиента.
  • Content.Client/Weapons/Ranged/Systems/GunSystem.Hybrid.cs#L14-L22: замените RaiseLocalEvent(uid, ref ev, false) на чтение сетевых полей компонента, либо перенесите обработчик GetAmmoCountEvent в общий код.
  • Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs#L60-L70: используйте component.BatteryEntity при выборе источника заряда и обновляйте Count/Capacity с вызовом Dirty после каждого выстрела.
📍 Affects 3 files
  • Content.Shared/Weapons/Ranged/Components/HybridAmmoProviderComponent.cs#L13-L28 (this comment)
  • Content.Client/Weapons/Ranged/Systems/GunSystem.Hybrid.cs#L14-L22
  • Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs#L60-L70
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/Weapons/Ranged/Components/HybridAmmoProviderComponent.cs`
around lines 13 - 28, Состояние боеприпасов HybridAmmoProviderComponent не
синхронизируется с клиентом. В
Content.Shared/Weapons/Ranged/Components/HybridAmmoProviderComponent.cs:13-28
сделайте Count, Capacity и BatteryEntity единственным источником состояния; в
Content.Client/Weapons/Ranged/Systems/GunSystem.Hybrid.cs:14-22 замените
локальное событие RaiseLocalEvent чтением сетевых полей компонента либо
перенесите GetAmmoCountEvent в общий код; в
Content.Server/Weapons/Ranged/Systems/GunSystem.Hybrid.cs:60-70 используйте
component.BatteryEntity для выбора источника заряда, обновляйте Count и Capacity
после выстрела и вызывайте Dirty.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Уберите неиспользуемые поля или начните их использовать.

Поля Capacity, Count и BatteryEntity не читаются ни серверным GunSystem.Hybrid.cs, ни клиентским. Счётчик боеприпасов берётся из BallisticAmmoProviderComponent магазина, а заряд — из BatteryComponent магазина. Сетевая синхронизация Capacity и Count создаёт мёртвое состояние: значения из прототипа (10/10) никогда не совпадут с реальным количеством патронов, и будущий код может прочитать их как истину.

Дополнительно: EntityUid в DataField не задаётся из YAML-прототипа. Если поле нужно только в рантайме, объявите его без DataField.

♻️ Предлагаемое изменение
-    [DataField("capacity"), AutoNetworkedField]
-    public int Capacity = 10;
-
-    [DataField("count"), AutoNetworkedField]
-    public int Count = 10;
-
     [DataField("fireCost")]
     public float FireCost = 100f;
 
-    // Ссылка на батарею (если null, используем свой uid)
-    [DataField("battery")]
-    public EntityUid? BatteryEntity;
+    // Ссылка на батарею (если null, используем магазин)
+    public EntityUid? BatteryEntity;
 
     // Ссылка на слот магазина (для автоматической загрузки патронов)
     [DataField("magazineSlot")]
     public string? MagazineSlot;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/Weapons/Ranged/Components/HybridAmmoProviderComponent.cs`
around lines 13 - 28, Remove the unused Capacity, Count, and BatteryEntity
fields from HybridAmmoProviderComponent, including their DataField and
AutoNetworkedField attributes. Keep MagazineSlot because it is used for
automatic magazine loading, and do not introduce runtime-only EntityUid state
unless it is actually required; if retained, remove its DataField attribute.

}
7 changes: 0 additions & 7 deletions Resources/Maps/N14/SunnyvaleSurface.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1146355,13 +1146355,6 @@ entities:
- type: Transform
pos: 150.5,181.5
parent: 1
- proto: N14ContractBadgeBronze
entities:
- uid: 154397
components:
- type: Transform
pos: 117.60662,9.527673
parent: 1
- proto: N14ControlTerminalButton
entities:
- uid: 154398
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,22 @@
- type: N14PowerArmor
requiresProficiency: false
- type: PowerArmorIntegrity
maxIntegrity: 450
brokenBleedthroughRatio: 1.0
disableServosLock: true
- type: Armor
disableServosLock: true
- type: Armor
modifiers:
coefficients:
Blunt: 0.60
Slash: 0.60
Piercing: 0.60
Heat: 0.60
Radiation: 0.60
Blunt: 0.45
Slash: 0.45
Piercing: 0.45
Heat: 0.3
Caustic: 0.65
Radiation: 0.8
flatReductions: #sirius change
Blunt: 5
Slash: 5
Piercing: 5
Heat: 8
Caustic: 2
- type: ClothingSpeedModifier # #Misfits Tweak - standalone 35% slowdown, no fusion core required
walkModifier: 0.70
sprintModifier: 0.70
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
parent: BaseItem
components:
- type: Sprite
sprite: Objects/Materials/materials.rsi
sprite: _Nuclear14/Objects/Misc/materials.rsi
state: firewood # #Misfits Fix - Natural/wood.rsi does not exist; wood state in materials.rsi used instead
- type: Item
size: Normal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,10 @@
shoes: N14ClothingBootsCombatFilled
ears: N14ClothingHeadsetNCR # NCR radio earpiece
belt: ClothingBeltNCR
pocket1: N14WeaponMinigun # #Misfits Tweak - downgraded to minigun again -bill
pocket2: RadioHandheld
id: N14IDNCRDogtagWS # Specialist-tier dogtag
innerClothingSkirt: N14ClothingOfficerUniformNCRDesert
satchel: N14ClothingBackpackSatchelNCRFilled
storage:
back:
- N14MagazineMinigun5mm # extra 5mm box -bill

- type: playTimeTracker
id: NCRHeavyTrooper
Loading
Loading