Exemple #1
0
    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);
    }
Exemple #3
0
    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);
    }
Exemple #4
0
    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);
    }
Exemple #5
0
    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);
    }