1using System.Globalization;
30 public Dictionary<Point2, SpawnChunk>
m_chunks = [];
32 public Dictionary<ComponentSpawn, bool>
m_spawns = [];
46 public Dictionary<ComponentSpawn, bool>.KeyCollection
Spawns =>
m_spawns.Keys;
57 public virtual void Update(
float dt) {
82 foreach (KeyValuePair<string, object> item
in valuesDictionary.GetValue<
ValuesDictionary>(
"Chunks")) {
86 IsSpawned = valuesDictionary2.GetValue<
bool>(
"IsSpawned"),
87 LastVisitedTime = valuesDictionary2.GetValue<
double>(
"LastVisitedTime")
89 object obj = valuesDictionary2.GetValue(
"SpawnsData",
new object());
90 if (obj is
string str) {
94#pragma warning disable CS0612
96#pragma warning restore CS0612
104 valuesDictionary.SetValue(
"Chunks", valuesDictionary2);
109 valuesDictionary3.SetValue(
"IsSpawned", value2.
IsSpawned);
110 valuesDictionary3.SetValue(
"LastVisitedTime", value2.
LastVisitedTime.Value);
115 if (!
string.IsNullOrEmpty(text)) {
116 valuesDictionary3.SetValue(
"SpawnsData", text);
136 if (spawnChunk ==
null) {
137 spawnChunk =
new SpawnChunk { Point = point };
144 List<Point2> list =
new();
148 list.Add(value.
Point);
151 foreach (
Point2 item
in list) {
163 for (
int i = point.
X; i <= point2.
X; i++) {
164 for (
int j = point.
Y; j <= point2.
Y; j++) {
166 if (spawnChunk !=
null) {
182 for (
int i = point.
X; i <= point2.
X; i++) {
183 for (
int j = point.
Y; j <= point2.
Y; j++) {
184 Vector2 v2 =
new((i + 0.5f) * 16f, (j + 0.5f) * 16f);
187 if (chunkAtCell !=
null
189 Point2 point3 =
new(i, j);
191 foreach (
SpawnEntityData spawnsDatum
in orCreateSpawnChunk.SpawnsData) {
194 orCreateSpawnChunk.SpawnsData.Clear();
196 orCreateSpawnChunk.IsSpawned =
true;
213 List<ComponentSpawn> list =
new(0);
222 Vector2 v2 =
new(viewPosition.
X, viewPosition.
Z);
240 EntityId = item.Entity.Id
245 loader.OnSaveSpawnData(item, data);
262 loader.OnReadSpawnData(entity, data);
269 m_random.Float(0f, (
float)Math.PI * 2f)
272 if (componentCreature !=
null) {
278 catch (Exception ex) {
279 Log.
Error($
"Unable to spawn entity with template \"{data.TemplateName}\". Reason: {ex}");
288 select (item, data)) {
289 data.ConstantSpawn = item.GetValue<
bool>(
"c");
290 data.Position = item.GetValue<
Vector3>(
"p");
291 data.TemplateName = item.GetValue<
string>(
"n");
292 object obj = item.GetValue(
"d",
new object());
293 data.Data = obj is
string str ? str :
string.Empty;
294 creaturesData.Add(data);
298 public virtual void LoadSpawnsData(
string data, List<SpawnEntityData> creaturesData) {
299 string[] array = data.Split([
';'], StringSplitOptions.RemoveEmptyEntries);
300 for (
int i = 0; i < array.Length; i++) {
301 string[] array2 = array[i].Split(
new[] {
',' });
302 if (array2.Length < 4) {
303 throw new InvalidOperationException(
"Invalid spawn data string.");
306 TemplateName = array2[0],
308 X =
float.Parse(array2[1], CultureInfo.InvariantCulture),
309 Y =
float.Parse(array2[2], CultureInfo.InvariantCulture),
310 Z =
float.Parse(array2[3], CultureInfo.InvariantCulture)
313 if (array2.Length >= 5) {
314 spawnEntityData.ConstantSpawn =
bool.Parse(array2[4]);
316 spawnEntityData.Data = array2.Length >= 6 ? array2[5] :
string.Empty;
317 if (array2.Length >= 7) {
318 spawnEntityData.EntityId =
int.Parse(array2[6]);
320 creaturesData.Add(spawnEntityData);
333 v2.SetValue(
"d", d.
Data);
334 saveData.SetValue($
"{i++}", v2);
339 StringBuilder stringBuilder =
new();
342 stringBuilder.Append(
',');
343 stringBuilder.Append((MathF.Round(spawnEntityData.
Position.
X * 10f) / 10f).ToString(CultureInfo.InvariantCulture));
344 stringBuilder.Append(
',');
345 stringBuilder.Append((MathF.Round(spawnEntityData.
Position.
Y * 10f) / 10f).ToString(CultureInfo.InvariantCulture));
346 stringBuilder.Append(
',');
347 stringBuilder.Append((MathF.Round(spawnEntityData.
Position.
Z * 10f) / 10f).ToString(CultureInfo.InvariantCulture));
348 stringBuilder.Append(
',');
349 stringBuilder.Append(spawnEntityData.
ConstantSpawn.ToString());
350 stringBuilder.Append(
',');
351 if (spawnEntityData.
Data?.Length > 0) {
352 stringBuilder.Append(spawnEntityData.
Data);
354 stringBuilder.Append(
',');
355 stringBuilder.Append(spawnEntityData.
EntityId.ToString());
356 stringBuilder.Append(
';');
358 return stringBuilder.ToString();
static void Error(object message)
static string ConvertToString(object value)
static object ConvertFromString(Type type, string data)
ComponentBody ComponentBody
ComponentCreature ComponentCreature
ComponentFrame ComponentFrame
static ValuesDictionary FindEntityValuesDictionary(string entityTemplateName, bool throwIfNotFound)
List< SpawnEntityData > SpawnsData
Dictionary< int, SpawnEntityData > m_spawnEntityDatas
virtual void Update(float dt)
virtual void DespawnChunks()
virtual SpawnChunk GetSpawnChunk(Point2 point)
virtual void DiscardOldChunks()
virtual void SaveSpawnsData(ValuesDictionary saveData, List< SpawnEntityData > spawnsData)
virtual void UpdateLastVisitedTime()
virtual Entity SpawnEntity(SpawnEntityData data)
SubsystemGameInfo m_subsystemGameInfo
virtual void SpawnChunks()
virtual void LoadSpawnsData(ValuesDictionary loadData, List< SpawnEntityData > creaturesData)
SubsystemTerrain m_subsystemTerrain
override void OnEntityRemoved(Entity entity)
Dictionary< ComponentSpawn, bool > m_spawns
override void Save(ValuesDictionary valuesDictionary)
virtual SpawnChunk GetOrCreateSpawnChunk(Point2 point)
Dictionary< ComponentSpawn, bool >.KeyCollection Spawns
SubsystemGameWidgets m_subsystemViews
double m_nextDiscardOldChunksTime
virtual Action< SpawnChunk > SpawningChunk
SubsystemPlayers m_subsystemPlayers
override void Load(ValuesDictionary valuesDictionary)
SubsystemTime m_subsystemTime
Dictionary< Point2, SpawnChunk > m_chunks
override void OnEntityAdded(Entity entity)
virtual void LoadSpawnsData(string data, List< SpawnEntityData > creaturesData)
virtual string SaveSpawnsData(List< SpawnEntityData > spawnsData)
double m_nextChunkSpawnTime
static Point2 ToChunk(Vector2 p)
static int ToCell(float x)
ValuesDictionary ValuesDictionary
Component FindComponent(Type type, string name, bool throwOnError)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
IEnumerable< object > Values
DatabaseObject DatabaseObject
static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
static float DistanceSquared(Vector2 v1, Vector2 v2)
static readonly Vector3 UnitY