Tracking character movement

This commit is contained in:
Zeeshaun
2026-01-28 11:55:25 -06:00
parent d1fade919c
commit ee0cf0659d
17 changed files with 273 additions and 70 deletions
@@ -34,13 +34,13 @@ public class LocationStore
{
"$jsonSchema", new BsonDocument
{
{ "bsonType", "object" },
{ "required", new BsonArray { "name", "coord", "createdUtc" } },
{
"properties", new BsonDocument
{
{ "name", new BsonDocument { { "bsonType", "string" } } },
{
{ "bsonType", "object" },
{ "required", new BsonArray { "name", "coord", "createdUtc" } },
{
"properties", new BsonDocument
{
{ "name", new BsonDocument { { "bsonType", "string" } } },
{
"coord", new BsonDocument
{
{ "bsonType", "object" },
@@ -51,14 +51,21 @@ public class LocationStore
{ "x", new BsonDocument { { "bsonType", "int" } } },
{ "y", new BsonDocument { { "bsonType", "int" } } }
}
}
}
},
{ "createdUtc", new BsonDocument { { "bsonType", "date" } } }
}
}
}
}
}
}
},
{
"characterIds", new BsonDocument
{
{ "bsonType", "array" },
{ "items", new BsonDocument { { "bsonType", "string" } } }
}
},
{ "createdUtc", new BsonDocument { { "bsonType", "date" } } }
}
}
}
}
};
var collections = db.ListCollectionNames().ToList();
@@ -95,13 +102,31 @@ public class LocationStore
return result.DeletedCount > 0;
}
public async Task<bool> UpdateNameAsync(string id, string name)
{
var filter = Builders<Location>.Filter.Eq(l => l.Id, id);
var update = Builders<Location>.Update.Set(l => l.Name, name);
var result = await _col.UpdateOneAsync(filter, update);
return result.ModifiedCount > 0;
}
public async Task<bool> UpdateNameAsync(string id, string name)
{
var filter = Builders<Location>.Filter.Eq(l => l.Id, id);
var update = Builders<Location>.Update.Set(l => l.Name, name);
var result = await _col.UpdateOneAsync(filter, update);
return result.ModifiedCount > 0;
}
public async Task<bool> UpdatePresenceAsync(string characterId, Coord coord)
{
if (string.IsNullOrWhiteSpace(characterId))
return false;
var pullFilter = Builders<Location>.Filter.AnyEq(l => l.CharacterIds, characterId);
var pullUpdate = Builders<Location>.Update.Pull(l => l.CharacterIds, characterId);
await _col.UpdateManyAsync(pullFilter, pullUpdate);
var targetFilter = Builders<Location>.Filter.And(
Builders<Location>.Filter.Eq(l => l.Coord.X, coord.X),
Builders<Location>.Filter.Eq(l => l.Coord.Y, coord.Y)
);
var addUpdate = Builders<Location>.Update.AddToSet(l => l.CharacterIds, characterId);
var result = await _col.UpdateOneAsync(targetFilter, addUpdate);
return result.MatchedCount > 0;
}
private void EnsureOriginLocation()
{
@@ -113,12 +138,13 @@ public class LocationStore
if (existing is not null)
return;
var origin = new Location
{
Name = "Origin",
Coord = new Coord { X = 0, Y = 0 },
CreatedUtc = DateTime.UtcNow
};
var origin = new Location
{
Name = "Origin",
Coord = new Coord { X = 0, Y = 0 },
CharacterIds = new List<string>(),
CreatedUtc = DateTime.UtcNow
};
try
{