Stable merge (#38822)
@@ -102,6 +102,8 @@ public static class MidiParser
|
||||
// 0x03 is TrackName,
|
||||
// 0x04 is InstrumentName
|
||||
|
||||
// This string can potentially contain control characters, including 0x00 which can cause problems if it ends up in database entries via admin logs
|
||||
// we sanitize TrackName and InstrumentName after they have been send to the server
|
||||
var text = Encoding.ASCII.GetString(metaData, 0, (int)metaLength);
|
||||
switch (metaType)
|
||||
{
|
||||
|
||||
@@ -156,6 +156,15 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
foreach (var t in msg.Tracks)
|
||||
{
|
||||
// Remove any control characters that may be part of the midi file so they don't end up in the admin logs.
|
||||
t?.SanitizeFields();
|
||||
// Truncate any track names too long.
|
||||
t?.TruncateFields(_cfg.GetCVar(CCVars.MidiMaxChannelNameLength));
|
||||
}
|
||||
|
||||
var tracksString = string.Join("\n",
|
||||
msg.Tracks
|
||||
.Where(t => t != null)
|
||||
@@ -166,12 +175,6 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
|
||||
LogImpact.Low,
|
||||
$"{ToPrettyString(args.SenderSession.AttachedEntity)} set the midi channels for {ToPrettyString(uid)} to {tracksString}");
|
||||
|
||||
// Truncate any track names too long.
|
||||
foreach (var t in msg.Tracks)
|
||||
{
|
||||
t?.TruncateFields(_cfg.GetCVar(CCVars.MidiMaxChannelNameLength));
|
||||
}
|
||||
|
||||
activeInstrument.Tracks = msg.Tracks;
|
||||
|
||||
Dirty(uid, activeInstrument);
|
||||
|
||||
@@ -20,7 +20,7 @@ public sealed class NameIdentifierSystem : EntitySystem
|
||||
/// Free IDs available per <see cref="NameIdentifierGroupPrototype"/>.
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
public readonly Dictionary<string, List<int>> CurrentIds = new();
|
||||
public readonly Dictionary<string, List<int>> CurrentIds = [];
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -35,18 +35,22 @@ public sealed class NameIdentifierSystem : EntitySystem
|
||||
InitialSetupPrototypes();
|
||||
}
|
||||
|
||||
private void OnComponentShutdown(EntityUid uid, NameIdentifierComponent component, ComponentShutdown args)
|
||||
private void OnComponentShutdown(Entity<NameIdentifierComponent> ent, ref ComponentShutdown args)
|
||||
{
|
||||
if (CurrentIds.TryGetValue(component.Group, out var ids))
|
||||
if (ent.Comp.Group is null)
|
||||
return;
|
||||
|
||||
if (CurrentIds.TryGetValue(ent.Comp.Group, out var ids) && ids.Count > 0)
|
||||
{
|
||||
// Avoid inserting the value right back at the end or shuffling in place:
|
||||
// just pick a random spot to put it and then move that one to the end.
|
||||
var randomIndex = _robustRandom.Next(ids.Count);
|
||||
var random = ids[randomIndex];
|
||||
ids[randomIndex] = component.Identifier;
|
||||
ids[randomIndex] = ent.Comp.Identifier;
|
||||
ids.Add(random);
|
||||
}
|
||||
_nameModifier.RefreshNameModifiers(uid);
|
||||
|
||||
_nameModifier.RefreshNameModifiers(ent.Owner);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -83,46 +87,53 @@ public sealed class NameIdentifierSystem : EntitySystem
|
||||
: $"{randomVal}";
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, NameIdentifierComponent component, MapInitEvent args)
|
||||
private void OnMapInit(Entity<NameIdentifierComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<NameIdentifierGroupPrototype>(component.Group, out var group))
|
||||
if (ent.Comp.Group is null)
|
||||
return;
|
||||
|
||||
if (!_prototypeManager.TryIndex(ent.Comp.Group, out var group))
|
||||
return;
|
||||
|
||||
int id;
|
||||
string uniqueName;
|
||||
|
||||
// If it has an existing valid identifier then use that, otherwise generate a new one.
|
||||
if (component.Identifier != -1 &&
|
||||
CurrentIds.TryGetValue(component.Group, out var ids) &&
|
||||
ids.Remove(component.Identifier))
|
||||
if (ent.Comp.Identifier != -1 &&
|
||||
CurrentIds.TryGetValue(ent.Comp.Group, out var ids) &&
|
||||
ids.Remove(ent.Comp.Identifier))
|
||||
{
|
||||
id = component.Identifier;
|
||||
id = ent.Comp.Identifier;
|
||||
uniqueName = group.Prefix is not null
|
||||
? $"{group.Prefix}-{id}"
|
||||
: $"{id}";
|
||||
}
|
||||
else
|
||||
{
|
||||
uniqueName = GenerateUniqueName(uid, group, out id);
|
||||
component.Identifier = id;
|
||||
uniqueName = GenerateUniqueName(ent, group, out id);
|
||||
ent.Comp.Identifier = id;
|
||||
}
|
||||
|
||||
component.FullIdentifier = group.FullName
|
||||
ent.Comp.FullIdentifier = group.FullName
|
||||
? uniqueName
|
||||
: $"({uniqueName})";
|
||||
|
||||
Dirty(uid, component);
|
||||
_nameModifier.RefreshNameModifiers(uid);
|
||||
Dirty(ent);
|
||||
_nameModifier.RefreshNameModifiers(ent.Owner);
|
||||
}
|
||||
|
||||
private void OnRefreshNameModifiers(Entity<NameIdentifierComponent> ent, ref RefreshNameModifiersEvent args)
|
||||
{
|
||||
if (ent.Comp.Group is null)
|
||||
return;
|
||||
|
||||
// Don't apply the modifier if the component is being removed
|
||||
if (ent.Comp.LifeStage > ComponentLifeStage.Running)
|
||||
return;
|
||||
|
||||
if (!_prototypeManager.TryIndex<NameIdentifierGroupPrototype>(ent.Comp.Group, out var group))
|
||||
if (!_prototypeManager.TryIndex(ent.Comp.Group, out var group))
|
||||
return;
|
||||
|
||||
var format = group.FullName ? "name-identifier-format-full" : "name-identifier-format-append";
|
||||
// We apply the modifier with a low priority to keep it near the base name
|
||||
// "Beep (Si-4562) the zombie" instead of "Beep the zombie (Si-4562)"
|
||||
@@ -188,13 +199,13 @@ public sealed class NameIdentifierSystem : EntitySystem
|
||||
|
||||
foreach (var proto in set.Modified.Values)
|
||||
{
|
||||
var name_proto = (NameIdentifierGroupPrototype) proto;
|
||||
var name_proto = (NameIdentifierGroupPrototype)proto;
|
||||
|
||||
// Only bother adding new ones.
|
||||
if (CurrentIds.ContainsKey(proto.ID))
|
||||
continue;
|
||||
|
||||
var ids = GetOrCreateIdList(name_proto);
|
||||
var ids = GetOrCreateIdList(name_proto);
|
||||
FillGroup(name_proto, ids);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections;
|
||||
using System.Text;
|
||||
using Robust.Shared.Audio.Midi;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
@@ -207,6 +208,18 @@ public sealed class MidiTrack
|
||||
ProgramName = Truncate(ProgramName, limit);
|
||||
}
|
||||
|
||||
public void SanitizeFields()
|
||||
{
|
||||
if (InstrumentName != null)
|
||||
InstrumentName = Sanitize(InstrumentName);
|
||||
|
||||
if (TrackName != null)
|
||||
TrackName = Sanitize(TrackName);
|
||||
|
||||
if (ProgramName != null)
|
||||
ProgramName = Sanitize(ProgramName);
|
||||
}
|
||||
|
||||
private const string Postfix = "…";
|
||||
// TODO: Make a general method to use in RT? idk if we have that.
|
||||
private string Truncate(string input, int limit)
|
||||
@@ -218,4 +231,17 @@ public sealed class MidiTrack
|
||||
|
||||
return input.Substring(0, truncatedLength) + Postfix;
|
||||
}
|
||||
|
||||
private static string Sanitize(string input)
|
||||
{
|
||||
var sanitized = new StringBuilder(input.Length);
|
||||
|
||||
foreach (char c in input)
|
||||
{
|
||||
if (!char.IsControl(c) && c <= 127) // no control characters, only ASCII
|
||||
sanitized.Append(c);
|
||||
}
|
||||
|
||||
return sanitized.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.NameIdentifier;
|
||||
|
||||
@@ -9,18 +9,18 @@ namespace Content.Shared.NameIdentifier;
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class NameIdentifierComponent : Component
|
||||
{
|
||||
[DataField("group", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<NameIdentifierGroupPrototype>))]
|
||||
public string Group = string.Empty;
|
||||
[DataField]
|
||||
public ProtoId<NameIdentifierGroupPrototype>? Group;
|
||||
|
||||
/// <summary>
|
||||
/// The randomly generated ID for this entity.
|
||||
/// </summary>
|
||||
[DataField("identifier"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
[DataField, AutoNetworkedField]
|
||||
public int Identifier = -1;
|
||||
|
||||
/// <summary>
|
||||
/// The full name identifier for this entity.
|
||||
/// </summary>
|
||||
[DataField("fullIdentifier"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
[DataField, AutoNetworkedField]
|
||||
public string FullIdentifier = string.Empty;
|
||||
}
|
||||
|
||||
@@ -3565,15 +3565,6 @@
|
||||
id: 8704
|
||||
time: '2025-06-21T22:23:39.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/38486
|
||||
- author: keronshb
|
||||
changes:
|
||||
- message: Added the Hypereutactic Blade back to the Traitor Uplink
|
||||
type: Add
|
||||
- message: Added the Hypereutatic Blade to the Nukie uplink
|
||||
type: Add
|
||||
id: 8705
|
||||
time: '2025-06-22T16:50:59.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/37182
|
||||
- author: Cojoke-dot
|
||||
changes:
|
||||
- message: Pacifists can now use the Staff of Healing
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
# Scurrets from Planet Wawa have two parts to their name - a 'chosen' and 'qualitative' name.
|
||||
|
||||
# The chosen name is picked by the scurret themselves,
|
||||
# encompassing a trait or value they hold themselves
|
||||
# to or have a high value for. Scurrets sometimes change this
|
||||
# name to denote an important moment in their life.
|
||||
|
||||
# It appears to be common for scurret sets to share the same
|
||||
# chosen name, with the gaining of a pup's own chosen name
|
||||
# signalling their transition to adulthood in the community.
|
||||
|
||||
# Given the scurret language is untranslated, these names are
|
||||
# usually guessed via charades or Pictionary.
|
||||
|
||||
# When all else fails, to NT and her crews, Wa is as good a name as any.
|
||||
|
||||
names-scurret-first-dataset-1 = Wa
|
||||
names-scurret-first-dataset-2 = Calm
|
||||
names-scurret-first-dataset-3 = Contented
|
||||
@@ -34,3 +50,18 @@ names-scurret-first-dataset-33 = Wise
|
||||
names-scurret-first-dataset-34 = Alert
|
||||
names-scurret-first-dataset-35 = Uplifting
|
||||
names-scurret-first-dataset-36 = Considerate
|
||||
names-scurret-first-dataset-37 = Surviving
|
||||
names-scurret-first-dataset-38 = Meditating
|
||||
names-scurret-first-dataset-39 = Hunting
|
||||
names-scurret-first-dataset-40 = Watching
|
||||
names-scurret-first-dataset-41 = Resting
|
||||
names-scurret-first-dataset-42 = Delivering
|
||||
names-scurret-first-dataset-43 = Swimming
|
||||
names-scurret-first-dataset-44 = Swinging
|
||||
names-scurret-first-dataset-45 = Exploding
|
||||
names-scurret-first-dataset-46 = Romancing
|
||||
names-scurret-first-dataset-47 = Far-Seeing
|
||||
names-scurret-first-dataset-48 = Loyal
|
||||
names-scurret-first-dataset-49 = Inquisitive
|
||||
# After consulting with lawyers, NT added this one to the dictionary.
|
||||
names-scurret-first-dataset-50 = Legally Distinct
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
# Scurrets from Planet Wawa have two parts to their name - a 'chosen' and 'qualitative' name.
|
||||
|
||||
# The qualitative name is usually related to an important feature
|
||||
# of Wawa's wetland habitats that the scurret is associated with
|
||||
# by their community.
|
||||
|
||||
# Scurret pups, due to both their quantity and complete lack
|
||||
# of any survival instinct, lack a qualitative name entirely.
|
||||
# Researchers believe their parents simply give them a number.
|
||||
|
||||
# Given that the scurret language is untranslated, these names are
|
||||
# usually deduced via the showing of photographs, annoyed and
|
||||
# repeated pointing at nearby objects, or games of Pictionary.
|
||||
|
||||
# When all else fails, to NT and her crews, Wa is as good a name as any.
|
||||
|
||||
names-scurret-last-dataset-1 = Wa
|
||||
names-scurret-last-dataset-2 = Trees
|
||||
names-scurret-last-dataset-3 = Plants
|
||||
@@ -6,12 +22,12 @@ names-scurret-last-dataset-5 = Rivers
|
||||
names-scurret-last-dataset-6 = Groves
|
||||
names-scurret-last-dataset-7 = Lakes
|
||||
names-scurret-last-dataset-8 = Marshes
|
||||
names-scurret-last-dataset-9 = Spring
|
||||
names-scurret-last-dataset-9 = Springs
|
||||
names-scurret-last-dataset-10 = Reeds
|
||||
names-scurret-last-dataset-11 = Sunshine
|
||||
names-scurret-last-dataset-12 = Rain
|
||||
names-scurret-last-dataset-13 = Clouds
|
||||
names-scurret-last-dataset-14 = Snowfall
|
||||
names-scurret-last-dataset-14 = Snowfalls
|
||||
names-scurret-last-dataset-15 = Stones
|
||||
names-scurret-last-dataset-16 = Pebbles
|
||||
names-scurret-last-dataset-17 = Fishes
|
||||
@@ -25,7 +41,7 @@ names-scurret-last-dataset-24 = Alders
|
||||
names-scurret-last-dataset-25 = Birches
|
||||
names-scurret-last-dataset-26 = Poplars
|
||||
names-scurret-last-dataset-27 = Marigolds
|
||||
names-scurret-last-dataset-28 = Robins
|
||||
names-scurret-last-dataset-28 = Rowans
|
||||
names-scurret-last-dataset-29 = Orchids
|
||||
names-scurret-last-dataset-30 = Rushes
|
||||
names-scurret-last-dataset-31 = Lillies
|
||||
@@ -33,4 +49,20 @@ names-scurret-last-dataset-32 = Violets
|
||||
names-scurret-last-dataset-33 = Maples
|
||||
names-scurret-last-dataset-34 = Oaks
|
||||
names-scurret-last-dataset-35 = Hazels
|
||||
# AND SIR GIDEON OFNIR
|
||||
names-scurret-last-dataset-36 = the All-Knowing
|
||||
names-scurret-last-dataset-37 = Tarns
|
||||
names-scurret-last-dataset-38 = Waters
|
||||
names-scurret-last-dataset-39 = Reservoirs
|
||||
names-scurret-last-dataset-40 = Dams
|
||||
names-scurret-last-dataset-41 = Moors
|
||||
names-scurret-last-dataset-42 = Fens
|
||||
names-scurret-last-dataset-43 = Temples
|
||||
names-scurret-last-dataset-44 = Hills
|
||||
names-scurret-last-dataset-45 = Copses
|
||||
names-scurret-last-dataset-46 = Fields
|
||||
names-scurret-last-dataset-47 = Ancestors
|
||||
names-scurret-last-dataset-48 = Forests
|
||||
names-scurret-last-dataset-49 = Secrets
|
||||
# Nobody's quite sure how this one is in the dictionary.
|
||||
names-scurret-last-dataset-50 = Space Ferret
|
||||
|
||||
@@ -23,9 +23,6 @@ uplink-esword-double-desc = A much more expensive counter part to the normal ene
|
||||
uplink-hypereutactic-blade-name = Hypereutactic Blade
|
||||
uplink-hypereutactic-blade-desc = A gigantic energy sword with power that matches its looks. Requires two hands. Slow and unwieldy, yet pretty adept at reflecting. Previously made infamous by an operative wearing a joy mask. You wouldn't want to see this coming at you down the hall!
|
||||
|
||||
uplink-hypereutatic-blade-name = Hypereutatic Blade
|
||||
uplink-hypereutatic-blade-desc = A gigantic off-brand energy sword. Requires two hands. Slow and unwieldy, can reflect decently. Often mistaken for the Hypereutactic Blade.
|
||||
|
||||
uplink-edagger-name = Energy Dagger
|
||||
uplink-edagger-desc = A small energy blade conveniently disguised in the form of a pen.
|
||||
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ClothingHeadHatHopcap
|
||||
- id: ClothingHeadHatBeretHop
|
||||
- id: ClothingOuterWinterHoP
|
||||
- id: ClothingEyesGlasses
|
||||
- id: ClothingNeckCloakHop
|
||||
|
||||
@@ -66,52 +66,6 @@
|
||||
categories:
|
||||
- UplinkWeaponry
|
||||
|
||||
- type: listing
|
||||
id: UplinkHyperEutacticBlade
|
||||
name: uplink-hypereutactic-blade-name
|
||||
description: uplink-hypereutactic-blade-desc
|
||||
icon: { sprite: /Textures/Objects/Weapons/Melee/hypereutactic_blade.rsi, state: icon }
|
||||
discountCategory: veryRareDiscounts
|
||||
discountDownTo:
|
||||
Telecrystal: 15
|
||||
productEntity: HyperEutacticBlade
|
||||
cost:
|
||||
Telecrystal: 18
|
||||
categories:
|
||||
- UplinkWeaponry
|
||||
conditions:
|
||||
- !type:BuyerWhitelistCondition
|
||||
blacklist:
|
||||
components:
|
||||
- SurplusBundle
|
||||
- !type:StoreWhitelistCondition
|
||||
blacklist:
|
||||
tags:
|
||||
- NukeOpsUplink
|
||||
|
||||
- type: listing
|
||||
id: UplinkHyperEutaticBlade
|
||||
name: uplink-hypereutatic-blade-name
|
||||
description: uplink-hypereutatic-blade-desc
|
||||
icon: { sprite: /Textures/Objects/Weapons/Melee/hypereutactic_blade.rsi, state: icon }
|
||||
discountCategory: veryRareDiscounts
|
||||
discountDownTo:
|
||||
Telecrystal: 13
|
||||
productEntity: HyperEutaticBlade
|
||||
cost:
|
||||
Telecrystal: 16
|
||||
categories:
|
||||
- UplinkWeaponry
|
||||
conditions:
|
||||
- !type:BuyerWhitelistCondition
|
||||
blacklist:
|
||||
components:
|
||||
- SurplusBundle
|
||||
- !type:StoreWhitelistCondition
|
||||
whitelist:
|
||||
tags:
|
||||
- NukeOpsUplink
|
||||
|
||||
- type: listing
|
||||
id: UplinkEnergyDagger
|
||||
name: uplink-edagger-name
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
id: NamesFirstScurret
|
||||
values:
|
||||
prefix: names-scurret-first-dataset-
|
||||
count: 36
|
||||
count: 50
|
||||
|
||||
- type: localizedDataset
|
||||
id: NamesLastScurret
|
||||
values:
|
||||
prefix: names-scurret-last-dataset-
|
||||
count: 36
|
||||
count: 50
|
||||
|
||||
@@ -1360,20 +1360,3 @@
|
||||
path: /Audio/Items/flashlight_on.ogg
|
||||
soundDeactivate:
|
||||
path: /Audio/Items/flashlight_off.ogg
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHeadBase
|
||||
id: ClothingHeadHatBeretHop
|
||||
name: head of personnel's beret
|
||||
description: A dark blue beret with a ruby inserted in the center, for true connoisseurs of bureaucracy!
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Clothing/Head/Hats/beret_hop.rsi
|
||||
- type: Clothing
|
||||
sprite: Clothing/Head/Hats/beret_hop.rsi
|
||||
- type: Tag
|
||||
tags:
|
||||
- HamsterWearable
|
||||
- ClothMade
|
||||
- Recyclable
|
||||
- WhitelistChameleon
|
||||
@@ -104,6 +104,38 @@
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: neck
|
||||
ears:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: ears
|
||||
eyes:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: eyes
|
||||
head:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: head
|
||||
mask:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: mask
|
||||
back:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: back
|
||||
- type: Hands
|
||||
leftHandDisplacement:
|
||||
sizeMaps:
|
||||
32:
|
||||
sprite: Mobs/Animals/scurret/displacement.rsi
|
||||
state: hand
|
||||
|
||||
- type: InventorySlots
|
||||
- type: Food
|
||||
- type: Hunger
|
||||
@@ -139,6 +171,14 @@
|
||||
available:
|
||||
- enum.DamageStateVisualLayers.Base:
|
||||
scurret: ScurretColors
|
||||
# They are of a mysterious gender.
|
||||
- type: Grammar
|
||||
attributes:
|
||||
gender: epicene
|
||||
proper: true
|
||||
# Strips the name identifier from them, so they're just "Confident Waters" rather than "Confident Waters (123)"
|
||||
- type: NameIdentifier
|
||||
group: null
|
||||
|
||||
# Emotional Support Scurrets have a ghost role and equipment. At the moment, these are intended to be used for admemes, but
|
||||
# feel free to hook them into random content.
|
||||
@@ -169,4 +209,4 @@
|
||||
name: Emotional Support Scurret
|
||||
id: MobEmotionalSupportScurret
|
||||
parent: [MobScurret, MobBaseEmotionalSupportScurret]
|
||||
description: Commonly known as Wawa, from the wetlands of Planet Wawa, these critters make up the bulk of Arnolds's Pizza's "loyal workforce". This one is here as a temp.
|
||||
description: Commonly known as Wawa, from the wetlands of Planet Wawa, these critters make up the bulk of Arnold's Pizza's "loyal workforce". This one is here as a temp.
|
||||
|
||||
@@ -296,12 +296,11 @@
|
||||
Slash: 12
|
||||
Heat: 12
|
||||
Structural: 15
|
||||
# Disabled until the wield active sfx no longer stacks
|
||||
#- type: ItemToggleActiveSound
|
||||
# activeSound:
|
||||
# path: /Audio/Weapons/ebladehum.ogg
|
||||
# params:
|
||||
# volume: 3
|
||||
- type: ItemToggleActiveSound
|
||||
activeSound:
|
||||
path: /Audio/Weapons/ebladehum.ogg
|
||||
params:
|
||||
volume: 3
|
||||
- type: ComponentToggler
|
||||
components:
|
||||
- type: Sharp
|
||||
@@ -387,17 +386,6 @@
|
||||
reflectProb: 1.0
|
||||
spread: 75
|
||||
|
||||
# Nukie variant, reduced reflection rate.
|
||||
- type: entity
|
||||
parent: HyperEutacticBlade
|
||||
id: HyperEutaticBlade
|
||||
name: hypereutatic-blade
|
||||
description: Often mistaken for the Hypereutactic Blade. This mass produced, off-brand, knockoff gets the same job done but with less reflection.
|
||||
components:
|
||||
- type: Reflect
|
||||
reflectProb: 0.75
|
||||
spread: 75
|
||||
|
||||
# Borgs
|
||||
- type: entity
|
||||
suffix: One-Handed, For Borgs
|
||||
|
||||
@@ -35,11 +35,6 @@
|
||||
equipment:
|
||||
head: ClothingHeadHatHopcap
|
||||
|
||||
- type: loadout
|
||||
id: HoPBeret
|
||||
equipment:
|
||||
head: ClothingHeadHatBeretHop
|
||||
|
||||
# Neck
|
||||
- type: loadout
|
||||
id: HoPCloak
|
||||
|
||||
@@ -153,7 +153,6 @@
|
||||
minLimit: 0
|
||||
loadouts:
|
||||
- HoPHead
|
||||
- HoPBeret
|
||||
|
||||
- type: loadoutGroup
|
||||
id: HoPJumpsuit
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
- ClothingUniformJumpskirtCapFormalDress
|
||||
# HoP
|
||||
- ClothingHeadHatHopcap
|
||||
- ClothingHeadHatBeretHop
|
||||
- ClothingUniformJumpsuitHoP
|
||||
- ClothingUniformJumpskirtHoP
|
||||
# Generic
|
||||
|
||||
@@ -810,11 +810,6 @@
|
||||
id: ClothingHeadHatHopcap
|
||||
result: ClothingHeadHatHopcap
|
||||
|
||||
- type: latheRecipe
|
||||
parent: BaseCommandHatRecipe
|
||||
id: ClothingHeadHatBeretHop
|
||||
result: ClothingHeadHatBeretHop
|
||||
|
||||
- type: latheRecipe
|
||||
parent: BaseCommandHatRecipe
|
||||
id: ClothingHeadHatQMsoft
|
||||
|
||||
|
Before Width: | Height: | Size: 861 B |
|
Before Width: | Height: | Size: 902 B |
|
Before Width: | Height: | Size: 415 B |
|
Before Width: | Height: | Size: 695 B |
|
Before Width: | Height: | Size: 789 B |
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Sprited by upnostnote (Discord), resprite by 96flo (Discord)",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-HELMET",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "equipped-HELMET-hamster",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 279 B |
|
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 382 B |
|
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 510 B |
@@ -45,6 +45,10 @@
|
||||
{
|
||||
"name": "hand",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "back",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||