internal static Landblock GetNewEphemeralLandblock(uint landcell, Player owner, List <ACE.Entity.Models.Realm> realmTemplates) { EphemeralRealm ephemeralRealm; lock (realmsLock) ephemeralRealm = EphemeralRealm.Initialize(owner, realmTemplates); var iid = LandblockManager.GetFreeInstanceID(true, ephemeralRealm.RulesetTemplate.Realm.Id, (ushort)(landcell >> 16)); var longcell = ((ulong)iid << 32) | landcell; var landblock = LandblockManager.GetLandblock(longcell, false, false, ephemeralRealm); log.Info($"GetNewEphemeralLandblock created for player {owner.Name}, realm ruleset {ephemeralRealm.RulesetTemplate.Realm.Id}, longcell {longcell}."); return(landblock); }
/// <summary> /// Returns a reference to a landblock, loading the landblock if not already active /// </summary> public static Landblock GetLandblock(ulong objCellID, bool loadAdjacents, bool permaload = false, EphemeralRealm ephemeralRealm = null) { Landblock landblock; lock (landblockMutex) { bool setAdjacents = false; landblocks.TryGetValue(objCellID | 0xFFFF, out landblock); if (landblock == null) { // load up this landblock landblock = new Landblock(objCellID | 0xFFFF); landblocks.Add(objCellID | 0xFFFF, landblock); if (!loadedLandblocks.Add(landblock)) { log.Error($"LandblockManager: failed to add {objCellID:X8} to active landblocks!"); return(landblock); } landblockGroupPendingAdditions.Add(landblock); landblock.Init(false, ephemeralRealm); setAdjacents = true; } if (permaload) { landblock.Permaload = true; } // load adjacents, if applicable if (loadAdjacents) { var adjacents = GetAdjacentIDs(landblock); foreach (var adjacent in adjacents) { GetLandblock(adjacent, false, permaload, ephemeralRealm); } setAdjacents = true; } // cache adjacencies if (setAdjacents) { SetAdjacents(landblock, true, true); } } return(landblock); }