public VMPlacementResult GetAvatarPlace(VMEntity target, LotTilePos pos, Direction dir) { //avatars cannot be placed in slots under any circumstances, so we skip a few steps. VMObstacle footprint = target.GetObstacle(pos, dir); ushort room = GetRoomAt(pos); VMPlacementError status = VMPlacementError.Success; VMEntity statusObj = null; if (footprint == null || pos.Level < 1) { return(new VMPlacementResult(status)); } var objs = RoomInfo[room].Entities; foreach (var obj in objs) { if (obj.MultitileGroup == target.MultitileGroup) { continue; } var oFoot = obj.Footprint; if (oFoot != null && oFoot.Intersects(footprint) && (!(target.ExecuteEntryPoint(5, this, true, obj, new short[] { obj.ObjectID, 0, 0, 0 }) || obj.ExecuteEntryPoint(5, this, true, target, new short[] { target.ObjectID, 0, 0, 0 }))) ) { var flags = (VMEntityFlags)obj.GetValue(VMStackObjectVariable.Flags); bool allowAvatars = ((flags & VMEntityFlags.DisallowPersonIntersection) == 0) && ((flags & VMEntityFlags.AllowPersonIntersection) > 0); if (!allowAvatars) { status = VMPlacementError.CantIntersectOtherObjects; statusObj = obj; if (obj.EntryPoints[26].ActionFunction != 0) { break; //select chairs immediately. } } } } return(new VMPlacementResult(status, statusObj)); }
public VMPlacementResult GetObjPlace(VMEntity target, LotTilePos pos, Direction dir) { //ok, this might be confusing... short allowedHeights = target.GetValue(VMStackObjectVariable.AllowedHeightFlags); short weight = target.GetValue(VMStackObjectVariable.Weight); bool noFloor = (allowedHeights & 1) == 0; var flags = (VMEntityFlags)target.GetValue(VMStackObjectVariable.Flags); bool allowAvatars = ((flags & VMEntityFlags.DisallowPersonIntersection) == 0) && ((flags & VMEntityFlags.AllowPersonIntersection) > 0); VMObstacle footprint = target.GetObstacle(pos, dir); ushort room = GetRoomAt(pos); VMPlacementError status = (noFloor)?VMPlacementError.HeightNotAllowed:VMPlacementError.Success; VMEntity statusObj = null; if (footprint == null || pos.Level < 1) { return(new VMPlacementResult { Status = status }); } var objs = RoomInfo[room].Entities; foreach (var obj in objs) { if (obj.MultitileGroup == target.MultitileGroup || (obj is VMAvatar && allowAvatars) || (target.GhostImage && target.GhostOriginal != null && target.GhostOriginal.Objects.Contains(obj))) { continue; } var oFoot = obj.Footprint; if (oFoot != null && oFoot.Intersects(footprint) && (!(target.ExecuteEntryPoint(5, this, true, obj, new short[] { obj.ObjectID, 0, 0, 0 }) || obj.ExecuteEntryPoint(5, this, true, target, new short[] { target.ObjectID, 0, 0, 0 }))) ) { statusObj = obj; status = VMPlacementError.CantIntersectOtherObjects; //this object is technically solid. Check if we can place on top of it if (allowedHeights > 1 && obj.TotalSlots() > 0 && (obj.GetSlot(0) == null || obj.GetSlot(0) == target)) { //first check if we have a slot 0, which is what we place onto. then check if it's empty, //then check if the object can support this one's weight. //we also need to make sure that the height of this specific slot is allowed. if (((1 << (obj.GetSlotHeight(0) - 1)) & allowedHeights) > 0) { if (weight < obj.GetValue(VMStackObjectVariable.SupportStrength)) { return(new VMPlacementResult(VMPlacementError.Success, obj)); } else { status = VMPlacementError.CantSupportWeight; } } else { if (noFloor) { if ((allowedHeights & (1 << 3)) > 0) { status = VMPlacementError.CounterHeight; } else { status = (obj.GetSlotHeight(0) == 8) ? VMPlacementError.CannotPlaceComputerOnEndTable : VMPlacementError.HeightNotAllowed; } } } } } } return(new VMPlacementResult(status, statusObj)); }
public VMPlacementResult GetObjPlace(VMEntity target, LotTilePos pos, Direction dir) { //ok, this might be confusing... short allowedHeights = target.GetValue(VMStackObjectVariable.AllowedHeightFlags); short weight = target.GetValue(VMStackObjectVariable.Weight); bool noFloor = (allowedHeights&1)==0; var flags = (VMEntityFlags)target.GetValue(VMStackObjectVariable.Flags); bool allowAvatars = ((flags & VMEntityFlags.DisallowPersonIntersection) == 0) && ((flags & VMEntityFlags.AllowPersonIntersection) > 0); VMObstacle footprint = target.GetObstacle(pos, dir); ushort room = GetRoomAt(pos); VMPlacementError status = (noFloor)?VMPlacementError.HeightNotAllowed:VMPlacementError.Success; VMEntity statusObj = null; if (footprint == null || pos.Level < 1) { return new VMPlacementResult { Status = status }; } var objs = RoomInfo[room].Entities; foreach (var obj in objs) { if (obj.MultitileGroup == target.MultitileGroup || (obj is VMAvatar && allowAvatars)) continue; var oFoot = obj.Footprint; if (oFoot != null && oFoot.Intersects(footprint) && (!(target.ExecuteEntryPoint(5, this, true, obj, new short[] { obj.ObjectID, 0, 0, 0 }) || obj.ExecuteEntryPoint(5, this, true, target, new short[] { target.ObjectID, 0, 0, 0 }))) ) { statusObj = obj; status = VMPlacementError.CantIntersectOtherObjects; //this object is technically solid. Check if we can place on top of it if (allowedHeights>1 && obj.TotalSlots() > 0 && (obj.GetSlot(0) == null || obj.GetSlot(0) == target)) { //first check if we have a slot 0, which is what we place onto. then check if it's empty, //then check if the object can support this one's weight. //we also need to make sure that the height of this specific slot is allowed. if (((1 << (obj.GetSlotHeight(0) - 1)) & allowedHeights) > 0) { if (weight < obj.GetValue(VMStackObjectVariable.SupportStrength)) { return new VMPlacementResult(VMPlacementError.Success, obj); } else { status = VMPlacementError.CantSupportWeight; } } else { if (noFloor) { if ((allowedHeights & (1 << 3)) > 0) status = VMPlacementError.CounterHeight; else status = (obj.GetSlotHeight(0) == 8) ? VMPlacementError.CannotPlaceComputerOnEndTable : VMPlacementError.HeightNotAllowed; } } } } } return new VMPlacementResult(status, statusObj); }
public VMPlacementResult GetAvatarPlace(VMEntity target, LotTilePos pos, Direction dir) { //avatars cannot be placed in slots under any circumstances, so we skip a few steps. VMObstacle footprint = target.GetObstacle(pos, dir); ushort room = GetRoomAt(pos); VMPlacementError status = VMPlacementError.Success; VMEntity statusObj = null; if (footprint == null || pos.Level < 1) { return new VMPlacementResult(status); } var objs = RoomInfo[room].Entities; foreach (var obj in objs) { if (obj.MultitileGroup == target.MultitileGroup) continue; var oFoot = obj.Footprint; if (oFoot != null && oFoot.Intersects(footprint)) //also ignore allow intersection trees? { var flags = (VMEntityFlags)obj.GetValue(VMStackObjectVariable.Flags); bool allowAvatars = ((flags & VMEntityFlags.DisallowPersonIntersection) == 0) && ((flags & VMEntityFlags.AllowPersonIntersection) > 0); if (!allowAvatars) { status = VMPlacementError.CantIntersectOtherObjects; statusObj = obj; if (obj.EntryPoints[26].ActionFunction != 0) break; //select chairs immediately. } } } return new VMPlacementResult(status, statusObj); }