Magic 3 (#340)
* - add: Some tweaks and localization. * - add: Teleport spell. * - tweak: Tweak wizard hardsuit. * - add: Turn off shield on cast. * - add: New wizard clothes & update wizard shuttle, * - remove: Remove old clothes from shuttle. * - fix: No teleporting to centcomm.
@@ -0,0 +1,39 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using Content.Client._White.Cult.UI.TeleportRunesList;
|
||||||
|
using Content.Client.Eui;
|
||||||
|
using Content.Shared._White.Wizard.Teleport;
|
||||||
|
using Content.Shared.Eui;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
|
||||||
|
namespace Content.Client._White.Wizard.TeleportSpell;
|
||||||
|
|
||||||
|
[UsedImplicitly]
|
||||||
|
public sealed class TeleportSpellEui : BaseEui
|
||||||
|
{
|
||||||
|
private readonly TeleportRunesListWindow _window = new();
|
||||||
|
|
||||||
|
public override void Opened()
|
||||||
|
{
|
||||||
|
_window.OpenCentered();
|
||||||
|
_window.ItemSelected +=
|
||||||
|
(index, _) => SendMessage(new TeleportSpellTargetLocationSelected {LocationUid = index});
|
||||||
|
_window.OnClose += () => SendMessage(new CloseEuiMessage());
|
||||||
|
|
||||||
|
base.Opened();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Closed()
|
||||||
|
{
|
||||||
|
base.Closed();
|
||||||
|
_window.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void HandleState(EuiStateBase state)
|
||||||
|
{
|
||||||
|
if (state is not TeleportSpellEuiState cast)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_window.Clear();
|
||||||
|
_window.PopulateList(cast.Locations.Keys.ToList(), cast.Locations.Values.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,10 +3,12 @@ using Content.Server.DeviceLinking.Systems;
|
|||||||
using Content.Server.Power.Components;
|
using Content.Server.Power.Components;
|
||||||
using Content.Server.Power.EntitySystems;
|
using Content.Server.Power.EntitySystems;
|
||||||
using Content.Server.PowerCell;
|
using Content.Server.PowerCell;
|
||||||
|
using Content.Shared._White.Events;
|
||||||
using Content.Shared.Actions;
|
using Content.Shared.Actions;
|
||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
|
using Content.Shared.Inventory;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Content.Shared.PowerCell;
|
using Content.Shared.PowerCell;
|
||||||
using Content.Shared.PowerCell.Components;
|
using Content.Shared.PowerCell.Components;
|
||||||
@@ -53,10 +55,19 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
|||||||
|
|
||||||
SubscribeLocalEvent<EnergyDomeGeneratorComponent, ComponentRemove>(OnComponentRemove);
|
SubscribeLocalEvent<EnergyDomeGeneratorComponent, ComponentRemove>(OnComponentRemove);
|
||||||
|
|
||||||
|
SubscribeLocalEvent<EnergyDomeGeneratorComponent, InventoryRelayedEvent<EnergyDomeClothesTurnOffEvent>>(
|
||||||
|
OnClothesTurnOff);
|
||||||
|
|
||||||
//Dome events
|
//Dome events
|
||||||
SubscribeLocalEvent<EnergyDomeComponent, DamageChangedEvent>(OnDomeDamaged);
|
SubscribeLocalEvent<EnergyDomeComponent, DamageChangedEvent>(OnDomeDamaged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnClothesTurnOff(Entity<EnergyDomeGeneratorComponent> ent,
|
||||||
|
ref InventoryRelayedEvent<EnergyDomeClothesTurnOffEvent> args)
|
||||||
|
{
|
||||||
|
TurnOff(ent, false);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnInit(Entity<EnergyDomeGeneratorComponent> generator, ref MapInitEvent args)
|
private void OnInit(Entity<EnergyDomeGeneratorComponent> generator, ref MapInitEvent args)
|
||||||
{
|
{
|
||||||
if (generator.Comp.CanDeviceNetworkUse)
|
if (generator.Comp.CanDeviceNetworkUse)
|
||||||
@@ -179,12 +190,11 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
|||||||
|
|
||||||
if (HasComp<PowerCellDrawComponent>(generatorUid))
|
if (HasComp<PowerCellDrawComponent>(generatorUid))
|
||||||
{
|
{
|
||||||
_powerCell.TryGetBatteryFromSlot(generatorUid, out var cell);
|
if (_powerCell.TryGetBatteryFromSlot(generatorUid, out var cell, out var batteryComp))
|
||||||
if (cell != null)
|
|
||||||
{
|
{
|
||||||
_battery.UseCharge(generatorUid, energyLeak);
|
_battery.UseCharge(cell.Value, energyLeak, batteryComp);
|
||||||
|
|
||||||
if (cell.CurrentCharge == 0)
|
if (batteryComp.CurrentCharge == 0)
|
||||||
TurnOff((generatorUid, generatorComp), true);
|
TurnOff((generatorUid, generatorComp), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -298,7 +308,7 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
generator.Comp.Enabled = false;
|
generator.Comp.Enabled = false;
|
||||||
QueueDel(generator.Comp.SpawnedDome);
|
Del(generator.Comp.SpawnedDome);
|
||||||
|
|
||||||
_powerCell.SetPowerCellDrawEnabled(generator, false);
|
_powerCell.SetPowerCellDrawEnabled(generator, false);
|
||||||
if (TryComp<BatterySelfRechargerComponent>(generator, out var recharger))
|
if (TryComp<BatterySelfRechargerComponent>(generator, out var recharger))
|
||||||
@@ -325,4 +335,4 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
|||||||
? container.Owner
|
? container.Owner
|
||||||
: entity;
|
: entity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,17 +3,21 @@ using System.Numerics;
|
|||||||
using Content.Server._White.IncorporealSystem;
|
using Content.Server._White.IncorporealSystem;
|
||||||
using Content.Server._White.Wizard.Magic.Amaterasu;
|
using Content.Server._White.Wizard.Magic.Amaterasu;
|
||||||
using Content.Server._White.Wizard.Magic.Other;
|
using Content.Server._White.Wizard.Magic.Other;
|
||||||
|
using Content.Server._White.Wizard.Teleport;
|
||||||
using Content.Server.Abilities.Mime;
|
using Content.Server.Abilities.Mime;
|
||||||
using Content.Server.Administration.Commands;
|
using Content.Server.Administration.Commands;
|
||||||
using Content.Server.Atmos.Components;
|
using Content.Server.Atmos.Components;
|
||||||
using Content.Server.Atmos.EntitySystems;
|
using Content.Server.Atmos.EntitySystems;
|
||||||
using Content.Server.Chat.Systems;
|
using Content.Server.Chat.Systems;
|
||||||
using Content.Server.Emp;
|
using Content.Server.Emp;
|
||||||
|
using Content.Server.EUI;
|
||||||
using Content.Server.Lightning;
|
using Content.Server.Lightning;
|
||||||
using Content.Server.Magic;
|
using Content.Server.Magic;
|
||||||
using Content.Server.Singularity.EntitySystems;
|
using Content.Server.Singularity.EntitySystems;
|
||||||
using Content.Server.Standing;
|
using Content.Server.Standing;
|
||||||
using Content.Server.Weapons.Ranged.Systems;
|
using Content.Server.Weapons.Ranged.Systems;
|
||||||
|
using Content.Shared._White.BetrayalDagger;
|
||||||
|
using Content.Shared._White.Events;
|
||||||
using Content.Shared._White.Wizard;
|
using Content.Shared._White.Wizard;
|
||||||
using Content.Shared._White.Wizard.Magic;
|
using Content.Shared._White.Wizard.Magic;
|
||||||
using Content.Shared.Actions;
|
using Content.Shared.Actions;
|
||||||
@@ -36,6 +40,7 @@ using Content.Shared.Throwing;
|
|||||||
using Robust.Shared.Audio.Systems;
|
using Robust.Shared.Audio.Systems;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
namespace Content.Server._White.Wizard.Magic;
|
namespace Content.Server._White.Wizard.Magic;
|
||||||
@@ -64,6 +69,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
[Dependency] private readonly EmpSystem _empSystem = default!;
|
[Dependency] private readonly EmpSystem _empSystem = default!;
|
||||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||||
[Dependency] private readonly StandingStateSystem _standing = default!;
|
[Dependency] private readonly StandingStateSystem _standing = default!;
|
||||||
|
[Dependency] private readonly TelefragSystem _telefrag = default!;
|
||||||
|
[Dependency] private readonly EuiManager _euiManager = default!;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -71,6 +78,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<TeleportSpellEvent>(OnTeleportSpell);
|
||||||
SubscribeLocalEvent<InstantRecallSpellEvent>(OnInstantRecallSpell);
|
SubscribeLocalEvent<InstantRecallSpellEvent>(OnInstantRecallSpell);
|
||||||
SubscribeLocalEvent<MimeTouchSpellEvent>(OnMimeTouchSpell);
|
SubscribeLocalEvent<MimeTouchSpellEvent>(OnMimeTouchSpell);
|
||||||
SubscribeLocalEvent<BananaTouchSpellEvent>(OnBananaTouchSpell);
|
SubscribeLocalEvent<BananaTouchSpellEvent>(OnBananaTouchSpell);
|
||||||
@@ -87,6 +95,26 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<MagicComponent, BeforeCastSpellEvent>(OnBeforeCastSpell);
|
SubscribeLocalEvent<MagicComponent, BeforeCastSpellEvent>(OnBeforeCastSpell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Teleport
|
||||||
|
|
||||||
|
private void OnTeleportSpell(TeleportSpellEvent msg)
|
||||||
|
{
|
||||||
|
if (!CanCast(msg))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!TryComp(msg.Performer, out ActorComponent? actor))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var eui = new TeleportSpellEui(msg.Performer);
|
||||||
|
_euiManager.OpenEui(eui, actor.PlayerSession);
|
||||||
|
eui.StateDirty();
|
||||||
|
|
||||||
|
msg.Handled = true;
|
||||||
|
Speak(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Instant Recall
|
#region Instant Recall
|
||||||
|
|
||||||
private void OnInstantRecallSpell(InstantRecallSpellEvent msg)
|
private void OnInstantRecallSpell(InstantRecallSpellEvent msg)
|
||||||
@@ -289,6 +317,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
if (!foundTeleportPos)
|
if (!foundTeleportPos)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
_telefrag.Telefrag(coords, msg.Performer);
|
||||||
_transformSystem.SetCoordinates(msg.Performer, coords);
|
_transformSystem.SetCoordinates(msg.Performer, coords);
|
||||||
_transformSystem.AttachToGridOrMap(msg.Performer);
|
_transformSystem.AttachToGridOrMap(msg.Performer);
|
||||||
|
|
||||||
@@ -404,6 +433,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
|
|
||||||
private void CardsSpellDefault(CardsSpellEvent msg)
|
private void CardsSpellDefault(CardsSpellEvent msg)
|
||||||
{
|
{
|
||||||
|
TurnOffShield(msg.Performer);
|
||||||
|
|
||||||
var xform = Transform(msg.Performer);
|
var xform = Transform(msg.Performer);
|
||||||
|
|
||||||
for (var i = 0; i < 10; i++)
|
for (var i = 0; i < 10; i++)
|
||||||
@@ -428,6 +459,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
|
|
||||||
private void CardsSpellCharge(CardsSpellEvent msg)
|
private void CardsSpellCharge(CardsSpellEvent msg)
|
||||||
{
|
{
|
||||||
|
TurnOffShield(msg.Performer);
|
||||||
|
|
||||||
var xform = Transform(msg.Performer);
|
var xform = Transform(msg.Performer);
|
||||||
|
|
||||||
var count = 10 + 10 * msg.ChargeLevel;
|
var count = 10 + 10 * msg.ChargeLevel;
|
||||||
@@ -466,6 +499,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
Del(msg.TargetUid);
|
Del(msg.TargetUid);
|
||||||
var item = Spawn(msg.Prototype);
|
var item = Spawn(msg.Prototype);
|
||||||
_handsSystem.TryPickupAnyHand(msg.Performer, item);
|
_handsSystem.TryPickupAnyHand(msg.Performer, item);
|
||||||
|
TurnOffShield(msg.Performer);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -504,6 +538,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
|
|
||||||
private void FireballSpellDefault(FireballSpellEvent msg)
|
private void FireballSpellDefault(FireballSpellEvent msg)
|
||||||
{
|
{
|
||||||
|
TurnOffShield(msg.Performer);
|
||||||
|
|
||||||
var xform = Transform(msg.Performer);
|
var xform = Transform(msg.Performer);
|
||||||
|
|
||||||
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
||||||
@@ -662,12 +698,14 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
|
|
||||||
private void ArcSpellCharge(ArcSpellEvent msg)
|
private void ArcSpellCharge(ArcSpellEvent msg)
|
||||||
{
|
{
|
||||||
_lightning.ShootRandomLightnings(msg.Performer, 2f * msg.ChargeLevel, msg.ChargeLevel * 2, "WizardLightning", 1,
|
_lightning.ShootRandomLightnings(msg.Performer, 1.5f * msg.ChargeLevel, msg.ChargeLevel * 2, "WizardLightning", 2,
|
||||||
caster: msg.Performer);
|
caster: msg.Performer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ArcSpellAlt(ArcSpellEvent msg)
|
private void ArcSpellAlt(ArcSpellEvent msg)
|
||||||
{
|
{
|
||||||
|
TurnOffShield(msg.Performer);
|
||||||
|
|
||||||
var xform = Transform(msg.Performer);
|
var xform = Transform(msg.Performer);
|
||||||
|
|
||||||
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
||||||
@@ -693,6 +731,11 @@ public sealed class WizardSpellsSystem : EntitySystem
|
|||||||
|
|
||||||
#region Helpers
|
#region Helpers
|
||||||
|
|
||||||
|
private void TurnOffShield(EntityUid uid)
|
||||||
|
{
|
||||||
|
RaiseLocalEvent(uid, new EnergyDomeClothesTurnOffEvent());
|
||||||
|
}
|
||||||
|
|
||||||
private bool CanCast(BaseActionEvent msg)
|
private bool CanCast(BaseActionEvent msg)
|
||||||
{
|
{
|
||||||
return !msg.Handled && CheckRequirements(msg.Action, msg.Performer) &&
|
return !msg.Handled && CheckRequirements(msg.Action, msg.Performer) &&
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Content.Server._White.Wizard.Teleport;
|
||||||
|
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed partial class SpawnTeleportLocationComponent : Component
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace Content.Server._White.Wizard.Teleport;
|
||||||
|
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed partial class TeleportLocationComponent : Component
|
||||||
|
{
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string Location = string.Empty;
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using Content.Server.Pinpointer;
|
||||||
|
using Content.Server.Warps;
|
||||||
|
|
||||||
|
namespace Content.Server._White.Wizard.Teleport;
|
||||||
|
|
||||||
|
public sealed class TeleportLocationSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<SpawnTeleportLocationComponent, MapInitEvent>(OnMapInit,
|
||||||
|
after: new[] {typeof(NavMapSystem)});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMapInit(Entity<SpawnTeleportLocationComponent> ent, ref MapInitEvent args)
|
||||||
|
{
|
||||||
|
if (!TryComp(ent, out WarpPointComponent? warpPoint) || warpPoint.Location == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var newEnt = Spawn(null, Transform(ent).Coordinates);
|
||||||
|
var xForm = EnsureComp<TransformComponent>(newEnt);
|
||||||
|
_transformSystem.AttachToGridOrMap(newEnt, xForm);
|
||||||
|
var location = EnsureComp<TeleportLocationComponent>(newEnt);
|
||||||
|
location.Location = warpPoint.Location;
|
||||||
|
}
|
||||||
|
}
|
||||||
102
Content.Server/_White/Wizard/Teleport/TeleportSpellEui.cs
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using Content.Server.EUI;
|
||||||
|
using Content.Server.Popups;
|
||||||
|
using Content.Server.Station.Systems;
|
||||||
|
using Content.Shared._White.Wizard.Teleport;
|
||||||
|
using Content.Shared.Eui;
|
||||||
|
using Robust.Shared.Timing;
|
||||||
|
using TeleportSpellEuiState = Content.Shared._White.Wizard.Teleport.TeleportSpellEuiState;
|
||||||
|
|
||||||
|
namespace Content.Server._White.Wizard.Teleport;
|
||||||
|
|
||||||
|
public sealed class TeleportSpellEui : BaseEui
|
||||||
|
{
|
||||||
|
[Dependency] private readonly EntityManager _entityManager = default!;
|
||||||
|
private readonly SharedTransformSystem _transformSystem;
|
||||||
|
private readonly StationSystem _station;
|
||||||
|
private readonly PopupSystem _popupSystem;
|
||||||
|
|
||||||
|
private readonly EntityUid _performer;
|
||||||
|
|
||||||
|
private bool _used;
|
||||||
|
|
||||||
|
public TeleportSpellEui(EntityUid performer)
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
_transformSystem = _entityManager.System<SharedTransformSystem>();
|
||||||
|
_station = _entityManager.System<StationSystem>();
|
||||||
|
_popupSystem = _entityManager.System<PopupSystem>();
|
||||||
|
|
||||||
|
_performer = performer;
|
||||||
|
|
||||||
|
Timer.Spawn(TimeSpan.FromSeconds(10), Close);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EuiStateBase GetNewState()
|
||||||
|
{
|
||||||
|
var locationQuery = _entityManager.EntityQueryEnumerator<TeleportLocationComponent, TransformComponent>();
|
||||||
|
var state = new TeleportSpellEuiState();
|
||||||
|
|
||||||
|
while (locationQuery.MoveNext(out var locationUid, out var locationComponent, out var transformComponent))
|
||||||
|
{
|
||||||
|
var station = _station.GetOwningStation(locationUid, transformComponent);
|
||||||
|
if (_entityManager.EntityQuery<WizardRuleComponent>(true)
|
||||||
|
.Any(wizardRule => wizardRule.TargetStation == station))
|
||||||
|
{
|
||||||
|
state.Locations.Add((int) locationUid, locationComponent.Location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void HandleMessage(EuiMessageBase msg)
|
||||||
|
{
|
||||||
|
base.HandleMessage(msg);
|
||||||
|
|
||||||
|
if (_used)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg is not TeleportSpellTargetLocationSelected cast)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var transform = _entityManager.GetComponent<TransformComponent>(_performer);
|
||||||
|
var oldCoords = transform.Coordinates;
|
||||||
|
|
||||||
|
TransformComponent? locationTransform = null;
|
||||||
|
|
||||||
|
var teleportLocationQuery = _entityManager
|
||||||
|
.EntityQueryEnumerator<TeleportLocationComponent, TransformComponent>();
|
||||||
|
while (teleportLocationQuery.MoveNext(out var locationUid, out _, out var transformComponent))
|
||||||
|
{
|
||||||
|
if (locationUid == new EntityUid(cast.LocationUid))
|
||||||
|
{
|
||||||
|
locationTransform = transformComponent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locationTransform is null)
|
||||||
|
{
|
||||||
|
_popupSystem.PopupEntity("Can't teleport", _performer, _performer);
|
||||||
|
DoStateUpdate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_used = true;
|
||||||
|
|
||||||
|
var coords = locationTransform.Coordinates;
|
||||||
|
|
||||||
|
_transformSystem.SetCoordinates(_performer, coords);
|
||||||
|
_transformSystem.AttachToGridOrMap(_performer, transform);
|
||||||
|
|
||||||
|
_entityManager.SpawnEntity("AdminInstantEffectSmoke10", oldCoords);
|
||||||
|
_entityManager.SpawnEntity("AdminInstantEffectSmoke10", coords);
|
||||||
|
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ public sealed partial class WizardRuleComponent : Component
|
|||||||
{
|
{
|
||||||
public readonly List<EntityUid> WizardMinds = new();
|
public readonly List<EntityUid> WizardMinds = new();
|
||||||
|
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public EntityUid? TargetStation;
|
public EntityUid? TargetStation;
|
||||||
|
|
||||||
[DataField("minPlayers")]
|
[DataField("minPlayers")]
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Shared._White.Events;
|
||||||
using Content.Shared._White.StaminaProtection;
|
using Content.Shared._White.StaminaProtection;
|
||||||
using Content.Shared.Changeling;
|
using Content.Shared.Changeling;
|
||||||
using Content.Shared.Chemistry;
|
using Content.Shared.Chemistry;
|
||||||
@@ -32,6 +33,7 @@ public partial class InventorySystem
|
|||||||
SubscribeLocalEvent<InventoryComponent, StaminaDamageModifyEvent>(RelayInventoryEvent); // WD
|
SubscribeLocalEvent<InventoryComponent, StaminaDamageModifyEvent>(RelayInventoryEvent); // WD
|
||||||
SubscribeLocalEvent<InventoryComponent, ChemRegenModifyEvent>(RelayInventoryEvent); // WD
|
SubscribeLocalEvent<InventoryComponent, ChemRegenModifyEvent>(RelayInventoryEvent); // WD
|
||||||
SubscribeLocalEvent<InventoryComponent, ChangelingRefundEvent>(RelayInventoryEvent); // WD
|
SubscribeLocalEvent<InventoryComponent, ChangelingRefundEvent>(RelayInventoryEvent); // WD
|
||||||
|
SubscribeLocalEvent<InventoryComponent, EnergyDomeClothesTurnOffEvent>(RelayInventoryEvent); // WD
|
||||||
SubscribeLocalEvent<InventoryComponent, GetDefaultRadioChannelEvent>(RelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, GetDefaultRadioChannelEvent>(RelayInventoryEvent);
|
||||||
|
|
||||||
// by-ref events
|
// by-ref events
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
using Content.Shared.Inventory;
|
||||||
|
|
||||||
|
namespace Content.Shared._White.Events;
|
||||||
|
|
||||||
|
public sealed class EnergyDomeClothesTurnOffEvent : EntityEventArgs, IInventoryRelayEvent
|
||||||
|
{
|
||||||
|
public SlotFlags TargetSlots => SlotFlags.OUTERCLOTHING;
|
||||||
|
}
|
||||||
@@ -38,7 +38,8 @@ public abstract class SharedScrollSystem : EntitySystem
|
|||||||
if (args.Handled)
|
if (args.Handled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new ScrollDoAfterEvent(), uid, target: uid)
|
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new ScrollDoAfterEvent(),
|
||||||
|
uid, target: uid)
|
||||||
{
|
{
|
||||||
BreakOnMove = true,
|
BreakOnMove = true,
|
||||||
BreakOnDamage = true,
|
BreakOnDamage = true,
|
||||||
@@ -50,7 +51,9 @@ public abstract class SharedScrollSystem : EntitySystem
|
|||||||
_audioSystem.PlayPvs(component.UseSound, args.User);
|
_audioSystem.PlayPvs(component.UseSound, args.User);
|
||||||
}
|
}
|
||||||
|
|
||||||
_popupSystem.PopupClient($"You start learning about {component.LearnPopup}.", args.User, args.User, PopupType.Medium);
|
_popupSystem.PopupClient(
|
||||||
|
Loc.GetString("scroll-component-start", ("subject", Loc.GetString(component.LearnPopup))), args.User,
|
||||||
|
args.User, PopupType.Medium);
|
||||||
|
|
||||||
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
|
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
|
||||||
|
|
||||||
@@ -69,7 +72,9 @@ public abstract class SharedScrollSystem : EntitySystem
|
|||||||
_audioSystem.PlayEntity(component.AfterUseSound, args.User, args.User);
|
_audioSystem.PlayEntity(component.AfterUseSound, args.User, args.User);
|
||||||
}
|
}
|
||||||
|
|
||||||
_popupSystem.PopupClient($"You learned much about {component.LearnPopup}. The scroll is slowly burning in your hands.", args.User, args.User, PopupType.Medium);
|
_popupSystem.PopupClient(
|
||||||
|
Loc.GetString("scroll-component-end", ("subject", Loc.GetString(component.LearnPopup))), args.User,
|
||||||
|
args.User, PopupType.Medium);
|
||||||
|
|
||||||
BurnScroll(uid);
|
BurnScroll(uid);
|
||||||
|
|
||||||
@@ -80,7 +85,7 @@ public abstract class SharedScrollSystem : EntitySystem
|
|||||||
|
|
||||||
#region Helpers
|
#region Helpers
|
||||||
|
|
||||||
protected virtual void BurnScroll(EntityUid uid) {}
|
protected virtual void BurnScroll(EntityUid uid) { }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using Content.Shared.Eui;
|
||||||
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
|
namespace Content.Shared._White.Wizard.Teleport;
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class TeleportSpellEuiState : EuiStateBase
|
||||||
|
{
|
||||||
|
public Dictionary<int, string> Locations = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class TeleportSpellTargetLocationSelected : EuiMessageBase
|
||||||
|
{
|
||||||
|
public int LocationUid;
|
||||||
|
}
|
||||||
@@ -172,4 +172,10 @@ public sealed partial class InstantRecallSpellEvent : InstantActionEvent, ISpeak
|
|||||||
public string? Speech { get; private set; }
|
public string? Speech { get; private set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed partial class TeleportSpellEvent : InstantActionEvent, ISpeakSpell
|
||||||
|
{
|
||||||
|
[DataField("speech")]
|
||||||
|
public string? Speech { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
48
Resources/Locale/ru-RU/_white/wizard/scrolls.ftl
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
scroll-component-start = Вы начинаете изучать { $subject }.
|
||||||
|
scroll-component-end = Вы изучили { $subject }. Свиток медленно сгорает в ваших руках.
|
||||||
|
|
||||||
|
scroll-component-fireball = огненный шар
|
||||||
|
scroll-component-forcewall = силовую стену
|
||||||
|
scroll-component-knock = тук-тук
|
||||||
|
scroll-component-lightning = молнию
|
||||||
|
scroll-component-force = силу
|
||||||
|
scroll-component-cards = карты
|
||||||
|
scroll-component-blink = прыжок
|
||||||
|
scroll-component-jaunt = потустороннее путешествие
|
||||||
|
scroll-component-emp = ЭМИ
|
||||||
|
scroll-component-cluwne = проклятье
|
||||||
|
scroll-component-clown = бананы
|
||||||
|
scroll-component-silence = тишину
|
||||||
|
scroll-component-recall = призыв
|
||||||
|
scroll-component-teleport = телепортацию
|
||||||
|
|
||||||
|
ent-BaseScroll = магический свиток
|
||||||
|
.desc = Этот древний пергамент, ставший реликвией в арканных преданиях, хранит в себе бесчисленные мистические заклятия и забытые заклинания.
|
||||||
|
ent-ScrollFireball = свиток огненного шара
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollForcewall = свиток силовой стены
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollKnock = свиток стука
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollArc = свиток молнии
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollForce = свиток силы
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollCards = свиток карт
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollBlink = свиток прыжка
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollEtherealJaunt = свиток потустороннего путешествия
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollEmp = свиток ЭМИ
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollCluwneCurse = свиток проклятия клувна
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollBananaTouch = свиток бананового касания
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollMimeTouch = свиток касания мима
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollInstantRecall = свиток мгновенного призыва
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
|
ent-ScrollTeleport = свиток телепортации
|
||||||
|
.desc = { ent-BaseScroll.desc }
|
||||||
@@ -11,9 +11,12 @@ roles-antag-wizard-objective = Устройте хаос на станции
|
|||||||
|
|
||||||
wizard-round-end-agent-name = космический волшебник
|
wizard-round-end-agent-name = космический волшебник
|
||||||
|
|
||||||
wizard-welcome = Вы - космический волшебник. Федерация Космических Волшебников отправила вас на станцию {$station}, дабы посеять хаос. Не разочаруйте их.
|
wizard-welcome = Вы - космический волшебник. Федерация Космических Волшебников отправила вас на станцию {$station}, дабы посеять хаос. Вы можете попасть на станцию с помощью гиперпрыжка или с помощью магии телепортации.
|
||||||
|
|
||||||
wizard-no-more-threat-announcement-shuttle-call = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Эвакуационный шаттл скоро прибудет. Время прибытия: {$time} {$units}. Вы можете отозвать его, чтобы продлить смену.
|
wizard-no-more-threat-announcement-shuttle-call = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Эвакуационный шаттл скоро прибудет. Время прибытия: {$time} {$units}. Вы можете отозвать его, чтобы продлить смену.
|
||||||
wizard-no-more-threat-announcement = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Шаттл уже вызван.
|
wizard-no-more-threat-announcement = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Шаттл уже вызван.
|
||||||
|
|
||||||
magic-component-missing-req = Недостающие требования! Вам необходимо надеть мантию и шляпу!
|
magic-component-missing-req = Недостающие требования! Вам необходимо надеть мантию и шляпу!
|
||||||
|
|
||||||
|
ent-WizardSurviveObjective = Переживете смену, устроив как можно больше хаоса.
|
||||||
|
.desc = Федерация Космических Волшебников отправила вас на станцию Nanotrasen, чтобы навести там смуту. Не разочаруйте их.
|
||||||
@@ -671,10 +671,10 @@
|
|||||||
coefficients:
|
coefficients:
|
||||||
Blunt: 0.6
|
Blunt: 0.6
|
||||||
Slash: 0.6
|
Slash: 0.6
|
||||||
Piercing: 0.4
|
Piercing: 0.6
|
||||||
Heat: 0.25
|
Heat: 0.6
|
||||||
Radiation: 0.25
|
Radiation: 0.25
|
||||||
Caustic: 0.75
|
Caustic: 0.25
|
||||||
- type: ToggleableClothing
|
- type: ToggleableClothing
|
||||||
clothingPrototype: ClothingHeadHelmetHardsuitWizard
|
clothingPrototype: ClothingHeadHelmetHardsuitWizard
|
||||||
- type: ContainerContainer
|
- type: ContainerContainer
|
||||||
@@ -693,11 +693,11 @@
|
|||||||
- PowerCell
|
- PowerCell
|
||||||
- PowerCellSmall
|
- PowerCellSmall
|
||||||
- type: EnergyDomeGenerator
|
- type: EnergyDomeGenerator
|
||||||
damageEnergyDraw: 3
|
damageEnergyDraw: 5
|
||||||
domePrototype: EnergyDomeSmallPink
|
domePrototype: EnergyDomeSmallPink
|
||||||
- type: ClothingSpeedModifier
|
- type: ClothingSpeedModifier
|
||||||
walkModifier: 1
|
walkModifier: 0.9
|
||||||
sprintModifier: 1
|
sprintModifier: 0.9
|
||||||
- type: PowerCellDraw
|
- type: PowerCellDraw
|
||||||
drawRate: 8
|
drawRate: 8
|
||||||
useRate: 0
|
useRate: 0
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
name: warp point
|
name: warp point
|
||||||
components:
|
components:
|
||||||
- type: WarpPoint
|
- type: WarpPoint
|
||||||
|
- type: SpawnTeleportLocation
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: pink
|
state: pink
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
defaultText: station-beacon-general
|
defaultText: station-beacon-general
|
||||||
color: "#D4D4D496"
|
color: "#D4D4D496"
|
||||||
- type: WarpPoint
|
- type: WarpPoint
|
||||||
|
- type: SpawnTeleportLocation
|
||||||
|
- type: GiftIgnore
|
||||||
- type: ActivatableUI
|
- type: ActivatableUI
|
||||||
key: enum.NavMapBeaconUiKey.Key
|
key: enum.NavMapBeaconUiKey.Key
|
||||||
singleUser: true
|
singleUser: true
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
- type: VariableUseDelay
|
- type: VariableUseDelay
|
||||||
useDelay: 6
|
useDelay: 6
|
||||||
altUseDelay: 12
|
altUseDelay: 12
|
||||||
chargeUseDelay: 40
|
chargeUseDelay: 30
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionForceSpell
|
id: ActionForceSpell
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
- type: VariableUseDelay
|
- type: VariableUseDelay
|
||||||
useDelay: 6
|
useDelay: 6
|
||||||
altUseDelay: 2
|
altUseDelay: 2
|
||||||
chargeUseDelay: 20
|
chargeUseDelay: 30
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionFireballSpell
|
id: ActionFireballSpell
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
- type: VariableUseDelay
|
- type: VariableUseDelay
|
||||||
useDelay: 5
|
useDelay: 5
|
||||||
altUseDelay: 10
|
altUseDelay: 10
|
||||||
chargeUseDelay: 40
|
chargeUseDelay: 30
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionCardSpell
|
id: ActionCardSpell
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
- type: VariableUseDelay
|
- type: VariableUseDelay
|
||||||
useDelay: 4
|
useDelay: 4
|
||||||
altUseDelay: 1
|
altUseDelay: 1
|
||||||
chargeUseDelay: 40
|
chargeUseDelay: 30
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionForcewallSpell
|
id: ActionForcewallSpell
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
- type: VariableUseDelay
|
- type: VariableUseDelay
|
||||||
useDelay: 10
|
useDelay: 10
|
||||||
altUseDelay: 20
|
altUseDelay: 20
|
||||||
chargeUseDelay: 60
|
chargeUseDelay: 50
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionBlinkSpell
|
id: ActionBlinkSpell
|
||||||
@@ -272,3 +272,20 @@
|
|||||||
sprite: Objects/Magic/magicactions.rsi
|
sprite: Objects/Magic/magicactions.rsi
|
||||||
state: summons
|
state: summons
|
||||||
event: !type:InstantRecallSpellEvent
|
event: !type:InstantRecallSpellEvent
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
id: ActionTeleportSpell
|
||||||
|
name: Teleport
|
||||||
|
noSpawn: true
|
||||||
|
components:
|
||||||
|
- type: Magic
|
||||||
|
requiresClothes: true
|
||||||
|
- type: InstantAction
|
||||||
|
checkCanInteract: false
|
||||||
|
useDelay: 60
|
||||||
|
itemIconStyle: BigAction
|
||||||
|
icon:
|
||||||
|
sprite: Objects/Magic/magicactions.rsi
|
||||||
|
state: teleport
|
||||||
|
event: !type:TeleportSpellEvent
|
||||||
|
speech: "SCYAR FIDE!"
|
||||||
|
|||||||
@@ -33,3 +33,33 @@
|
|||||||
id: ClothingOuterRealWizardViolet
|
id: ClothingOuterRealWizardViolet
|
||||||
components:
|
components:
|
||||||
- type: WizardClothes
|
- type: WizardClothes
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: ClothingHeadHatWizard
|
||||||
|
id: ClothingHeadHatRealWizardFancy
|
||||||
|
components:
|
||||||
|
- type: WizardClothes
|
||||||
|
- type: Sprite
|
||||||
|
sprite: White/Clothing/Head/wizhat.rsi
|
||||||
|
- type: Clothing
|
||||||
|
sprite: White/Clothing/Head/wizhat.rsi
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: ClothingHeadHatWizard
|
||||||
|
id: ClothingHeadHatRealWizardFancyAlt
|
||||||
|
components:
|
||||||
|
- type: WizardClothes
|
||||||
|
- type: Sprite
|
||||||
|
sprite: White/Clothing/Head/wizhat-alt.rsi
|
||||||
|
- type: Clothing
|
||||||
|
sprite: White/Clothing/Head/wizhat-alt.rsi
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: ClothingOuterWizard
|
||||||
|
id: ClothingOuterRealWizardFancy
|
||||||
|
components:
|
||||||
|
- type: WizardClothes
|
||||||
|
- type: Sprite
|
||||||
|
sprite: White/Clothing/OuterClothing/robe.rsi
|
||||||
|
- type: Clothing
|
||||||
|
sprite: White/Clothing/OuterClothing/robe.rsi
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionFireballSpell
|
actionId: ActionFireballSpell
|
||||||
learnPopup: fireball
|
learnPopup: scroll-component-fireball
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollForcewall
|
id: ScrollForcewall
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionForcewallSpell
|
actionId: ActionForcewallSpell
|
||||||
learnPopup: forcewall
|
learnPopup: scroll-component-forcewall
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollKnock
|
id: ScrollKnock
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionKnock
|
actionId: ActionKnock
|
||||||
learnPopup: knock-knock
|
learnPopup: scroll-component-knock
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollArc
|
id: ScrollArc
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionElectricArcSpell
|
actionId: ActionElectricArcSpell
|
||||||
learnPopup: lightning
|
learnPopup: scroll-component-lightning
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollForce
|
id: ScrollForce
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionForceSpell
|
actionId: ActionForceSpell
|
||||||
learnPopup: force
|
learnPopup: scroll-component-force
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollCards
|
id: ScrollCards
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionCardSpell
|
actionId: ActionCardSpell
|
||||||
learnPopup: cards
|
learnPopup: scroll-component-cards
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollBlink
|
id: ScrollBlink
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionBlinkSpell
|
actionId: ActionBlinkSpell
|
||||||
learnPopup: blink
|
learnPopup: scroll-component-blink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollEtherealJaunt
|
id: ScrollEtherealJaunt
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionEtherealJauntSpell
|
actionId: ActionEtherealJauntSpell
|
||||||
learnPopup: jaunt
|
learnPopup: scroll-component-jaunt
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollEmp
|
id: ScrollEmp
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionEmpSpell
|
actionId: ActionEmpSpell
|
||||||
learnPopup: emp
|
learnPopup: scroll-component-emp
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollCluwneCurse
|
id: ScrollCluwneCurse
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionCluwneCurseSpell
|
actionId: ActionCluwneCurseSpell
|
||||||
learnPopup: curse
|
learnPopup: scroll-component-cluwne
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollBananaTouch
|
id: ScrollBananaTouch
|
||||||
@@ -114,7 +114,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionBananaTouchSpell
|
actionId: ActionBananaTouchSpell
|
||||||
learnPopup: banana
|
learnPopup: scroll-component-clown
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollMimeTouch
|
id: ScrollMimeTouch
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionMimeTouchSpell
|
actionId: ActionMimeTouchSpell
|
||||||
learnPopup: silence
|
learnPopup: scroll-component-silence
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ScrollInstantRecall
|
id: ScrollInstantRecall
|
||||||
@@ -132,4 +132,13 @@
|
|||||||
components:
|
components:
|
||||||
- type: Scroll
|
- type: Scroll
|
||||||
actionId: ActionInstantRecallSpell
|
actionId: ActionInstantRecallSpell
|
||||||
learnPopup: recall
|
learnPopup: scroll-component-recall
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
id: ScrollTeleport
|
||||||
|
parent: BaseScroll
|
||||||
|
name: "Teleport scroll"
|
||||||
|
components:
|
||||||
|
- type: Scroll
|
||||||
|
actionId: ActionTeleportSpell
|
||||||
|
learnPopup: scroll-component-teleport
|
||||||
|
|||||||
@@ -39,8 +39,8 @@
|
|||||||
equipment:
|
equipment:
|
||||||
jumpsuit: ClothingUniformJumpsuitColorDarkBlue
|
jumpsuit: ClothingUniformJumpsuitColorDarkBlue
|
||||||
back: ClothingBackpackFilled
|
back: ClothingBackpackFilled
|
||||||
head: ClothingHeadHatRealWizardBlue
|
head: ClothingHeadHatRealWizardFancy
|
||||||
outerClothing: ClothingOuterRealWizardBlue
|
outerClothing: ClothingOuterRealWizardFancy
|
||||||
shoes: ClothingShoesWizard
|
shoes: ClothingShoesWizard
|
||||||
innerClothingSkirt: ClothingUniformJumpskirtColorDarkBlue
|
innerClothingSkirt: ClothingUniformJumpskirtColorDarkBlue
|
||||||
satchel: ClothingBackpackSatchelFilled
|
satchel: ClothingBackpackSatchelFilled
|
||||||
|
|||||||
@@ -51,6 +51,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "summons"
|
"name": "summons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "teleport"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
Resources/Textures/Objects/Magic/magicactions.rsi/teleport.png
Normal file
|
After Width: | Height: | Size: 236 B |
|
After Width: | Height: | Size: 775 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat-alt.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 533 B |
|
After Width: | Height: | Size: 809 B |
|
After Width: | Height: | Size: 846 B |
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "White Dream",
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "equipped-HELMET",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-left",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-right",
|
||||||
|
"directions": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 881 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat.rsi/icon 2.png
Normal file
|
After Width: | Height: | Size: 506 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 643 B |
|
After Width: | Height: | Size: 795 B |
|
After Width: | Height: | Size: 792 B |
27
Resources/Textures/White/Clothing/Head/wizhat.rsi/meta.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "White Dream",
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "equipped-HELMET",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-left",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-right",
|
||||||
|
"directions": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 880 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "White Dream",
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "equipped-OUTERCLOTHING",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "equipped-OUTERCLOTHING-body-slim",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-left",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-right",
|
||||||
|
"directions": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||