Esempio n. 1
0
        public RvRStructure(RvRObjectInfo info, Point3D loc, ushort rot, Player constructor)
        {
            // _logger.Debug($"RVRStructure constructor {info.ModelId} {info.Name} {loc.ToString()} {rot} {constructor.Name}");

            WorldPosition.X = loc.X;
            WorldPosition.Y = loc.Y;
            WorldPosition.Z = loc.Z - 36;

            Heading = rot;

            _unitDirVec = Vector2.HeadingToVector(Heading, 1);
            _unitDirVec.Normalize();

            _info        = info;
            _constructor = constructor;
        }
Esempio n. 2
0
        public static void CreateNew(Player plr, int entry)
        {
            Point3D destPos;
            ushort  destHeading;

            RvRStructure curStruct = plr.CbtInterface.GetCurrentTarget() as RvRStructure;

            RvRObjectInfo info = BattleFrontService.GetRvRObjectInfo(entry);

            // _logger.Debug($"RVRStructure BattleFrontService.GetRvRObjectInfo Entry={entry} info={info.Name} {info.ModelId} {info.ObjectId}");

            if (curStruct != null)
            {
                ushort shiftHeading = (ushort)((curStruct.Heading + 1024) & 0xFFF);
                destPos     = new Point3D(curStruct.WorldPosition);
                destHeading = curStruct.Heading;

                Point2D offsetPoint = GetOffsetFromHeading(shiftHeading, (ushort)(info.ExclusionRadius + curStruct._info.ExclusionRadius + 1));

                Vector2 offsetVector = new Vector2(offsetPoint.X, offsetPoint.Y);
                offsetVector.Normalize();

                Vector2 toPlayer = new Vector2(plr.WorldPosition.X - curStruct.WorldPosition.X, plr.WorldPosition.Y - curStruct.WorldPosition.Y);
                toPlayer.Normalize();

                float dotP = Vector2.DotProduct2D(offsetVector, toPlayer);

                if (dotP >= 0)
                {
                    destPos.X += offsetPoint.X;
                    destPos.Y += offsetPoint.Y;
                }

                else
                {
                    destPos.X -= offsetPoint.X;
                    destPos.Y -= offsetPoint.Y;
                }
            }

            else
            {
                Point2D offset = GetOffsetFromHeading(plr.Heading, 10);
                destHeading = plr.Heading;
                destPos     = new Point3D(plr.WorldPosition.X + offset.X, plr.WorldPosition.Y + offset.Y, plr.WorldPosition.Z);
            }

            foreach (Object obj in plr.ObjectsInRange)
            {
                RvRStructure structure = obj as RvRStructure;

                if (structure == null)
                {
                    continue;
                }

                if (structure.WorldPosition.GetDistanceTo(destPos) < info.ExclusionRadius + structure._info.ExclusionRadius)
                {
                    plr.SendClientMessage("Too close to existing structure", ChatLogFilters.CHATLOGFILTERS_C_ABILITY_ERROR);
                    plr.SendClientMessage("Too close to an existing structure (one exists within " + structure.WorldPosition.GetDistanceTo(destPos) + "ft and " + (info.ExclusionRadius + structure._info.ExclusionRadius) + "ft clearance is required)", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return;
                }
            }

            RvRStructure newStruct = new RvRStructure(info, destPos, destHeading, plr);

            plr.Region.AddObject(newStruct, plr.Zone.ZoneId, true);

            // _logger.Debug($"RVRStructure CreateNew Entry={entry} {curStruct.Name} {curStruct.Oid} Zone={plr.Zone.ZoneId}");
        }