Exemplo n.º 1
0
        internal void HandleFlagGrab(ServerPlayer player, MsgGrabFlag message)
        {
            if (message == null || !player.CanDoPlayActions())
            {
                return;
            }

            int flagID = message.FlagData.FlagID;

            FlagInstance candidateFlag = FindFlagByID(flagID);

            if (candidateFlag == null || !candidateFlag.Grabable())
            {
                return;
            }

            float dist = Vector3F.Distance(player.Info.LastSentUpdate.Position, candidateFlag.Position);

            if (false && dist > GetFlagGrabDistance(player))
            {
                return;
            }

            Logger.Log4("Player " + player.Callsign + " wants to grab flag " + candidateFlag.FlagID.ToString() + " " + candidateFlag.ToString());

            GrantFlag(player, candidateFlag);
        }
Exemplo n.º 2
0
        private void HandleDropFlag(NetworkMessage msg)
        {
            MsgDropFlag df = msg as MsgDropFlag;

            var          owner = PlayerList.GetPlayerByID(df.PlayerID);
            FlagInstance flag  = FindFlagByID(df.FlagID);

            if (owner != null)
            {
                owner.SetFlag(null);
            }

            if (flag != null)
            {
                flag.Owner  = null;
                flag.Status = FlagStatuses.FlagInAir;
                if (owner != null)
                {
                    flag.CurrentPosition = owner.Position;
                }

                if (FlagDropped != null)
                {
                    FlagDropped.Invoke(this, flag);
                }
            }
        }
Exemplo n.º 3
0
        public void GroundFlag(FlagInstance flag, MsgFlagUpdate update = null)
        {
            bool send = update == null;

            if (send)
            {
                update = new MsgFlagUpdate();
            }

            flag.Status         = FlagStatuses.FlagOnGround;
            flag.Position       = flag.LandingPostion;
            flag.LaunchPosition = flag.LandingPostion;
            flag.InitalVelocity = 0;

            if (update.FlagUpdates.Count > 10)
            {
                Players.SendToAll(update, false);
                update = new MsgFlagUpdate();
            }
            update.FlagUpdates.Add(flag);

            flag.DropStarted = double.MinValue;

            if (send)
            {
                Players.SendToAll(update, false);
            }
        }
Exemplo n.º 4
0
        protected FlagInstance SetupNewFlag(FlagType flag, Vector3F location, bool spawnInAir)
        {
            FlagInstance inst = new FlagInstance();

            inst.Flag     = flag;
            inst.Position = location;
            inst.Owner    = null;
            inst.OwnerID  = -1;

            if (spawnInAir)
            {
                inst.Status = FlagStatuses.FlagComing;
                ComputeFlagAdd?.Invoke(null, inst);
            }
            else
            {
                inst.Status = FlagStatuses.FlagOnGround;
            }

            inst.FlagID = GetNewFlagID();
            if (inst.FlagID < 0)
            {
                return(null);
            }

            lock (ActiveFlags)
            {
                ActiveFlags.Add(inst.FlagID, inst);
                WorldFlags.Add(inst.FlagID, inst);
            }

            Logger.Log3("Setup new flag " + inst.FlagID.ToString() + " of type " + flag.FlagAbbv);

            return(inst);
        }
Exemplo n.º 5
0
        protected FlagInstance CreateFlag(FlagUpdateData data)
        {
            FlagInstance inst = new FlagInstance();

            inst.ID   = data.FlagID;
            inst.Flag = FlagTypeList.GetFromAbriv(data.Abreviation);

            WorldFlags.Add(inst);
            return(inst);
        }
Exemplo n.º 6
0
        public bool SetFlag(FlagInstance flag)
        {
            if (flag == CurrentFlag)
            {
                return(false);
            }

            CurrentFlag = flag;
            return(true);
        }
Exemplo n.º 7
0
        private void HandleGrabFlag(NetworkMessage msg)
        {
            MsgGrabFlag gf = msg as MsgGrabFlag;

            var          owner = PlayerList.GetPlayerByID(gf.PlayerID);
            FlagInstance flag  = SetFlagUpdateData(gf.FlagData);

            if (FlagGrabbed != null)
            {
                FlagGrabbed.Invoke(this, flag);
            }
        }
Exemplo n.º 8
0
        public bool GrantFlag(ServerPlayer player, FlagInstance flag)
        {
            if (flag.Owner != null || player.Info.CariedFlag != null)
            {
                return(false);
            }

            OnGrantFlag?.Invoke(player, flag);

            FlagEventArgs args = new FlagEventArgs();

            args.Player = player;
            args.Flag   = flag;

            FlagPreGrab?.Invoke(this, args);

            if (flag.Status == FlagStatuses.FlagNoExist)
            {
                return(false);
            }

            lock (ActiveFlags)
            {
                if (!args.Allow || flag.Owner != null)
                {
                    return(false);
                }

                lock (WorldFlags)
                    WorldFlags.Remove(flag.FlagID);

                lock (CarriedFlags)
                    CarriedFlags.Add(flag.FlagID, flag);

                flag.Owner   = player;
                flag.Status  = FlagStatuses.FlagOnTank;
                flag.OwnerID = player.PlayerID;
            }

            FlagGrabbed?.Invoke(this, flag);

            player.Info.CariedFlag = flag;

            MsgGrabFlag grabMessage = new MsgGrabFlag();

            grabMessage.PlayerID = player.PlayerID;
            grabMessage.FlagData = flag;

            Logger.Log2("Player " + player.Callsign + " granted flag " + flag.FlagID.ToString() + " " + flag.ToString());

            Players.SendToAll(grabMessage, false);
            return(true);
        }
Exemplo n.º 9
0
        protected FlagInstance GetFlag(FlagUpdateData data)
        {
            FlagInstance inst = FindFlagByID(data.FlagID);

            if (inst != null)
            {
                return(inst);
            }

            inst      = new FlagInstance();
            inst.ID   = data.FlagID;
            inst.Flag = FlagTypeList.GetFromAbriv(data.Abreviation);

            WorldFlags.Add(inst);
            return(inst);
        }
Exemplo n.º 10
0
        public void StandardDrop(ServerPlayer player, FlagInstance flag)
        {
            flag.LaunchPosition = flag.Position + new Vector3F(0, 0, Cache.TankHeight);

            float thrownAltitude = Cache.FlagAltitude;

            if (flag.Flag == FlagTypeList.Shield)
            {
                thrownAltitude *= Cache.ShieldFlight;
            }

            // TODO, compute the intersection point
            flag.FlightTime = 0;

            if (player == null)
            {
                flag.FlightEnd = 2.0f * (float)Math.Sqrt(-2.0f * Cache.FlagAltitude / Cache.Gravity);

                flag.InitalVelocity = -0.5f * Cache.Gravity * flag.FlightEnd;
                flag.Status         = FlagStatuses.FlagComing;
                flag.LandingPostion = new Vector3F(flag.Position.X, flag.Position.Y, 0);
            }
            else if (flag.Endurance == FlagEndurances.FlagUnstable)
            {
                flag.FlightEnd = 2.0f * (float)Math.Sqrt(-2.0f * Cache.FlagAltitude / Cache.Gravity);

                flag.InitalVelocity = -0.5f * Cache.Gravity * flag.FlightEnd;
                flag.Status         = FlagStatuses.FlagGoing;

                flag.LandingPostion = new Vector3F(flag.Position.X, flag.Position.Y, flag.Position.Z + thrownAltitude);
            }
            else
            {
                float maxAltitude = flag.Position.Z + thrownAltitude;

                float upTime   = (float)Math.Sqrt(-2.0f * thrownAltitude / Cache.Gravity);
                float downTime = (float)Math.Sqrt(-2.0f * (maxAltitude - flag.Position.Z) / Cache.Gravity);
                flag.FlightEnd      = upTime + downTime;
                flag.InitalVelocity = -Cache.Gravity * upTime;

                flag.Status         = FlagStatuses.FlagInAir;
                flag.LandingPostion = new Vector3F(flag.Position.X, flag.Position.Y, 0);
            }

            flag.DropStarted = GameTime.Now;
        }
Exemplo n.º 11
0
        public FlagInstance AddFlag(FlagType flag, Vector3F location, bool spawnInAir)
        {
            FlagInstance inst = SetupNewFlag(flag, location, spawnInAir);

            if (inst != null)
            {
                FlagAdded?.Invoke(this, inst);
            }

            MsgFlagUpdate upd = new MsgFlagUpdate();

            upd.FlagUpdates.Add(inst);
            Players.SendToAll(upd, false);

            Logger.Log2("Added new flag " + inst.FlagID.ToString() + " of type " + flag.FlagAbbv);

            return(inst);
        }
Exemplo n.º 12
0
        protected FlagInstance SetFlagUpdateData(FlagUpdateData u)
        {
            bool created = false;

            FlagInstance flag = FindFlagByID(u.FlagID);

            if (flag == null)
            {
                created = true;
                flag    = CreateFlag(u);
            }

            flag.Status    = u.Status;
            flag.Endurance = u.Endurance;

            var owner = PlayerList.GetPlayerByID(u.Owner);

            flag.Owner = owner;
            if (owner != null)
            {
                owner.SetFlag(flag);
            }

            flag.CurrentPosition = u.Postion;

            flag.LastUpdatePostion = u.Postion;
            flag.LaunchPosition    = u.LaunchPosition;
            flag.LandingPostion    = u.LandingPostion;

            flag.FlightTime      = u.FlightTime;
            flag.FlightEnd       = u.FlightEnd;
            flag.InitialVelocity = u.InitalVelocity;

            if (created && FlagCreated != null)
            {
                FlagCreated.Invoke(this, flag);
            }
            else if (!created && FlagUpdated != null)
            {
                FlagUpdated.Invoke(this, flag);
            }

            return(flag);
        }
Exemplo n.º 13
0
        public void DropFlag(ServerPlayer player)
        {
            if (player == null || player.Info.CariedFlag == null)
            {
                return;
            }

            if (player.Info.CariedFlag.Flag == FlagTypeList.Identify)
            {
                player.SendMessage(new MsgNearFlag());  // send them an empty ID message to clear out the display
            }
            FlagInstance flag = player.Info.CariedFlag;

            ComputeFlagDrop?.Invoke(player, flag);

            MsgDropFlag drop = new MsgDropFlag();

            drop.FlagID   = flag.FlagID;
            drop.PlayerID = player.PlayerID;
            drop.Data     = flag;

            player.Info.CariedFlag = null;
            flag.Owner             = null;

            Players.SendToAll(drop, false);

            lock (CarriedFlags)
            {
                if (CarriedFlags.ContainsKey(flag.FlagID))
                {
                    CarriedFlags.Remove(flag.FlagID);
                }
            }

            lock (WorldFlags)
                WorldFlags.Add(flag.FlagID, flag);

            FlagDropped?.Invoke(this, flag);
        }
Exemplo n.º 14
0
        public void RemoveFlag(FlagInstance flag)
        {
            DropFlag(flag.Owner);

            flag.Status = FlagStatuses.FlagNoExist;
            lock (ActiveFlags)
            {
                ActiveFlags.Remove(flag.FlagID);
                lock (WorldFlags)
                {
                    if (WorldFlags.ContainsKey(flag.FlagID))
                    {
                        WorldFlags.Remove(flag.FlagID);
                    }
                }

                lock (CarriedFlags)
                {
                    if (WorldFlags.ContainsKey(flag.FlagID))
                    {
                        WorldFlags.Remove(flag.FlagID);
                    }
                }
            }

            MsgFlagUpdate upd = new MsgFlagUpdate();

            upd.FlagUpdates.Add(flag);
            Players.SendToAll(upd, false);

            lock (EmptyFlagIDs)
                EmptyFlagIDs.Add(flag.FlagID);

            FlagRemoved?.Invoke(this, flag);

            Logger.Log2("Removed flag " + flag.FlagID.ToString() + " of type " + flag.Flag.FlagAbbv);
        }
Exemplo n.º 15
0
        public FlagInstance GetNearestFlag(Vector3F postion)
        {
            var flags = GetGroundFlags();

            if (flags.Length == 0)
            {
                return(null);
            }

            FlagInstance nearest = null;
            float        dist    = float.MaxValue;

            foreach (var f in flags)
            {
                float d = Vector3F.DistanceSquared(postion, f.Position);
                if (d < dist)
                {
                    dist    = d;
                    nearest = f;
                }
            }

            return(nearest);
        }