FSO.SimAntics.VMContext.GetAvatarPlace C# (CSharp) Method

GetAvatarPlace() public method

public GetAvatarPlace ( FSO.SimAntics.VMEntity target, FSO.LotView.Model.LotTilePos pos, Direction dir ) : VMPlacementResult
target FSO.SimAntics.VMEntity
pos FSO.LotView.Model.LotTilePos
dir Direction
return VMPlacementResult
        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);
        }

Usage Example

Ejemplo n.º 1
0
        public VMPlacementResult PositionValid(LotTilePos pos,Direction direction,VMContext context)
        {
            if (pos == LotTilePos.OUT_OF_WORLD)
            {
                return(new VMPlacementResult());
            }
            else if (context.IsOutOfBounds(pos))
            {
                return new VMPlacementResult {
                           Status = VMPlacementError.LocationOutOfBounds
                }
            }
            ;

            //TODO: speedup with exit early checks
            //TODO: corner checks (wtf uses this)

            var arch = context.Architecture;
            var wall = arch.GetWall(pos.TileX,pos.TileY,pos.Level); //todo: preprocess to check which walls are real solid walls and not fences.

            if (this is VMGameObject)                               //needs special handling for avatar eventually
            {
                VMPlacementError wallValid = WallChangeValid(wall,direction,true);

                if (wallValid != VMPlacementError.Success)
                {
                    return new VMPlacementResult {
                               Status = wallValid
                    }
                }
                ;
            }

            var floor = arch.GetFloor(pos.TileX,pos.TileY,pos.Level);
            VMPlacementError floorValid = FloorChangeValid(floor,pos.Level);

            if (floorValid != VMPlacementError.Success)
            {
                return new VMPlacementResult {
                           Status = floorValid
                }
            }
            ;

            //we've passed the wall test, now check if we intersect any objects.
            var valid = (this is VMAvatar)? context.GetAvatarPlace(this,pos,direction) : context.GetObjPlace(this,pos,direction);

            return(valid);
        }
All Usage Examples Of FSO.SimAntics.VMContext::GetAvatarPlace