/// <summary> /// Used to confirm the position and PlotIndex are valid together when placing Decor /// </summary> private bool IsValidPlotForPosition(ClientHousingDecorUpdate.DecorUpdate update) { if (update.PlotIndex == int.MaxValue) { return(true); } WorldSocketEntry worldSocketEntry = GameTableManager.Instance.WorldSocket.GetEntry(residence.GetPlot((byte)update.PlotIndex).PlotEntry.WorldSocketId); // TODO: Calculate position based on individual maps on Community & Warplot residences Vector3 worldPosition = new Vector3(1472f + update.Position.X, update.Position.Y, 1440f + update.Position.Z); (uint gridX, uint gridZ) = MapGrid.GetGridCoord(worldPosition); (uint localCellX, uint localCellZ) = MapCell.GetCellCoord(worldPosition); (uint globalCellX, uint globalCellZ) = (gridX * MapDefines.GridCellCount + localCellX, gridZ *MapDefines.GridCellCount + localCellZ); // TODO: Investigate need for offset. // Offset added due to calculation being +/- 1 sometimes when placing very close to plots. They were valid placements in the client, though. uint maxBound = worldSocketEntry.BoundIds.Max() + 1; uint minBound = worldSocketEntry.BoundIds.Min() - 1; log.Debug($"IsValidPlotForPosition - PlotIndex: {update.PlotIndex}, Range: {minBound}-{maxBound}, Coords: {globalCellX}, {globalCellZ}"); return(!(globalCellX >= minBound && globalCellX <= maxBound && globalCellZ >= minBound && globalCellZ <= maxBound)); }