fix: Codegens more misc items (#1214)
This commit is contained in:
parent
505865e3ed
commit
212ce8bc24
81 changed files with 2641 additions and 3498 deletions
|
|
@ -1,382 +1,315 @@
|
|||
using System;
|
||||
using ModernUO.Serialization;
|
||||
|
||||
namespace Server.Items
|
||||
namespace Server.Items;
|
||||
|
||||
public enum ECEffectType
|
||||
{
|
||||
public enum ECEffectType
|
||||
None,
|
||||
Moving,
|
||||
Location,
|
||||
Target,
|
||||
Lightning
|
||||
}
|
||||
|
||||
public enum EffectTriggerType
|
||||
{
|
||||
None,
|
||||
Sequenced,
|
||||
DoubleClick,
|
||||
InRange
|
||||
}
|
||||
|
||||
[SerializationGenerator(0, false)]
|
||||
public partial class EffectController : Item
|
||||
{
|
||||
[SerializableField(0)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private TimeSpan _effectDelay;
|
||||
|
||||
[SerializableField(1)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private TimeSpan _triggerDelay;
|
||||
|
||||
[SerializableField(2)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private TimeSpan _soundDelay;
|
||||
|
||||
[SerializableField(3)]
|
||||
private IEntity _source;
|
||||
|
||||
[SerializableField(4)]
|
||||
private IEntity _target;
|
||||
|
||||
[SerializableField(5)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private EffectController _sequence;
|
||||
|
||||
[SerializableField(6)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private bool _fixedDirection;
|
||||
|
||||
[SerializableField(7)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private bool _explodes;
|
||||
|
||||
[SerializableField(8)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private bool _playSoundAtTrigger;
|
||||
|
||||
[SerializableField(9)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private ECEffectType _effectType;
|
||||
|
||||
[SerializableField(10)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private EffectLayer _effectLayer;
|
||||
|
||||
[SerializableField(11)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private EffectTriggerType _triggerType;
|
||||
|
||||
[SerializableField(12)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _effectItemId;
|
||||
|
||||
[SerializableField(13)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _effectHue;
|
||||
|
||||
[SerializableField(14)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _renderMode;
|
||||
|
||||
[SerializableField(15)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _speed;
|
||||
|
||||
[SerializableField(16)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _duration;
|
||||
|
||||
[SerializableField(17)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _particleEffect;
|
||||
|
||||
[SerializableField(18)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _explodeParticleEffect;
|
||||
|
||||
[SerializableField(19)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _explodeSound;
|
||||
|
||||
[SerializableField(20)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _unknown;
|
||||
|
||||
[SerializableField(21)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _soundId;
|
||||
|
||||
[SerializableField(22)]
|
||||
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
||||
private int _triggerRange;
|
||||
|
||||
[Constructible]
|
||||
public EffectController() : base(0x1B72)
|
||||
{
|
||||
None,
|
||||
Moving,
|
||||
Location,
|
||||
Target,
|
||||
Lightning
|
||||
Movable = false;
|
||||
Visible = false;
|
||||
TriggerType = EffectTriggerType.Sequenced;
|
||||
EffectLayer = (EffectLayer)255;
|
||||
}
|
||||
|
||||
public enum EffectTriggerType
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Item SourceItem
|
||||
{
|
||||
None,
|
||||
Sequenced,
|
||||
DoubleClick,
|
||||
InRange
|
||||
get => _source as Item;
|
||||
set => _source = value;
|
||||
}
|
||||
|
||||
public class EffectController : Item
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Mobile SourceMobile
|
||||
{
|
||||
private IEntity m_Source;
|
||||
private IEntity m_Target;
|
||||
get => _source as Mobile;
|
||||
set => _source = value;
|
||||
}
|
||||
|
||||
[Constructible]
|
||||
public EffectController() : base(0x1B72)
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool SourceNull
|
||||
{
|
||||
get => _source == null;
|
||||
set
|
||||
{
|
||||
Movable = false;
|
||||
Visible = false;
|
||||
TriggerType = EffectTriggerType.Sequenced;
|
||||
EffectLayer = (EffectLayer)255;
|
||||
}
|
||||
|
||||
public EffectController(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public ECEffectType EffectType { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public EffectTriggerType TriggerType { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public EffectLayer EffectLayer { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TimeSpan EffectDelay { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TimeSpan TriggerDelay { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TimeSpan SoundDelay { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Item SourceItem
|
||||
{
|
||||
get => m_Source as Item;
|
||||
set => m_Source = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Mobile SourceMobile
|
||||
{
|
||||
get => m_Source as Mobile;
|
||||
set => m_Source = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool SourceNull
|
||||
{
|
||||
get => m_Source == null;
|
||||
set
|
||||
if (value)
|
||||
{
|
||||
if (value)
|
||||
_source = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Item TargetItem
|
||||
{
|
||||
get => _target as Item;
|
||||
set => _target = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Mobile TargetMobile
|
||||
{
|
||||
get => _target as Mobile;
|
||||
set => _target = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool TargetNull
|
||||
{
|
||||
get => _target == null;
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
_target = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override string DefaultName => "Effect Controller";
|
||||
|
||||
public override bool HandlesOnMovement => _triggerType == EffectTriggerType.InRange;
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
if (_triggerType == EffectTriggerType.DoubleClick)
|
||||
{
|
||||
DoEffect(from);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnMovement(Mobile m, Point3D oldLocation)
|
||||
{
|
||||
if (m.Location == oldLocation || _triggerType != EffectTriggerType.InRange)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var worldLocation = GetWorldLocation();
|
||||
|
||||
if (Utility.InRange(worldLocation, m.Location, _triggerRange) &&
|
||||
!Utility.InRange(worldLocation, oldLocation, _triggerRange))
|
||||
{
|
||||
DoEffect(m);
|
||||
}
|
||||
}
|
||||
|
||||
public void PlaySound(IEntity trigger)
|
||||
{
|
||||
var ent = PlaySoundAtTrigger ? trigger : this;
|
||||
|
||||
Effects.PlaySound((ent as Item)?.GetWorldLocation() ?? ent.Location, ent.Map, _soundId);
|
||||
}
|
||||
|
||||
public void DoEffect(IEntity trigger)
|
||||
{
|
||||
if (Deleted || TriggerType == EffectTriggerType.None)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (trigger is Mobile { Hidden: true, AccessLevel: > AccessLevel.Player })
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_soundId > 0)
|
||||
{
|
||||
Timer.StartTimer(SoundDelay, () => PlaySound(trigger));
|
||||
}
|
||||
|
||||
if (Sequence != null)
|
||||
{
|
||||
Timer.StartTimer(TriggerDelay, () => Sequence.DoEffect(trigger));
|
||||
}
|
||||
|
||||
if (EffectType != ECEffectType.None)
|
||||
{
|
||||
Timer.StartTimer(EffectDelay, () => InternalDoEffect(trigger));
|
||||
}
|
||||
}
|
||||
|
||||
public void InternalDoEffect(IEntity trigger)
|
||||
{
|
||||
var from = _source ?? trigger;
|
||||
var to = _target ?? trigger;
|
||||
|
||||
switch (EffectType)
|
||||
{
|
||||
case ECEffectType.Lightning:
|
||||
{
|
||||
m_Source = null;
|
||||
Effects.SendBoltEffect(from, false, EffectHue);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Item TargetItem
|
||||
{
|
||||
get => m_Target as Item;
|
||||
set => m_Target = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Mobile TargetMobile
|
||||
{
|
||||
get => m_Target as Mobile;
|
||||
set => m_Target = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool TargetNull
|
||||
{
|
||||
get => m_Target == null;
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
case ECEffectType.Location:
|
||||
{
|
||||
m_Target = null;
|
||||
Effects.SendLocationParticles(
|
||||
EffectItem.Create(from.Location, from.Map, EffectItem.DefaultDuration),
|
||||
_effectItemId,
|
||||
_speed,
|
||||
_duration,
|
||||
_effectHue,
|
||||
_renderMode,
|
||||
_particleEffect,
|
||||
_unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public EffectController Sequence { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
private bool FixedDirection { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
private bool Explodes { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
private bool PlaySoundAtTrigger { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int EffectItemID { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int EffectHue { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int RenderMode { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int Speed { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int Duration { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int ParticleEffect { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int ExplodeParticleEffect { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int ExplodeSound { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int Unknown { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int SoundID { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int TriggerRange { get; set; }
|
||||
|
||||
public override string DefaultName => "Effect Controller";
|
||||
|
||||
public override bool HandlesOnMovement => TriggerType == EffectTriggerType.InRange;
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
if (TriggerType == EffectTriggerType.DoubleClick)
|
||||
{
|
||||
DoEffect(from);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnMovement(Mobile m, Point3D oldLocation)
|
||||
{
|
||||
if (m.Location != oldLocation && TriggerType == EffectTriggerType.InRange &&
|
||||
Utility.InRange(GetWorldLocation(), m.Location, TriggerRange) &&
|
||||
!Utility.InRange(GetWorldLocation(), oldLocation, TriggerRange))
|
||||
{
|
||||
DoEffect(m);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Serialize(IGenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write(0); // version
|
||||
|
||||
writer.Write(EffectDelay);
|
||||
writer.Write(TriggerDelay);
|
||||
writer.Write(SoundDelay);
|
||||
|
||||
if (m_Source is Item srcItem)
|
||||
{
|
||||
writer.Write(srcItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(m_Source as Mobile);
|
||||
}
|
||||
|
||||
if (m_Target is Item targItem)
|
||||
{
|
||||
writer.Write(targItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(m_Target as Mobile);
|
||||
}
|
||||
|
||||
writer.Write(Sequence);
|
||||
|
||||
writer.Write(FixedDirection);
|
||||
writer.Write(Explodes);
|
||||
writer.Write(PlaySoundAtTrigger);
|
||||
|
||||
writer.WriteEncodedInt((int)EffectType);
|
||||
writer.WriteEncodedInt((int)EffectLayer);
|
||||
writer.WriteEncodedInt((int)TriggerType);
|
||||
|
||||
writer.WriteEncodedInt(EffectItemID);
|
||||
writer.WriteEncodedInt(EffectHue);
|
||||
writer.WriteEncodedInt(RenderMode);
|
||||
writer.WriteEncodedInt(Speed);
|
||||
writer.WriteEncodedInt(Duration);
|
||||
writer.WriteEncodedInt(ParticleEffect);
|
||||
writer.WriteEncodedInt(ExplodeParticleEffect);
|
||||
writer.WriteEncodedInt(ExplodeSound);
|
||||
writer.WriteEncodedInt(Unknown);
|
||||
writer.WriteEncodedInt(SoundID);
|
||||
writer.WriteEncodedInt(TriggerRange);
|
||||
}
|
||||
|
||||
public override void Deserialize(IGenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
var version = reader.ReadInt();
|
||||
|
||||
switch (version)
|
||||
{
|
||||
case 0:
|
||||
case ECEffectType.Moving:
|
||||
{
|
||||
if (from == this)
|
||||
{
|
||||
EffectDelay = reader.ReadTimeSpan();
|
||||
TriggerDelay = reader.ReadTimeSpan();
|
||||
SoundDelay = reader.ReadTimeSpan();
|
||||
|
||||
m_Source = reader.ReadEntity<IEntity>();
|
||||
m_Target = reader.ReadEntity<IEntity>();
|
||||
Sequence = reader.ReadEntity<EffectController>();
|
||||
|
||||
FixedDirection = reader.ReadBool();
|
||||
Explodes = reader.ReadBool();
|
||||
PlaySoundAtTrigger = reader.ReadBool();
|
||||
|
||||
EffectType = (ECEffectType)reader.ReadEncodedInt();
|
||||
EffectLayer = (EffectLayer)reader.ReadEncodedInt();
|
||||
TriggerType = (EffectTriggerType)reader.ReadEncodedInt();
|
||||
|
||||
EffectItemID = reader.ReadEncodedInt();
|
||||
EffectHue = reader.ReadEncodedInt();
|
||||
RenderMode = reader.ReadEncodedInt();
|
||||
Speed = reader.ReadEncodedInt();
|
||||
Duration = reader.ReadEncodedInt();
|
||||
ParticleEffect = reader.ReadEncodedInt();
|
||||
ExplodeParticleEffect = reader.ReadEncodedInt();
|
||||
ExplodeSound = reader.ReadEncodedInt();
|
||||
Unknown = reader.ReadEncodedInt();
|
||||
SoundID = reader.ReadEncodedInt();
|
||||
TriggerRange = reader.ReadEncodedInt();
|
||||
|
||||
break;
|
||||
from = EffectItem.Create(from.Location, from.Map, EffectItem.DefaultDuration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void PlaySound(IEntity trigger)
|
||||
{
|
||||
var ent = PlaySoundAtTrigger ? trigger : this;
|
||||
|
||||
Effects.PlaySound((ent as Item)?.GetWorldLocation() ?? ent.Location, ent.Map, SoundID);
|
||||
}
|
||||
|
||||
public void DoEffect(IEntity trigger)
|
||||
{
|
||||
if (Deleted || TriggerType == EffectTriggerType.None)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (trigger is Mobile { Hidden: true } mobile && mobile.AccessLevel > AccessLevel.Player)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (SoundID > 0)
|
||||
{
|
||||
Timer.StartTimer(SoundDelay, () => PlaySound(trigger));
|
||||
}
|
||||
|
||||
if (Sequence != null)
|
||||
{
|
||||
Timer.StartTimer(TriggerDelay, () => Sequence.DoEffect(trigger));
|
||||
}
|
||||
|
||||
if (EffectType != ECEffectType.None)
|
||||
{
|
||||
Timer.StartTimer(EffectDelay, () => InternalDoEffect(trigger));
|
||||
}
|
||||
}
|
||||
|
||||
public void InternalDoEffect(IEntity trigger)
|
||||
{
|
||||
var from = m_Source ?? trigger;
|
||||
var to = m_Target ?? trigger;
|
||||
|
||||
switch (EffectType)
|
||||
{
|
||||
case ECEffectType.Lightning:
|
||||
if (to == this)
|
||||
{
|
||||
Effects.SendBoltEffect(from, false, EffectHue);
|
||||
break;
|
||||
to = EffectItem.Create(to.Location, to.Map, EffectItem.DefaultDuration);
|
||||
}
|
||||
case ECEffectType.Location:
|
||||
{
|
||||
Effects.SendLocationParticles(
|
||||
EffectItem.Create(from.Location, from.Map, EffectItem.DefaultDuration),
|
||||
EffectItemID,
|
||||
Speed,
|
||||
Duration,
|
||||
EffectHue,
|
||||
RenderMode,
|
||||
ParticleEffect,
|
||||
Unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
case ECEffectType.Moving:
|
||||
{
|
||||
if (from == this)
|
||||
{
|
||||
from = EffectItem.Create(from.Location, from.Map, EffectItem.DefaultDuration);
|
||||
}
|
||||
|
||||
if (to == this)
|
||||
{
|
||||
to = EffectItem.Create(to.Location, to.Map, EffectItem.DefaultDuration);
|
||||
}
|
||||
|
||||
Effects.SendMovingParticles(
|
||||
from,
|
||||
to,
|
||||
EffectItemID,
|
||||
Speed,
|
||||
Duration,
|
||||
FixedDirection,
|
||||
Explodes,
|
||||
EffectHue,
|
||||
RenderMode,
|
||||
ParticleEffect,
|
||||
ExplodeParticleEffect,
|
||||
ExplodeSound,
|
||||
EffectLayer,
|
||||
Unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
case ECEffectType.Target:
|
||||
{
|
||||
Effects.SendTargetParticles(
|
||||
from,
|
||||
EffectItemID,
|
||||
Speed,
|
||||
Duration,
|
||||
EffectHue,
|
||||
RenderMode,
|
||||
ParticleEffect,
|
||||
EffectLayer,
|
||||
Unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Effects.SendMovingParticles(
|
||||
from,
|
||||
to,
|
||||
_effectItemId,
|
||||
_speed,
|
||||
_duration,
|
||||
_fixedDirection,
|
||||
_explodes,
|
||||
_effectHue,
|
||||
_renderMode,
|
||||
_particleEffect,
|
||||
_explodeParticleEffect,
|
||||
_explodeSound,
|
||||
_effectLayer,
|
||||
_unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
case ECEffectType.Target:
|
||||
{
|
||||
Effects.SendTargetParticles(
|
||||
from,
|
||||
_effectItemId,
|
||||
_speed,
|
||||
_duration,
|
||||
_effectHue,
|
||||
_renderMode,
|
||||
_particleEffect,
|
||||
_effectLayer,
|
||||
_unknown
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue