Hi, I think I've solved the problem.I changed this part:
foreach (Socket_Base item in obj)
{
Construction.Placement placement = default(Construction.Placement);
if (target.entity != null && target.socket != null && target.entity.IsOccupied(target.socket))
{
continue;
}
if (!placement.isPopulated)
{
placement = item.DoPlacement(target);
}
if (!placement.isPopulated)
{
continue;
}
if (!item.CheckSocketMods(ref placement))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
continue;
}
if (TestPlacingThroughRock(common, ref placement, target))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = ConstructionErrors.ThroughRock.english;
continue;
}
if (!TestPlacingThroughWall(ref placement, transform, common, target))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = "Placing through wall";
continue;
}
if (Vector3.Distance(placement.position, target.player.eyes.position) > common.maxplaceDistance + 1f)
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = ConstructionErrors.TooFarAway.english;
continue;
}
DeployVolume[] volumes = PrefabAttribute.server.FindAll<DeployVolume>(common.prefabID);
/*
if (DeployVolume.Check(placement.position, placement.rotation, volumes))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = "Not enough space";
continue;
}*/
if (DeployVolume.Check(placement.position, placement.rotation, volumes))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
if (DeployVolume.LastDeployHit != null)
{
string blockedByErrorFromCollider = ConstructionErrors.GetBlockedByErrorFromCollider(DeployVolume.LastDeployHit, target.player);
if (!string.IsNullOrEmpty(blockedByErrorFromCollider))
{
lastPlacementError = blockedByErrorFromCollider + DeployVolume.LastDeployHit.name;
continue;
}
}
lastPlacementError = ConstructionErrors.NotEnoughSpace.english;
continue;
}
if (BuildingProximity.Check(target.player, common, placement.position, placement.rotation))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
continue;
}
/*
if (common.isBuildingPrivilege && !target.player.CanPlaceBuildingPrivilege(placement.position, placement.rotation, common.bounds))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = ConstructionErrors.StackPrivilege.english;
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 = "Building privilege";
continue;
}
target.inBuildingPrivilege = flag;
transform.SetPositionAndRotation(placement.position, placement.rotation);
if (common.holdToPlaceDuration > 0f && target.player != null && common.isServer)
{
Planner planner = target.player.GetHeldEntity() as Planner;
if ((object)planner != null && (Vector3.Distance(target.player.transform.position, planner.serverStartDurationPlacementPosition) > 1f || Mathf.Abs((float)planner.serverStartDurationPlacementTime - common.holdToPlaceDuration) > 0.5f))
{
return false;
}
}
target.inBuildingPrivilege = flag;
transform.position = placement.position;
transform.rotation = placement.rotation;
Facepunch.Pool.FreeUnmanaged(ref obj);
return true;
}
Changed with this one:
foreach (Socket_Base item in obj)
{
Construction.Placement placement = default(Construction.Placement);
if (target.entity != null && target.socket != null && target.entity.IsOccupied(target.socket))
{
continue;
}
if (!placement.isPopulated)
{
placement = item.DoPlacement(target);
}
if (!placement.isPopulated)
{
continue;
}
if (!item.CheckSocketMods(ref placement))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
continue;
}
if (TestPlacingThroughRock(common, ref placement, target))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = ConstructionErrors.ThroughRock.english;
continue;
}
if (!TestPlacingThroughWall(ref placement, transform, common, target))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = "Placing through wall";
continue;
}
if (Vector3.Distance(placement.position, target.player.eyes.position) > common.maxplaceDistance + 1f)
{
transform.position = placement.position;
transform.rotation = placement.rotation;
lastPlacementError = ConstructionErrors.TooFarAway.english;
continue;
}
DeployVolume[] volumes = PrefabAttribute.server.FindAll<DeployVolume>(common.prefabID);
if (DeployVolume.Check(placement.position, placement.rotation, volumes))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
if (DeployVolume.LastDeployHit != null)
{
string blockedByErrorFromCollider = ConstructionErrors.GetBlockedByErrorFromCollider(DeployVolume.LastDeployHit, target.player);
if (!string.IsNullOrEmpty(blockedByErrorFromCollider))
{
lastPlacementError = blockedByErrorFromCollider + DeployVolume.LastDeployHit.name;
continue;
}
}
lastPlacementError = ConstructionErrors.NotEnoughSpace.english;
continue;
}
if (BuildingProximity.Check(target.player, common, placement.position, placement.rotation))
{
transform.position = placement.position;
transform.rotation = placement.rotation;
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 = "Building privilege";
continue;
}
// → Sostituzione di target.inBuildingPrivilege con la variabile locale
// target.inBuildingPrivilege = flag; <- rimosso
transform.SetPositionAndRotation(placement.position, placement.rotation);
if (common.holdToPlaceDuration > 0f && target.player != null && common.isServer)
{
Planner planner = target.player.GetHeldEntity() as Planner;
if ((object)planner != null &&
(Vector3.Distance(target.player.transform.position, planner.serverStartDurationPlacementPosition) > 1f ||
Mathf.Abs((float)planner.serverStartDurationPlacementTime - common.holdToPlaceDuration) > 0.5f))
{
return false;
}
}
// target.inBuildingPrivilege = flag; <- rimosso
transform.position = placement.position;
transform.rotation = placement.rotation;
Facepunch.Pool.FreeUnmanaged(ref obj);
return true;
}