Files
abysmal-isle/Scripts/Services/PVP Arena System/ArenaStone.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

156 lines
4.7 KiB
C#

using Server;
using System;
using Server.Items;
using Server.Gumps;
using Server.Mobiles;
using System.Collections.Generic;
namespace Server.Engines.ArenaSystem
{
[DeleteConfirm("Are you sure you want to delete this? Deleting this stone will remove this arena from the system.")]
public class ArenaStone : Item
{
public override bool ForceShowProperties { get { return true; } }
public override int LabelNumber { get { return 1115878; } }
[CommandProperty(AccessLevel.GameMaster)]
public PVPArena Arena { get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public bool ShowArenaEffects
{
get { return false; }
set { if (value) DoArenaEffects(); if (!value) HideArenaEffects(); }
}
[Constructable]
public ArenaStone(PVPArena arena)
: base(0xEDD)
{
Arena = arena;
Movable = false;
Hue = 1194;
}
public override void OnDoubleClick(Mobile from)
{
if (from is PlayerMobile && from.InRange(Location, 10))
{
PlayerMobile pm = from as PlayerMobile;
if (pm.Young)
{
from.SendLocalizedMessage(1116002); // Young players and Trial Account users may not participate in duels.
}
else if (Arena != null && PVPArenaSystem.Enabled)
{
if (Arena.CurrentDuel != null && Arena.CurrentDuel.IsParticipant(pm))
{
if (Arena.CurrentDuel.InPreFight)
{
BaseGump.SendGump(new OfferDuelGump(pm, Arena.CurrentDuel, Arena, false, true));
}
else
{
from.SendLocalizedMessage(1116387); // Please wait until the session which you participated is finished completely.
}
}
else
{
var duel = Arena.GetPendingDuel(from);
if (duel == null)
{
var booked = PVPArenaSystem.Instance.GetBookedDuel(pm);
if (booked != null)
{
BaseGump.SendGump(new OfferDuelGump(pm, booked, booked.Arena, true));
}
else
{
BaseGump.SendGump(new ArenaStoneGump(pm, Arena));
}
}
else
{
BaseGump.SendGump(new PendingDuelGump(pm, duel, Arena));
}
}
}
}
else
{
from.SendLocalizedMessage(502138); // That is too far away for you to use.
}
}
private List<Item> _Items;
public void DoArenaEffects()
{
if (Arena == null)
return;
_Items = new List<Item>();
foreach (var rec in Arena.Definition.EffectAreas)
{
for (int x = rec.X; x < rec.X + rec.Width; x++)
{
for (int y = rec.Y; y < rec.Y + rec.Height; y++)
{
var st = new Static(0x3709);
st.MoveToWorld(new Point3D(x, y, Arena.Definition.Map.GetAverageZ(x, y)), Map);
_Items.Add(st);
}
}
}
}
public void HideArenaEffects()
{
if (_Items == null)
return;
_Items.ForEach(s =>
{
s.Delete();
});
ColUtility.Free(_Items);
_Items = null;
}
public override void Delete()
{
base.Delete();
Timer.DelayCall(() =>
{
if (Arena != null && PVPArenaSystem.Instance != null)
{
PVPArenaSystem.Instance.AddBlockedArena(Arena);
}
});
}
public ArenaStone(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}