Новые предметы, фикс супер материи, правки (#515)

* permission changes

* super matter changes

* NT backpack energy dome

* energy dome is contraband

* fix singularity

* upd

* upd supermatter

* reflector

* upd

* upd

* add meta.json

* fix announcement

* upd

* fix rsi

* fix ids

* return checking for double actions

* fix hydro assembly

* fix x2 hydroponics and chemistry airlock

* upd

* У всех хардсьютов временно забран пнв(переработка хардсьютов под пнв момент)

* peace parts

* clown parts

* upd parts meta

* akms bigger price

* fix

* fix x2

* add clown, peace parts

---------

Co-authored-by: darkrell <rc-alh@outlook.com>
This commit is contained in:
Rinary 2024-10-30 09:19:36 +02:00 committed by GitHub
parent 09a278eddd
commit 591a3c4a50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
53 changed files with 754 additions and 129 deletions

View file

@ -199,7 +199,7 @@ public sealed class RadioSystem : EntitySystem
private string GetIdCardName(EntityUid senderUid)
{
var idCardTitle = Loc.GetString("chat-radio-no-id");
idCardTitle = GetIdCard(senderUid)?.JobTitle ?? idCardTitle;
idCardTitle = GetIdCard(senderUid)?.LocalizedJobTitle ?? idCardTitle;
var textInfo = CultureInfo.CurrentCulture.TextInfo;
idCardTitle = textInfo.ToTitleCase(idCardTitle);

View file

@ -1,4 +1,4 @@
using Content.Shared.Atmos;
using Content.Shared.Atmos;
using Robust.Shared.Audio;
namespace Content.Server.Supermatter.Components;
@ -6,6 +6,36 @@ namespace Content.Server.Supermatter.Components;
[RegisterComponent]
public sealed partial class SupermatterComponent : Component
{
/// <summary>
/// The damage taken from direct hits, e.g. laser weapons
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public float AVExternalDamage = 0f;
//
[ViewVariables(VVAccess.ReadOnly)]
public float HeatAccumulatorRate = 0.5f;
[ViewVariables(VVAccess.ReadOnly)]
public float AVHeatAccumulator = 0f;
[ViewVariables(VVAccess.ReadOnly)]
public float RadiationAccumulatorRate = 0.3f;
[ViewVariables(VVAccess.ReadOnly)]
public float AVRadiationAccumulator = 0f;
[ViewVariables(VVAccess.ReadOnly)]
public float LightingAccumulatorThreshold = 2f;
[ViewVariables(VVAccess.ReadOnly)]
public float LightingAccumulatorRate = 0.1f;
[ViewVariables(VVAccess.ReadOnly)]
public float AVLightingAccumulator = 0f;
[ViewVariables(VVAccess.ReadOnly)]
public float InternalEnergyAccumulatorRate = 0.1f;
/// <summary>
/// Lightning prototype IDs that the supermatter should spit out.
/// </summary>
@ -64,8 +94,6 @@ public sealed partial class SupermatterComponent : Component
public float UpdateTimerAccumulator = 0f;
public float ZapTimerAccumulator = 0f;
public float AnnouncementTimerAccumulator = 0f;
/// <summary>
@ -74,12 +102,6 @@ public sealed partial class SupermatterComponent : Component
[DataField("updateTimer")]
public float UpdateTimer = 1f;
/// <summary>
/// Amount of seconds to pass before SM does it's zap.
/// </summary>
[DataField("zapTimer")]
public float ZapTimer = 10f;
/// <summary>
/// Amount of seconds to pass before makes an announcement.
/// </summary>
@ -123,12 +145,6 @@ public sealed partial class SupermatterComponent : Component
/// </summary>
public float DamageArchive = 0f;
/// <summary>
/// The damage taken from direct hits, e.g. laser weapons
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public float ExternalDamage = 0f;
/// <summary>
/// The temperature at which the supermatter crystal will begin to take damage.
/// </summary>
@ -168,11 +184,8 @@ public sealed partial class SupermatterComponent : Component
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public float GasPowerlossInhibition = 0f;
/// <summary>
/// Affects the amount of power the main SM zap makes.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public float PowerTransmissionRate = 0f;
public float ThermalСonductivity = 0f;
/// <summary>
/// Affects the power gain the SM experiences from heat.
/// </summary>
@ -199,15 +212,15 @@ public sealed partial class SupermatterComponent : Component
[ViewVariables(VVAccess.ReadOnly)]
public GasFact[] GasFacts =
{
new (transmissionRate: .15f, heatPowerGeneration: 1f), // o2
new (heatModifier: -2.5f, heatPowerGeneration: -1), // n2
new (heatModifier: 1f, heatPowerGeneration: 1f, powerlossInhibition: 1f), // co2
new (transmissionRate: .4f, heatModifier: 14f, heatPowerGeneration: 1f), // plasma
new (transmissionRate: 3f, heatModifier: 9f, heatPowerGeneration: 1f), // tritium
new (transmissionRate: -.25f, heatModifier: 11f, heatPowerGeneration: 1f), // vapor
new (heatPowerGeneration: .5f), // ommonium
new (heatResistance: 5f), // n2o
new (transmissionRate: -3f, heatModifier: 9f, heatResistance: 1f, heatPowerGeneration: 1f), // frezon
new (thermalConductivity: 2.4f, heatPowerGeneration: 1f), // o2
new (thermalConductivity: 2.0f, heatModifier: -2.5f, heatPowerGeneration: -1), // n2
new (thermalConductivity: 1.2f, heatModifier: 1f, heatPowerGeneration: 1f, powerlossInhibition: 1f), // co2
new (thermalConductivity: 6.0f, heatModifier: 14f, heatPowerGeneration: 1f), // plasma
new (thermalConductivity: 3.0f, heatModifier: 9f, heatPowerGeneration: 1f), // tritium
new (thermalConductivity: 1.4f, heatModifier: 11f, heatPowerGeneration: 1f), // vapor
new (thermalConductivity: 1.6f, heatPowerGeneration: .5f), // ommonium
new (thermalConductivity: 1.3f, heatResistance: 5f), // n2o
new (thermalConductivity: 9.9f, heatModifier: 9f, heatResistance: 1f, heatPowerGeneration: 1f), // frezon
};
}
@ -222,7 +235,7 @@ public sealed partial class GasFact
/// Affects the amount of power the main SM zap makes.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public float PowerTransmissionRate;
public float ThermalСonductivity;
/// <summary>
/// Affects the heat SM makes.
/// </summary>
@ -244,9 +257,9 @@ public sealed partial class GasFact
[ViewVariables(VVAccess.ReadWrite)]
public float PowerlossInhibition;
public GasFact(float? transmissionRate = null, float? heatModifier = null, float? heatResistance = null, float? heatPowerGeneration = null, float? powerlossInhibition = null)
public GasFact(float? thermalConductivity = null, float? heatModifier = null, float? heatResistance = null, float? heatPowerGeneration = null, float? powerlossInhibition = null)
{
PowerTransmissionRate = transmissionRate ?? 1;
ThermalСonductivity = thermalConductivity ?? 1;
HeatModifier = heatModifier ?? 1;
HeatResistance = heatResistance ?? 0;
HeatPowerGeneration = heatPowerGeneration ?? 0;

View file

@ -1,4 +1,4 @@
using Content.Server.Atmos.EntitySystems;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Supermatter.Components;
using Content.Shared.Atmos;
using Content.Server.Lightning;
@ -26,6 +26,8 @@ using Content.Shared.Examine;
using Content.Server.DoAfter;
using Content.Server.Explosion.EntitySystems;
using Content.Server.Kitchen.Components;
using Content.Shared.Singularity.Components;
using System;
namespace Content.Server.Supermatter.EntitySystems;
@ -39,6 +41,7 @@ public sealed class SupermatterSystem : EntitySystem
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly AmbientSoundSystem _ambience = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly AnomalySystem _anomaly = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
@ -81,17 +84,10 @@ public sealed class SupermatterSystem : EntitySystem
public void Cycle(EntityUid uid, SupermatterComponent sm)
{
sm.ZapTimerAccumulator++;
sm.AnnouncementTimerAccumulator++;
ProcessAtmos(uid, sm);
if (sm.ZapTimerAccumulator >= sm.ZapTimer)
{
sm.ZapTimerAccumulator = 0f;
ProcessPower(uid, sm);
}
ProcessPower(uid, sm);
ProcessDamage(uid, sm);
// due to how damage calculation works, it will do the announcement only if sm is consistently taking damage
@ -104,7 +100,7 @@ public sealed class SupermatterSystem : EntitySystem
if (sm.Damage > sm.DamageEmergencyPoint)
loc = "critical";
SupermatterAlert(uid, Loc.GetString($"supermatter-announcement-{loc}", ("integrity", Math.Round(sm.DelaminationPoint - sm.Damage, 1))));
SupermatterAlert(uid, Loc.GetString($"supermatter-announcement-{loc}", ("integrity", (int)(sm.DelaminationPoint - sm.Damage))));
}
}
@ -127,7 +123,7 @@ public sealed class SupermatterSystem : EntitySystem
// calculate gases
var gasPercentages = new float[Enum.GetValues(typeof(Gas)).Length];
var powerTransmissionRate = 0f;
var thermalСonductivity = 0f;
var heatModifier = 0f;
var heatResistance = 0f;
var heatPowerGeneration = 0f;
@ -148,7 +144,7 @@ public sealed class SupermatterSystem : EntitySystem
gasPercentages[i] = moleCount / moles;
var smGas = sm.GasFacts[i];
powerTransmissionRate += smGas.PowerTransmissionRate * gasPercentages[i];
thermalСonductivity += smGas.ThermalСonductivity * gasPercentages[i];
heatModifier += smGas.HeatModifier * gasPercentages[i];
heatResistance += smGas.HeatResistance * gasPercentages[i];
heatPowerGeneration += smGas.HeatPowerGeneration * gasPercentages[i];
@ -159,7 +155,7 @@ public sealed class SupermatterSystem : EntitySystem
powerlossInhibition = Math.Clamp(powerlossInhibition, 0, 1);
sm.AbsorbedGasMix = absorbedMix;
sm.PowerTransmissionRate = powerTransmissionRate;
sm.ThermalСonductivity = thermalСonductivity;
sm.GasHeatModifier = heatModifier;
sm.GasHeatResistance = heatResistance;
sm.HeatPowerGeneration = heatPowerGeneration;
@ -172,17 +168,32 @@ public sealed class SupermatterSystem : EntitySystem
{
var powerHeat = sm.HeatPowerGeneration * sm.AbsorbedGasMix.Temperature * SupermatterComponent.GasHeatPowerScaling;
var powerloss = -1 * sm.GasPowerlossInhibition;
var atmosStrength = Math.Clamp((powerHeat + powerloss) * sm.PowerTransmissionRate, 0, 2);
var atmosStrength = Math.Clamp((powerHeat + powerloss) * 0.2f, 0, 2);
var damageStrength = Math.Clamp(sm.Damage / sm.DelaminationPoint, 0, 1);
var strength = Math.Clamp(atmosStrength + damageStrength, 0, 4);
var damageExternal = sm.AVExternalDamage + strength;
sm.AVExternalDamage = 0f;
sm.InternalEnergy = strength;
var lightningProto = sm.LightningPrototypeIDs[(int) Math.Clamp(strength, 0, 3)];
sm.AVHeatAccumulator = Math.Clamp(sm.AVHeatAccumulator + (damageExternal * sm.HeatAccumulatorRate), 0, 10);
sm.AVRadiationAccumulator = Math.Clamp(sm.AVRadiationAccumulator + (damageExternal * sm.RadiationAccumulatorRate), 0, 10);
sm.AVLightingAccumulator = Math.Clamp(sm.AVLightingAccumulator + (damageExternal * sm.LightingAccumulatorRate), 0, 10);
sm.InternalEnergy = Math.Clamp(sm.InternalEnergy + (damageExternal * sm.InternalEnergyAccumulatorRate), 0, 10);
_sound.PlayPvs(SupermatterComponent.SupermatterZapSound, uid);
_lightning.ShootRandomLightnings(uid, 3, (int) strength < 1 ? 1 : (int) strength, lightningProto);
Comp<RadiationSourceComponent>(uid).Intensity = 1 + strength;
if (sm.AVLightingAccumulator > sm.LightingAccumulatorThreshold)
{
var lightningProto = sm.LightningPrototypeIDs[(int)Math.Clamp(sm.AVLightingAccumulator, 0, 3)];
_lightning.ShootRandomLightnings(uid, 3, (int)sm.AVLightingAccumulator, lightningProto);
sm.AVLightingAccumulator = 0;
}
Comp<RadiationSourceComponent>(uid).Intensity = 1 + sm.AVRadiationAccumulator;
sm.AVRadiationAccumulator /= 2;
sm.InternalEnergy /= 2;
var mix = _atmos.GetContainingMixture((uid, Transform(uid)), true, true) ?? new();
mix.Temperature += sm.AVHeatAccumulator * 4;
sm.AVHeatAccumulator /= sm.ThermalСonductivity;
}
/// <summary>
/// React to damage dealt by all doodads.
@ -196,11 +207,8 @@ public sealed class SupermatterSystem : EntitySystem
sm.TempLimit = Math.Max(tempLimitBase + tempLimitGas + tempLimitMoles, Atmospherics.TCMB);
var damageExternal = sm.ExternalDamage * Math.Clamp((sm.DamageEmergencyPoint - sm.Damage) / sm.DamageEmergencyPoint, 0, 1);
sm.ExternalDamage = 0f;
var damageHeat = Math.Clamp((sm.AbsorbedGasMix.Temperature - sm.TempLimit) / 24000, 0, .15f);
var damagePower = Math.Clamp((sm.InternalEnergy - SupermatterComponent.PowerPenaltyThreshold) / 40000, 0, .1f);
var damagePower = Math.Clamp((sm.InternalEnergy - SupermatterComponent.PowerPenaltyThreshold), 0, .1f);
var damageMoles = Math.Clamp((sm.AbsorbedGasMix.TotalMoles - SupermatterComponent.MolePenaltyThreshold) / 3200, 0, .1f);
var damageHealHeat = 0f;
@ -208,7 +216,7 @@ public sealed class SupermatterSystem : EntitySystem
if (sm.AbsorbedGasMix.TotalMoles > 0)
damageHealHeat = Math.Clamp((sm.AbsorbedGasMix.TotalMoles - sm.TempLimit) / 6000, -.1f, 0);
var totalDamage = damageExternal + damageHeat + damagePower + damageMoles + damageHealHeat;
var totalDamage = damageHeat + damagePower + damageMoles + damageHealHeat;
sm.Damage += Math.Max(totalDamage, 0);
@ -235,7 +243,7 @@ public sealed class SupermatterSystem : EntitySystem
mergeMix.Temperature = Math.Clamp(mergeMix.Temperature, Atmospherics.TCMB, 2500 * sm.WasteMultiplier);
mergeMix.AdjustMoles(Gas.Plasma, Math.Max(.65f * sm.InternalEnergy * sm.WasteMultiplier * SupermatterComponent.PlasmaReleaseModifier, 0));
mergeMix.AdjustMoles(Gas.Oxygen, Math.Max((.65f + mergeMix.Temperature * sm.WasteMultiplier - Atmospherics.T0C) * SupermatterComponent.OxygenReleaseModifier, 0));
mergeMix.AdjustMoles(Gas.Oxygen, Math.Max(.65f * sm.InternalEnergy * sm.WasteMultiplier * SupermatterComponent.OxygenReleaseModifier, 0));
_atmos.Merge(mix, mergeMix);
}
@ -282,7 +290,7 @@ public sealed class SupermatterSystem : EntitySystem
for (var i = 0; i < amount; i++)
{
_anomaly.SpawnOnRandomGridLocation((EntityUid) grid, "RandomAnomalySpawner");
_anomaly.SpawnOnRandomGridLocation((EntityUid)grid, "RandomAnomalySpawner");
_adminLogger.Add(LogType.Anomaly, LogImpact.Medium, $"An anomaly has been spawned by the supermatter crystal.");
}
}
@ -295,6 +303,13 @@ public sealed class SupermatterSystem : EntitySystem
if (EntityManager.IsQueuedForDeletion(uid))
return;
if (_tagSystem.HasTag(uid, "EmitterBolt")
|| HasComp<SingularityComponent>(uid))
return;
if (TryComp<SupermatterComponent>(smUid, out var sm))
sm.AVExternalDamage += 1f;
_sound.PlayPvs(SupermatterComponent.VaporizeSound, smUid);
EntityManager.QueueDeleteEntity(uid);
@ -302,14 +317,13 @@ public sealed class SupermatterSystem : EntitySystem
_adminLogger.Add(LogType.Action, LogImpact.High, $"{EntityManager.ToPrettyString(uid):player} has been vaporized by the supermatter.");
}
/// <summary>
/// Handle supermatter delamination and the end of the station.
/// </summary>
private void Delaminate(EntityUid uid, SupermatterComponent sm)
{
sm.PreferredDelamType = sm.PreferredDelamType ?? (int) ChooseDelam(sm);
Delaminate(uid, sm, (DelamType) sm.PreferredDelamType);
sm.PreferredDelamType = sm.PreferredDelamType ?? (int)ChooseDelam(sm);
Delaminate(uid, sm, (DelamType)sm.PreferredDelamType);
}
/// <summary>
@ -413,8 +427,6 @@ public sealed class SupermatterSystem : EntitySystem
sm.DelamCountdownAccumulator++;
}
private void OnCollide(EntityUid uid, SupermatterComponent sm, StartCollideEvent args)
{
if (!sm.Activated)
@ -446,7 +458,7 @@ public sealed class SupermatterSystem : EntitySystem
private void OnGetSliver(EntityUid uid, SupermatterComponent sm, SupermatterDoAfterEvent args)
{
sm.Damage += 10; // your criminal actions will not go unnoticed
SupermatterAlert(uid, Loc.GetString("supermatter-announcement-tamper", ("integrity", (int) (100 - sm.Damage))));
SupermatterAlert(uid, Loc.GetString("supermatter-announcement-tamper", ("integrity", (int)(100 - sm.Damage))));
Spawn(sm.SliverPrototype, _transform.GetMapCoordinates(args.User));
_popup.PopupClient(Loc.GetString("supermatter-tamper-end"), args.User);
@ -457,17 +469,14 @@ public sealed class SupermatterSystem : EntitySystem
if (!sm.Activated)
sm.Activated = true;
sm.ExternalDamage += args.DamageDelta?.GetTotal().Value / 1000 ?? 0;
Cycle(uid, sm);
ProcessPower(uid, sm);
sm.AVExternalDamage += args.DamageDelta?.GetTotal().Value / 100 ?? 0;
}
private void OnExamine(EntityUid uid, SupermatterComponent sm, ExaminedEvent args)
{
if (args.IsInDetailsRange) // get all close to it
{
args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", (int) (100 - sm.Damage))));
args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", (int)(100 - sm.Damage))));
}
}
}

View file

@ -238,16 +238,16 @@ public sealed class ActionContainerSystem : EntitySystem
DebugTools.AssertOwner(uid, comp);
comp ??= EnsureComp<ActionsContainerComponent>(uid);
///if (!TryComp<MetaDataComponent>(actionId, out var actionData))
/// return false;
///if (!TryPrototype(actionId, out var actionProto, actionData))
/// return false;
if (!TryComp<MetaDataComponent>(actionId, out var actionData))
return false;
if (!TryPrototype(actionId, out var actionProto, actionData))
return false;
///if (HasAction(uid, actionProto.ID))
///{
/// Log.Debug($"Tried to insert action {ToPrettyString(actionId)} into {ToPrettyString(uid)}. Failed due to duplicate actions.");
/// return false;
///}
if (HasAction(uid, actionProto.ID, comp))
{
Log.Debug($"Tried to insert action {ToPrettyString(actionId)} into {ToPrettyString(uid)}. Failed due to duplicate actions.");
return false;
}
if (!_container.Insert(actionId, comp.Container))
{

View file

@ -28,6 +28,7 @@ public sealed partial class SleepingSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly BlindableSystem _blindableSystem = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
@ -241,6 +242,8 @@ public sealed partial class SleepingSystem : EntitySystem
{
RemComp<SleepingComponent>(ent);
_actionsSystem.RemoveAction(ent, ent.Comp.WakeAction);
if (ent.Comp.WakeAction != null)
_actionContainer.RemoveAction(ent.Comp.WakeAction.Value);
var ev = new SleepStateChangedEvent(false);
RaiseLocalEvent(ent, ref ev);

View file

@ -25,6 +25,9 @@ public sealed partial class ReflectComponent : Component
[DataField("spread"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public Angle Spread = Angle.FromDegrees(45);
[DataField("overrideAngle"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public Angle? OverrideAngle = null;
[DataField("soundOnReflect")]
public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg");
}

View file

@ -104,19 +104,35 @@ public sealed class ReflectSystem : EntitySystem
return false;
}
var rotation = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2).Opposite();
var existingVelocity = _physics.GetMapLinearVelocity(projectile, component: physics);
var relativeVelocity = existingVelocity - _physics.GetMapLinearVelocity(user);
var newVelocity = rotation.RotateVec(relativeVelocity);
if (reflect.OverrideAngle is not null)
{
var overrideAngle = _transform.GetWorldRotation(reflector) + reflect.OverrideAngle.Value;
// Have the velocity in world terms above so need to convert it back to local.
var difference = newVelocity - existingVelocity;
var existingVelocity = _physics.GetMapLinearVelocity(projectile, component: physics);
var relativeVelocity = existingVelocity - _physics.GetMapLinearVelocity(user);
var speed = relativeVelocity.Length();
_physics.SetLinearVelocity(projectile, physics.LinearVelocity + difference, body: physics);
var newVelocity = new Vector2((float)Math.Cos(overrideAngle), (float)Math.Sin(overrideAngle)) * speed;
var locRot = Transform(projectile).LocalRotation;
var newRot = rotation.RotateVec(locRot.ToVec());
_transform.SetLocalRotation(projectile, newRot.ToAngle());
var difference = newVelocity - existingVelocity;
_physics.SetLinearVelocity(projectile, physics.LinearVelocity + difference, body: physics);
_transform.SetLocalRotation(projectile, overrideAngle);
}
else
{
var rotation = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2).Opposite();
var existingVelocity = _physics.GetMapLinearVelocity(projectile, component: physics);
var relativeVelocity = existingVelocity - _physics.GetMapLinearVelocity(user);
var newVelocity = rotation.RotateVec(relativeVelocity);
var difference = newVelocity - existingVelocity;
_physics.SetLinearVelocity(projectile, physics.LinearVelocity + difference, body: physics);
var locRot = Transform(projectile).LocalRotation;
var newRot = rotation.RotateVec(locRot.ToVec());
_transform.SetLocalRotation(projectile, newRot.ToAngle());
}
if (_netManager.IsServer)
{
@ -176,9 +192,17 @@ public sealed class ReflectSystem : EntitySystem
_popup.PopupEntity(Loc.GetString("reflect-shot"), user);
_audio.PlayPvs(reflect.SoundOnReflect, user, AudioHelpers.WithVariation(0.05f, _random));
}
var spread = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2);
newDirection = -spread.RotateVec(direction);
if (reflect.OverrideAngle is not null)
{
var overrideAngle = _transform.GetWorldRotation(reflector) + reflect.OverrideAngle.Value;
newDirection = new Vector2((float)Math.Cos(overrideAngle), (float)Math.Sin(overrideAngle));
newDirection = newDirection.Value.Normalized();
}
else
{
var spread = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2);
newDirection = -spread.RotateVec(direction);
}
if (shooter != null)
_adminLogger.Add(LogType.HitScanHit, LogImpact.Medium, $"{ToPrettyString(user)} reflected hitscan from {ToPrettyString(shotSource)} shot by {ToPrettyString(shooter.Value)}");
@ -216,7 +240,7 @@ public sealed class ReflectSystem : EntitySystem
private void OnToggleReflect(EntityUid uid, ReflectComponent comp, ref ItemToggledEvent args)
{
if (args.User is {} user)
if (args.User is { } user)
RefreshReflectUser(user);
}

View file

@ -4,6 +4,8 @@ using Content.Shared.Inventory;
using Content.Shared.Actions;
using Content.Shared.Inventory.Events;
using Content.Shared.Toggleable;
using Content.Shared.PowerCell;
using Content.Shared.PowerCell.Components;
using Content.Shared.Popups;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Network;
@ -20,6 +22,7 @@ public sealed class NightVisionDeviceSystem : EntitySystem
[Dependency] private readonly SharedPointLightSystem _light = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedPowerCellSystem _cell = default!;
public override void Initialize()
{
@ -27,6 +30,9 @@ public sealed class NightVisionDeviceSystem : EntitySystem
SubscribeLocalEvent<NightVisionDeviceComponent, InventoryRelayedEvent<CanVisionAttemptEvent>>(OnNVDTrySee);
SubscribeLocalEvent<NightVisionDeviceComponent, NightVisionDeviceUpdateVisualsEvent>(OnNightVisionDeviceUpdateVisuals);
SubscribeLocalEvent<NightVisionDeviceComponent, PowerCellChangedEvent>(OnPowerCellChanged);
SubscribeLocalEvent<NightVisionDeviceComponent, PowerCellSlotEmptyEvent>(OnPowerCellSlotEmpty);
SubscribeLocalEvent<NightVisionDeviceComponent, GetItemActionsEvent>(OnGetActions);
SubscribeLocalEvent<NightVisionDeviceComponent, ToggleActionEvent>(OnToggleAction);
@ -56,7 +62,20 @@ public sealed class NightVisionDeviceSystem : EntitySystem
{
_actionsSystem.RemoveAction(uid, component.ToggleActionEntity);
}
private void OnPowerCellSlotEmpty(Entity<NightVisionDeviceComponent> ent, ref PowerCellSlotEmptyEvent args)
{
if (ent.Comp.isPowered)
Toggle(ent);
}
private void OnPowerCellChanged(Entity<NightVisionDeviceComponent> ent, ref PowerCellChangedEvent args)
{
if (args.Ejected || !_powerCell.HasDrawCharge(ent))
if (ent.Comp.isPowered)
Toggle(ent);
}
private void OnToggleAction(Entity<NightVisionDeviceComponent> ent, ref ToggleActionEvent args)
{
if (args.Handled)
@ -68,6 +87,13 @@ public sealed class NightVisionDeviceSystem : EntitySystem
return;
}
Toggle(ent);
args.Handled = true;
}
public void Toggle(Entity<NightVisionDeviceComponent> ent)
{
var updVisEv = new NightVisionDeviceUpdateVisualsEvent();
RaiseLocalEvent(ent, ref updVisEv);
@ -81,15 +107,22 @@ public sealed class NightVisionDeviceSystem : EntitySystem
if (!_light.TryGetLight(ent.Owner, out var light))
return;
var draw = Comp<PowerCellDrawComponent>(ent.Owner);
_cell.QueueUpdate((ent.Owner, draw));
_cell.SetDrawEnabled((ent.Owner, draw), ent.Comp.Activated);
_appearance.SetData(ent, ToggleableLightVisuals.Enabled, ent.Comp.Activated);
_light.SetEnabled(ent.Owner, ent.Comp.Activated, comp: light);
var changeEv = new NightVisionDeviceToggledEvent(args.Performer);
RaiseLocalEvent(ent.Owner, ref changeEv);
Dirty(ent);
if (TryComp<TransformComponent>(ent.Owner, out var transform))
{
var equipped = transform.ParentUid;
args.Handled = true;
var changeEv = new NightVisionDeviceToggledEvent(equipped);
RaiseLocalEvent(ent.Owner, ref changeEv);
}
Dirty(ent);
}
}

View file

@ -1,4 +1,6 @@
ent-EnergyDomeGeneratorBackpackSyndie = кроваво-красный наспинный генератор щита
.desc = Наспинный генератор щита, защищающий владельца от лазеров и пуль, но не позволяющий самому использовать оружие дальнего боя. Использует батареи.
ent-EnergyDomeGeneratorBackpackNT = BR-50c "Бастион"
.desc = Наспинный генератор щита, защищающий владельца от лазеров и пуль, но не позволяющий самому использовать оружие дальнего боя. Использует батареи.
ent-EnergyDomeGeneratorPersonalNT = BT-21b "Барьер"
.desc = Генератор щита, защищающий владельца от лазеров и пуль, но не позволяющий самому использовать оружие дальнего боя. Использует батареи.
.desc = Генератор щита, защищающий владельца от лазеров и пуль, но не позволяющий самому использовать оружие дальнего боя. Использует батареи.

View file

@ -86,9 +86,9 @@
# Sunrise-Start
- type: EyeProtection
- type: FlashImmunity
- type: NightVisionDevice
displayColor: "#ebeb00"
displayShader: NVDDisplay
# - type: NightVisionDevice
# displayColor: "#ebeb00"
# displayShader: NVDDisplay
# Sunrise-End
#Spationaut Hardsuit
@ -405,9 +405,9 @@
Slash: 0.9
Piercing: 0.9
Heat: 0.9
- type: NightVisionDevice #Sunrise - night vision
displayColor: "#44b855"
displayShader: NVDDisplay
# - type: NightVisionDevice Sunrise - night vision
# displayColor: "#44b855"
# displayShader: NVDDisplay
#Syndicate Elite Hardsuit
- type: entity
@ -437,9 +437,9 @@
Slash: 0.9
Piercing: 0.9
Heat: 0.9
- type: NightVisionDevice #Sunrise - night vision
displayColor: "#44b855"
displayShader: NVDDisplay
# - type: NightVisionDevice Sunrise - night vision
# displayColor: "#44b855"
# displayShader: NVDDisplay
#Syndicate Commander Hardsuit
- type: entity
@ -464,9 +464,9 @@
Slash: 0.9
Piercing: 0.9
Heat: 0.9
- type: NightVisionDevice #Sunrise - night vision
displayColor: "#44b855"
displayShader: NVDDisplay
# - type: NightVisionDevice Sunrise - night vision
# displayColor: "#44b855"
# displayShader: NVDDisplay
#Cybersun Juggernaut Hardsuit
- type: entity
@ -491,9 +491,9 @@
Slash: 0.9
Piercing: 0.9
Heat: 0.9
- type: NightVisionDevice #Sunrise - night vision
displayColor: "#44b855"
displayShader: NVDDisplay
# - type: NightVisionDevice Sunrise - night vision
# displayColor: "#44b855"
# displayShader: NVDDisplay
#Wizard Hardsuit
- type: entity

View file

@ -501,3 +501,183 @@
tags:
- Trash
- BorgServiceTorso
# peace parts
- type: entity
id: LeftArmBorgPeace
parent: BaseBorgArmLeft
name: peace cyborg left arm
components:
- type: Sprite
state: peace_l_arm
- type: Icon
state: peace_l_arm
- type: Tag
tags:
- Trash
- BorgArm
- BorgPeaceLArm
- type: entity
id: RightArmBorgPeace
parent: BaseBorgArmRight
name: peace cyborg right arm
components:
- type: Sprite
state: peace_r_arm
- type: Icon
state: peace_r_arm
- type: Tag
tags:
- Trash
- BorgArm
- BorgPeaceRArm
- type: entity
id: LeftLegBorgPeace
parent: BaseBorgLegLeft
name: peace cyborg left leg
components:
- type: Sprite
state: peace_l_leg
- type: Icon
state: peace_l_leg
- type: Tag
tags:
- Trash
- BorgLeg
- BorgPeaceLLeg
- type: entity
id: RightLegBorgPeace
parent: BaseBorgLegRight
name: peace cyborg right leg
components:
- type: Sprite
state: peace_r_leg
- type: Icon
state: peace_r_leg
- type: Tag
tags:
- Trash
- BorgLeg
- BorgPeaceRLeg
- type: entity
id: HeadBorgPeace
parent: BaseBorgHead
name: peace cyborg head
components:
- type: Sprite
state: peace_head
- type: Icon
state: peace_head
- type: Tag
tags:
- Trash
- BorgHead
- BorgPeaceHead
- type: entity
id: TorsoBorgPeace
parent: BaseBorgTorso
name: peace cyborg torso
components:
- type: Sprite
state: peace_chest
- type: Icon
state: peace_chest
- type: Tag
tags:
- Trash
- BorgPeaceTorso
# clown parts
- type: entity
id: LeftArmBorgClown
parent: BaseBorgArmLeft
name: clown cyborg left arm
components:
- type: Sprite
state: peace_l_arm
- type: Icon
state: peace_l_arm
- type: Tag
tags:
- Trash
- BorgArm
- BorgClownLArm
- type: entity
id: RightArmBorgClown
parent: BaseBorgArmRight
name: clown cyborg right arm
components:
- type: Sprite
state: peace_r_arm
- type: Icon
state: peace_r_arm
- type: Tag
tags:
- Trash
- BorgArm
- BorgClownRArm
- type: entity
id: LeftLegBorgClown
parent: BaseBorgLegLeft
name: clown cyborg left leg
components:
- type: Sprite
state: peace_l_leg
- type: Icon
state: peace_l_leg
- type: Tag
tags:
- Trash
- BorgLeg
- BorgClownLLeg
- type: entity
id: RightLegBorgClown
parent: BaseBorgLegRight
name: clown cyborg right leg
components:
- type: Sprite
state: peace_r_leg
- type: Icon
state: peace_r_leg
- type: Tag
tags:
- Trash
- BorgLeg
- BorgClownRLeg
- type: entity
id: HeadBorgClown
parent: BaseBorgHead
name: clown cyborg head
components:
- type: Sprite
state: peace_head
- type: Icon
state: peace_head
- type: Tag
tags:
- Trash
- BorgHead
- BorgClownHead
- type: entity
id: TorsoBorgClown
parent: BaseBorgTorso
name: clown cyborg torso
components:
- type: Sprite
state: peace_chest
- type: Icon
state: peace_chest
- type: Tag
tags:
- Trash
- BorgClownTorso

View file

@ -166,6 +166,54 @@
whitelist:
tags:
- BorgJanitorTorso
peace_l_arm+o:
whitelist:
tags:
- BorgPeaceLArm
peace_r_arm+o:
whitelist:
tags:
- BorgPeaceRArm
peace_l_leg+o:
whitelist:
tags:
- BorgPeaceLLeg
peace_r_leg+o:
whitelist:
tags:
- BorgPeaceRLeg
peace_head+o:
whitelist:
tags:
- BorgPeaceHead
peace_chest+o:
whitelist:
tags:
- BorgPeaceTorso
clown_l_arm+o:
whitelist:
tags:
- BorgClownLArm
clown_r_arm+o:
whitelist:
tags:
- BorgClownRArm
clown_l_leg+o:
whitelist:
tags:
- BorgClownLLeg
clown_r_leg+o:
whitelist:
tags:
- BorgClownRLeg
clown_head+o:
whitelist:
tags:
- BorgClownHead
clown_chest+o:
whitelist:
tags:
- BorgClownTorso
- type: ContainerContainer
containers:
part-container: !type:Container
@ -212,6 +260,20 @@
- BorgMiningRLeg
- BorgMiningHead
- BorgMiningTorso
peace:
- BorgPeaceLArm
- BorgPeaceRArm
- BorgPeaceLLeg
- BorgPeaceRLeg
- BorgPeaceHead
- BorgPeaceTorso
clown:
- BorgClownLArm
- BorgClownRArm
- BorgClownLLeg
- BorgClownRLeg
- BorgClownHead
- BorgClownTorso
- type: Construction
graph: Cyborg
node: start

View file

@ -2,7 +2,7 @@
name: blood red personal shield generator
description: A personal shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
id: EnergyDomeGeneratorPersonalSyndie
parent: BaseItem
parent: [ BaseItem, BaseSyndicateContraband ]
components:
- type: Item
size: Ginormous

View file

@ -145,7 +145,7 @@
suffix: Hydroponics
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Standard/hydroponics.rsi
sprite: _Sunrise/Structures/Doors/Airlocks/Standard/hydroponics.rsi #Sunrise-Resprite
state: "assembly"
- type: entity
@ -154,7 +154,7 @@
suffix: Hydroponics, Glass
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Glass/hydroponics.rsi
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/hydroponics.rsi #Sunrise-Resprite
state: "assembly"
#Maintenance

View file

@ -5,11 +5,11 @@
atmospherics: Structures/Doors/Airlocks/Standard/atmospherics.rsi
basic: Structures/Doors/Airlocks/Standard/basic.rsi
cargo: Structures/Doors/Airlocks/Standard/cargo.rsi
chemistry: Structures/Doors/Airlocks/Standard/chemistry.rsi
chemistry: _Sunrise/Structures/Doors/Airlocks/Standard/chemistry.rsi #Sunrise-Resprite
command: Structures/Doors/Airlocks/Standard/command.rsi
engineering: Structures/Doors/Airlocks/Standard/engineering.rsi
freezer: Structures/Doors/Airlocks/Standard/freezer.rsi
hydroponics: Structures/Doors/Airlocks/Standard/hydroponics.rsi
hydroponics: _Sunrise/Structures/Doors/Airlocks/Standard/hydroponics.rsi #Sunrise-Resprite
maintenance: Structures/Doors/Airlocks/Standard/maint.rsi
medical: Structures/Doors/Airlocks/Standard/medical.rsi
science: Structures/Doors/Airlocks/Standard/science.rsi
@ -24,11 +24,11 @@
basic: Structures/Doors/Airlocks/Glass/basic.rsi
cargo: Structures/Doors/Airlocks/Glass/cargo.rsi
command: Structures/Doors/Airlocks/Glass/command.rsi
chemistry: Structures/Doors/Airlocks/Glass/chemistry.rsi
chemistry: _Sunrise/Structures/Doors/Airlocks/Glass/chemistry.rsi #Sunrise-Resprite
science: Structures/Doors/Airlocks/Glass/science.rsi
engineering: Structures/Doors/Airlocks/Glass/engineering.rsi
glass: Structures/Doors/Airlocks/Glass/glass.rsi
hydroponics: Structures/Doors/Airlocks/Glass/hydroponics.rsi
hydroponics: _Sunrise/Structures/Doors/Airlocks/Glass/hydroponics.rsi #Sunrise-Resprite
maintenance: Structures/Doors/Airlocks/Glass/maint.rsi
medical: Structures/Doors/Airlocks/Glass/medical.rsi
security: Structures/Doors/Airlocks/Glass/security.rsi

View file

@ -14,7 +14,7 @@
sprite: _Sunrise/Objects/Weapons/Guns/Rifles/akms/big.rsi
state: icon
product: CrateArmoryAKMS
cost: 11000
cost: 35000
category: cargoproduct-category-name-armory
group: market

View file

@ -38,7 +38,6 @@
- type: PowerCellDraw
drawRate: 0
useRate: 20
- type: ToggleCellDraw
- type: entity
parent: [ClothingEyesNVD,ShowSecurityIcons]

View file

@ -2,7 +2,7 @@
name: blood red backpack shield generator
description: A backpack shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
id: EnergyDomeGeneratorBackpackSyndie
parent: BaseItem
parent: [ BaseItem, BaseSyndicateContraband ]
components:
- type: Item
size: Ginormous
@ -38,11 +38,51 @@
- type: UseDelay
delay: 10.0
- type: entity
name: BR-50c "Bastion"
description: A backpack shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
id: EnergyDomeGeneratorBackpackNT
parent: [ BaseItem, BaseCentcommContraband ]
components:
- type: Item
size: Ginormous
- type: MultiHandedItem
- type: Clothing
quickEquip: false
slots:
- Back
- type: Sprite
sprite: _Sunrise/Objects/Tools/EnergyDome/nanotrasen_back.rsi
layers:
- state: icon
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellSmall
whitelist:
tags:
- PowerCell
- PowerCellSmall
- type: EnergyDomeGenerator
damageEnergyDraw: 3
domePrototype: EnergyDomeMediumBlue
- type: PowerCellDraw
drawRate: 2
useRate: 0
- type: UseDelay
delay: 10.0
- type: entity
name: BT-21b "Barrier"
description: A personal shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
id: EnergyDomeGeneratorPersonalNT
parent: BaseItem
parent: [ BaseItem, BaseCentcommContraband ]
components:
- type: Item
size: Ginormous

View file

@ -0,0 +1,90 @@
- type: entity
id: Reflector
name: reflector
placement:
mode: SnapgridCenter
components:
- type: MeleeSound
soundGroups:
Brute:
collection: GlassSmack
- type: Anchorable
- type: Pullable
- type: Rotatable
- type: Machine
- type: Physics
bodyType: Static
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
density: 400
mask:
- MachineMask
layer:
- MachineLayer
- type: Reflect
reflectProb: 1.0
overrideAngle: 270
reflects:
- Energy
- type: RCDDeconstructable
deconstructable: false
- type: Sprite
sprite: _Sunrise/Structures/Reflector/reflector.rsi
layers:
- state: reflector_box
shader: unshaded
- type: Repairable
fuelCost: 15
doAfterDelay: 3
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: RGlass
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 1000
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- trigger:
!type:DamageTrigger
damage: 500
behaviors:
- !type:PlaySoundBehavior
sound:
collection: WindowShatter
- !type:SpawnEntitiesBehavior
spawn:
ShardGlassReinforced:
min: 1
max: 2
PartRodMetal:
min: 1
max: 2
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Construction
graph: Window
node: shuttleWindow
- type: Appearance
- type: DamageVisuals
thresholds: [5, 10, 20]
damageDivisor: 28
trackAllDamage: true
damageOverlay:
sprite: Structures/Windows/cracks.rsi
- type: StaticPrice
price: 150
- type: ExaminableDamage
messages: WindowMessages
- type: InteractionPopup
interactSuccessString: comp-window-knock
messagePerceivedByOthers: comp-window-knock
interactSuccessSound:
path: /Audio/Effects/glass_knock.ogg
- type: BlockWeather

View file

@ -146,6 +146,42 @@
- type: Tag
id: BorgMedicalTorso
- type: Tag
id: BorgPeaceHead
- type: Tag
id: BorgPeaceLArm
- type: Tag
id: BorgPeaceLLeg
- type: Tag
id: BorgPeaceRArm
- type: Tag
id: BorgPeaceRLeg
- type: Tag
id: BorgPeaceTorso
- type: Tag
id: BorgClownHead
- type: Tag
id: BorgClownLArm
- type: Tag
id: BorgClownLLeg
- type: Tag
id: BorgClownRArm
- type: Tag
id: BorgClownRLeg
- type: Tag
id: BorgClownTorso
- type: Tag
id: BorgMiningHead

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

View file

@ -213,6 +213,78 @@
},
{
"name": "service_r_leg+o"
},
{
"name": "peace_l_arm"
},
{
"name": "peace_r_arm"
},
{
"name": "peace_l_leg"
},
{
"name": "peace_r_leg"
},
{
"name": "peace_chest"
},
{
"name": "peace_head"
},
{
"name": "peace_head+o"
},
{
"name": "peace_chest+o"
},
{
"name": "peace_l_arm+o"
},
{
"name": "peace_r_arm+o"
},
{
"name": "peace_l_leg+o"
},
{
"name": "peace_r_leg+o"
},
{
"name": "clown_l_arm"
},
{
"name": "clown_r_arm"
},
{
"name": "clown_l_leg"
},
{
"name": "clown_r_leg"
},
{
"name": "clown_chest"
},
{
"name": "clown_head"
},
{
"name": "clown_head+o"
},
{
"name": "clown_chest+o"
},
{
"name": "clown_l_arm+o"
},
{
"name": "clown_r_arm+o"
},
{
"name": "clown_l_leg+o"
},
{
"name": "clown_r_leg+o"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

View file

@ -0,0 +1,34 @@
{
"version": 1,
"license": "CLA",
"copyright": "SUNRISE",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon",
"delays": [
[
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "equipped-BACKPACK",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

View file

@ -0,0 +1,15 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"copyright": "Taked From Paradise Station",
"license": "CC-BY-SA-3.0",
"states": [
{
"name": "reflector_box",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -73,19 +73,21 @@
- Flags: MAPPING
Commands:
- addmap
- loadgrid
- loadmap
#Sunrise-start: loadmap|mapinit|loadgrid|tpgrid|rmmap|rmgrid for moderators
# - loadgrid
# - loadmap
- pausemap
- querymappaused
- rmgrid
- rmmap
- mapinit
# - rmgrid
# - rmmap
# - mapinit
- savegrid
- savemap
- setambientlight
- tpgrid
# - tpgrid
- gridtc
- togglespritenetsync
#Sunrise-end
- Flags: ADMIN
Commands:
@ -111,6 +113,14 @@
- spawn
- cspawn
- delete
#Sunrise-start: loadmap|mapinit|loadgrid for moderators
- loadgrid
- loadmap
- mapinit
- tpgrid
- rmgrid
- rmmap
#Sunrise-end
- Flags: MODERATOR
Commands: