public bool UpdatePlacement( Transform transform, Construction common, ref Construction.Target target) { if (!target.valid) { return(false); } if (!common.canBypassBuildingPermission && !target.player.CanBuild()) { Construction.lastPlacementError = "Player doesn't have permission"; return(false); } List <Socket_Base> list = (List <Socket_Base>)Pool.GetList <Socket_Base>(); common.FindMaleSockets(target, list); foreach (Socket_Base socketBase in list) { Construction.Placement placement = (Construction.Placement)null; if (!Object.op_Inequality((Object)target.entity, (Object)null) || !((PrefabAttribute)target.socket != (PrefabAttribute)null) || !target.entity.IsOccupied(target.socket)) { if (placement == null) { placement = socketBase.DoPlacement(target); } if (placement != null) { if (!socketBase.CheckSocketMods(placement)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); } else if (!this.TestPlacingThroughRock(ref placement, target)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Placing through rock"; } else if (!Construction.TestPlacingThroughWall(ref placement, transform, common, target)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Placing through wall"; } else if ((double)Vector3.Distance(placement.position, target.player.eyes.position) > (double)common.maxplaceDistance + 1.0) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Too far away"; } else { DeployVolume[] all = PrefabAttribute.server.FindAll <DeployVolume>(this.prefabID); if (DeployVolume.Check(placement.position, placement.rotation, all, -1)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Not enough space"; } else if (BuildingProximity.Check(target.player, this, placement.position, placement.rotation)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); } else if (common.isBuildingPrivilege && !target.player.CanPlaceBuildingPrivilege(placement.position, placement.rotation, common.bounds)) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Cannot stack building privileges"; } else { bool flag = target.player.IsBuildingBlocked(placement.position, placement.rotation, common.bounds); if (!common.canBypassBuildingPermission && flag) { transform.set_position(placement.position); transform.set_rotation(placement.rotation); Construction.lastPlacementError = "Building privilege"; } else { target.inBuildingPrivilege = flag; transform.set_position(placement.position); transform.set_rotation(placement.rotation); // ISSUE: cast to a reference type Pool.FreeList <Socket_Base>((List <M0>&) ref list); return(true); } } } } } } // ISSUE: cast to a reference type Pool.FreeList <Socket_Base>((List <M0>&) ref list); return(false); }
public static bool Check(BasePlayer player, Construction construction, Vector3 position, Quaternion rotation) { OBB oBB = new OBB(position, rotation, construction.bounds); float single = oBB.extents.magnitude + 2f; List <BuildingBlock> list = Pool.GetList <BuildingBlock>(); Vis.Entities <BuildingBlock>(oBB.position, single, list, 2097152, QueryTriggerInteraction.Collide); uint d = 0; for (int i = 0; i < list.Count; i++) { BuildingBlock item = list[i]; Construction construction1 = construction; Construction construction2 = item.blockDefinition; Vector3 vector3 = position; Vector3 vector31 = item.transform.position; Quaternion quaternion = rotation; Quaternion quaternion1 = item.transform.rotation; BuildingProximity.ProximityInfo proximity = BuildingProximity.GetProximity(construction1, vector3, quaternion, construction2, vector31, quaternion1); BuildingProximity.ProximityInfo proximityInfo = BuildingProximity.GetProximity(construction2, vector31, quaternion1, construction1, vector3, quaternion); BuildingProximity.ProximityInfo proximityInfo1 = new BuildingProximity.ProximityInfo() { hit = (proximity.hit ? true : proximityInfo.hit), connection = (proximity.connection ? true : proximityInfo.connection) }; if (proximity.sqrDist > proximityInfo.sqrDist) { proximityInfo1.line = proximityInfo.line; proximityInfo1.sqrDist = proximityInfo.sqrDist; } else { proximityInfo1.line = proximity.line; proximityInfo1.sqrDist = proximity.sqrDist; } if (proximityInfo1.connection) { BuildingManager.Building building = item.GetBuilding(); if (building != null) { BuildingPrivlidge dominatingBuildingPrivilege = building.GetDominatingBuildingPrivilege(); if (dominatingBuildingPrivilege != null) { if (!construction.canBypassBuildingPermission && !dominatingBuildingPrivilege.IsAuthed(player)) { Construction.lastPlacementError = "Cannot attach to unauthorized building"; Pool.FreeList <BuildingBlock>(ref list); return(true); } if (d == 0) { d = building.ID; } else if (d != building.ID) { Construction.lastPlacementError = "Cannot connect two buildings with cupboards"; Pool.FreeList <BuildingBlock>(ref list); return(true); } } } } if (proximityInfo1.hit) { Vector3 vector32 = proximityInfo1.line.point1 - proximityInfo1.line.point0; if (Mathf.Abs(vector32.y) <= 1.49f && vector32.Magnitude2D() <= 1.49f) { Construction.lastPlacementError = "Not enough space"; Pool.FreeList <BuildingBlock>(ref list); return(true); } } } Pool.FreeList <BuildingBlock>(ref list); return(false); }
public bool UpdatePlacement(Transform transform, Construction common, ref Construction.Target target) { bool flag; if (!target.valid) { return(false); } if (!common.canBypassBuildingPermission && !target.player.CanBuild()) { Construction.lastPlacementError = "Player doesn't have permission"; return(false); } List <Socket_Base> list = Pool.GetList <Socket_Base>(); common.FindMaleSockets(target, list); List <Socket_Base> .Enumerator enumerator = list.GetEnumerator(); try { while (enumerator.MoveNext()) { Socket_Base current = enumerator.Current; Construction.Placement placement = null; if (target.entity != null && target.socket != null && target.entity.IsOccupied(target.socket)) { continue; } if (placement == null) { placement = current.DoPlacement(target); } if (placement == null) { continue; } if (!current.CheckSocketMods(placement)) { transform.position = placement.position; transform.rotation = placement.rotation; } else if (!this.TestPlacingThroughRock(ref placement, target)) { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Placing through rock"; } else if (!Construction.TestPlacingThroughWall(ref placement, transform, common, target)) { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Placing through wall"; } else if (Vector3.Distance(placement.position, target.player.eyes.position) <= common.maxplaceDistance + 1f) { DeployVolume[] deployVolumeArray = PrefabAttribute.server.FindAll <DeployVolume>(this.prefabID); if (DeployVolume.Check(placement.position, placement.rotation, deployVolumeArray, -1)) { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Not enough space"; } else if (BuildingProximity.Check(target.player, this, placement.position, placement.rotation)) { transform.position = placement.position; transform.rotation = placement.rotation; } else if (!common.isBuildingPrivilege || target.player.CanPlaceBuildingPrivilege(placement.position, placement.rotation, common.bounds)) { bool flag1 = target.player.IsBuildingBlocked(placement.position, placement.rotation, common.bounds); if (common.canBypassBuildingPermission || !flag1) { target.inBuildingPrivilege = flag1; transform.position = placement.position; transform.rotation = placement.rotation; Pool.FreeList <Socket_Base>(ref list); flag = true; return(flag); } else { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Building privilege"; } } else { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Cannot stack building privileges"; } } else { transform.position = placement.position; transform.rotation = placement.rotation; Construction.lastPlacementError = "Too far away"; } } Pool.FreeList <Socket_Base>(ref list); return(false); } finally { ((IDisposable)enumerator).Dispose(); } return(flag); }
public bool UpdatePlacement(Transform transform, Construction common, ref Target target) { if (!target.valid) { return(false); } if (!common.canBypassBuildingPermission && !target.player.CanBuild()) { lastPlacementError = "You don't have permission to build here"; return(false); } List <Socket_Base> obj = Pool.GetList <Socket_Base>(); common.FindMaleSockets(target, obj); foreach (Socket_Base item in obj) { Placement placement = null; if (target.entity != null && target.socket != null && target.entity.IsOccupied(target.socket)) { continue; } if (placement == null) { placement = item.DoPlacement(target); } if (placement == null) { continue; } if (!item.CheckSocketMods(placement)) { transform.position = placement.position; transform.rotation = placement.rotation; continue; } if (!TestPlacingThroughRock(ref placement, target)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Placing through rock"; continue; } if (!TestPlacingThroughWall(ref placement, transform, common, target)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Placing through wall"; continue; } if (!TestPlacingCloseToRoad(ref placement, target)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Placing too close to road"; continue; } if (Vector3.Distance(placement.position, target.player.eyes.position) > common.maxplaceDistance + 1f) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Too far away"; continue; } DeployVolume[] volumes = PrefabAttribute.server.FindAll <DeployVolume>(prefabID); if (DeployVolume.Check(placement.position, placement.rotation, volumes)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Not enough space"; continue; } if (BuildingProximity.Check(target.player, this, placement.position, placement.rotation)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Too close to another building"; continue; } if (common.isBuildingPrivilege && !target.player.CanPlaceBuildingPrivilege(placement.position, placement.rotation, common.bounds)) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "Cannot stack building privileges"; continue; } bool flag = target.player.IsBuildingBlocked(placement.position, placement.rotation, common.bounds); if (!common.canBypassBuildingPermission && flag) { transform.position = placement.position; transform.rotation = placement.rotation; lastPlacementError = "You don't have permission to build here"; continue; } target.inBuildingPrivilege = flag; transform.SetPositionAndRotation(placement.position, placement.rotation); Pool.FreeList(ref obj); return(true); } Pool.FreeList(ref obj); return(false); }
public static bool Check( BasePlayer player, Construction construction, Vector3 position, Quaternion rotation) { OBB obb; ((OBB) ref obb).\u002Ector(position, rotation, construction.bounds); float radius = ((Vector3) ref obb.extents).get_magnitude() + 2f; List <BuildingBlock> list = (List <BuildingBlock>)Pool.GetList <BuildingBlock>(); Vis.Entities <BuildingBlock>((Vector3)obb.position, radius, list, 2097152, (QueryTriggerInteraction)2); uint num = 0; for (int index = 0; index < list.Count; ++index) { BuildingBlock buildingBlock = list[index]; Construction construction1 = construction; Construction blockDefinition = buildingBlock.blockDefinition; Vector3 vector3_1 = position; Vector3 position1 = ((Component)buildingBlock).get_transform().get_position(); Quaternion quaternion = rotation; Quaternion rotation1 = ((Component)buildingBlock).get_transform().get_rotation(); BuildingProximity.ProximityInfo proximity1 = BuildingProximity.GetProximity(construction1, vector3_1, quaternion, blockDefinition, position1, rotation1); BuildingProximity.ProximityInfo proximity2 = BuildingProximity.GetProximity(blockDefinition, position1, rotation1, construction1, vector3_1, quaternion); BuildingProximity.ProximityInfo proximityInfo = new BuildingProximity.ProximityInfo(); proximityInfo.hit = proximity1.hit || proximity2.hit; proximityInfo.connection = proximity1.connection || proximity2.connection; if ((double)proximity1.sqrDist <= (double)proximity2.sqrDist) { proximityInfo.line = proximity1.line; proximityInfo.sqrDist = proximity1.sqrDist; } else { proximityInfo.line = proximity2.line; proximityInfo.sqrDist = proximity2.sqrDist; } if (proximityInfo.connection) { BuildingManager.Building building = buildingBlock.GetBuilding(); if (building != null) { BuildingPrivlidge buildingPrivilege = building.GetDominatingBuildingPrivilege(); if (Object.op_Inequality((Object)buildingPrivilege, (Object)null)) { if (!construction.canBypassBuildingPermission && !buildingPrivilege.IsAuthed(player)) { Construction.lastPlacementError = "Cannot attach to unauthorized building"; // ISSUE: cast to a reference type Pool.FreeList <BuildingBlock>((List <M0>&) ref list); return(true); } if (num == 0U) { num = building.ID; } else if ((int)num != (int)building.ID) { Construction.lastPlacementError = "Cannot connect two buildings with cupboards"; // ISSUE: cast to a reference type Pool.FreeList <BuildingBlock>((List <M0>&) ref list); return(true); } } } } if (proximityInfo.hit) { Vector3 vector3_2 = Vector3.op_Subtraction((Vector3)proximityInfo.line.point1, (Vector3)proximityInfo.line.point0); if ((double)Mathf.Abs((float)vector3_2.y) <= 1.49000000953674 && (double)Vector3Ex.Magnitude2D(vector3_2) <= 1.49000000953674) { Construction.lastPlacementError = "Not enough space"; // ISSUE: cast to a reference type Pool.FreeList <BuildingBlock>((List <M0>&) ref list); return(true); } } } // ISSUE: cast to a reference type Pool.FreeList <BuildingBlock>((List <M0>&) ref list); return(false); }