### Summary Modifying a ValueLinkList using one of the methods will bump the "version". This field is used by iterators (foreach loops) to determine if the link list was modified while iterating. The sector.Items (and in the future other lists), will no longer be safe to modify while iterating. The server will _CRASH_ if the ValueLinkList is modified. Thanks to @stefanomerotta for help! ### Screenshots <img width="588" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/83ee0b6e-ff4f-4768-9e29-84456e04b1ec">
127 lines
3.4 KiB
C#
127 lines
3.4 KiB
C#
/*************************************************************************
|
|
* ModernUO *
|
|
* Copyright 2019-2023 - ModernUO Development Team *
|
|
* Email: hi@modernuo.com *
|
|
* File: IEntity.cs *
|
|
* *
|
|
* This program is free software: you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation, either version 3 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
|
*************************************************************************/
|
|
|
|
using System;
|
|
|
|
namespace Server;
|
|
|
|
public interface IEntity : IPoint3D, ISerializable
|
|
{
|
|
Point3D Location { get; }
|
|
Map Map { get; }
|
|
void MoveToWorld(Point3D location, Map map);
|
|
|
|
void ProcessDelta();
|
|
|
|
bool InRange(Point2D p, int range);
|
|
|
|
bool InRange(Point3D p, int range);
|
|
|
|
void RemoveItem(Item item);
|
|
|
|
bool OnMoveOff(Mobile m);
|
|
|
|
bool OnMoveOver(Mobile m);
|
|
|
|
public void OnMovement(Mobile m, Point3D oldLocation);
|
|
}
|
|
|
|
public class Entity : IEntity
|
|
{
|
|
public Entity(Serial serial, Point3D loc, Map map) : this(serial)
|
|
{
|
|
Location = loc;
|
|
Map = map;
|
|
Deleted = false;
|
|
}
|
|
|
|
public Entity(Serial serial) => Serial = serial;
|
|
|
|
public DateTime Created { get; set; } = Core.Now;
|
|
|
|
public long SavePosition { get; set; } = -1;
|
|
|
|
public BufferWriter SaveBuffer { get; set; }
|
|
|
|
public int TypeRef => -1;
|
|
|
|
public Serial Serial { get; }
|
|
|
|
public Point3D Location { get; private set; }
|
|
|
|
public int X => Location.X;
|
|
|
|
public int Y => Location.Y;
|
|
|
|
public int Z => Location.Z;
|
|
|
|
public Map Map { get; private set; }
|
|
|
|
public void MoveToWorld(Point3D newLocation, Map map)
|
|
{
|
|
Location = newLocation;
|
|
Map = map;
|
|
}
|
|
|
|
public bool Deleted { get; }
|
|
|
|
public void Delete()
|
|
{
|
|
}
|
|
|
|
public void ProcessDelta()
|
|
{
|
|
}
|
|
|
|
public void RemoveItem(Item item)
|
|
{
|
|
}
|
|
|
|
public bool OnMoveOff(Mobile m) => true;
|
|
|
|
public bool OnMoveOver(Mobile m) => true;
|
|
|
|
public void OnMovement(Mobile m, Point3D oldLocation)
|
|
{
|
|
}
|
|
|
|
public bool InRange(Point2D p, int range) =>
|
|
p.m_X >= Location.m_X - range
|
|
&& p.m_X <= Location.m_X + range
|
|
&& p.m_Y >= Location.m_Y - range
|
|
&& p.m_Y <= Location.m_Y + range;
|
|
|
|
public bool InRange(Point3D p, int range) =>
|
|
p.m_X >= Location.m_X - range
|
|
&& p.m_X <= Location.m_X + range
|
|
&& p.m_Y >= Location.m_Y - range
|
|
&& p.m_Y <= Location.m_Y + range;
|
|
|
|
public bool InRange(IPoint2D p, int range) =>
|
|
p.X >= Location.m_X - range
|
|
&& p.X <= Location.m_X + range
|
|
&& p.Y >= Location.m_Y - range
|
|
&& p.Y <= Location.m_Y + range;
|
|
|
|
public void Deserialize(IGenericReader reader)
|
|
{
|
|
// Should not actually be saved
|
|
Timer.StartTimer(Delete);
|
|
}
|
|
|
|
public void Serialize(IGenericWriter writer)
|
|
{
|
|
}
|
|
}
|