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); } }
public void SendInitialFlagUpdate(ServerPlayer player) { int maxFlagsPerUpdate = 10; MsgFlagUpdate msg = new MsgFlagUpdate(); bool sentOne = false; foreach (FlagInstance flag in GetActiveFlags()) { if (msg.FlagUpdates.Count == maxFlagsPerUpdate) { sentOne = true; player.SendMessage(msg); msg = new MsgFlagUpdate(); } msg.FlagUpdates.Add(flag); } if (!sentOne || msg.FlagUpdates.Count > 0) { player.SendMessage(msg); } }
private void HandleFlagUpdate(NetworkMessage msg) { MsgFlagUpdate update = msg as MsgFlagUpdate; foreach (var u in update.FlagUpdates) { SetFlagUpdateData(u); } }
private static void HandleFlagUpdate(NetworkMessage msg) { MsgFlagUpdate update = msg as MsgFlagUpdate; WriteLine("Flag update"); foreach (var u in update.FlagUpdates) { WriteLine(String.Format("\tID:{0} ({1}) {2}", u.FlagID, u.Abreviation, u.Status)); } }
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); }
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); }
public void Update(Data.Time.Clock gameTime) { MsgFlagUpdate update = new MsgFlagUpdate(); foreach (var flag in GetActiveFlags()) { if (flag.Status == FlagStatuses.FlagNoExist) { RemoveFlag(flag); } if (flag.Owner != null) { // check shot limts? } else { switch (flag.Status) { case FlagStatuses.FlagGoing: if (flag.DropStarted + flag.FlightEnd <= gameTime.Now) { flag.Status = FlagStatuses.FlagNoExist; RemoveFlag(flag); FlagGone?.Invoke(this, flag); } else { flag.FlightTime += GameTime.DeltaF; if (flag.FlightTime < 0.5f * flag.FlightEnd) // rising { flag.Position.Z = flag.FlightTime * (flag.InitalVelocity + 0.5f * Cache.Gravity * flag.FlightTime) + flag.LandingPostion.Z; } else // hovering { flag.Position.Z = 0.5f * flag.FlightEnd * (flag.InitalVelocity + 0.25f * Cache.Gravity * flag.FlightEnd) + flag.LandingPostion.Z; } } break; case FlagStatuses.FlagComing: if (flag.DropStarted + flag.FlightEnd <= gameTime.Now) { GroundFlag(flag, update); } else { flag.FlightTime += GameTime.DeltaF; if (flag.FlightTime >= 0.5f * flag.FlightEnd) // falling { flag.Position.Z = flag.FlightTime * (flag.InitalVelocity + 0.5f * Cache.Gravity * flag.FlightEnd) + flag.LandingPostion.Z; } else // hovering { flag.Position.Z = 0.5f * flag.FlightEnd * (flag.InitalVelocity + 0.25f * Cache.Gravity * flag.FlightEnd) + flag.LandingPostion.Z; } } break; case FlagStatuses.FlagInAir: if (flag.DropStarted + flag.FlightEnd <= gameTime.Now) { GroundFlag(flag, update); } else { flag.FlightTime += GameTime.DeltaF; if (flag.FlightTime < flag.FlightEnd) { // still flying float t = flag.FlightTime / flag.FlightTime; float alt = flag.FlightTime * (flag.InitalVelocity + 0.5f * Cache.Gravity * flag.FlightTime); flag.Position = Interpolatation.LinInterp3DEX(flag.LaunchPosition, flag.LandingPostion, alt, t); } } break; case FlagStatuses.FlagOnGround: break; } } } if (update.FlagUpdates.Count > 0) { Players.SendToAll(update, false); } }