public new void Enter(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; List <ReactiveTarget> targets = IemUtils.FindComponentsNearToLocation <ReactiveTarget>(gsm.location, 50); foreach (var target in targets) { target.SetFlag(BaseEntity.Flags.On, false); } gsm.eg.EndGame(); double totalTime = 0; foreach (TPGameLevel level in gsm.eg.gamelevels) { totalTime += level.LevelTime(); } IemUI.CreateGameBanner(gsm.eg.player, "Game is complete! - your time was " + IemUtils.GetTimeFromSeconds(totalTime) + " seconds"); IemUI.Confirm(gsm.eg.player, "Game completed!\nreturn to the map", "Back", gsm.eg.backToTheMap); }
public new void Exit(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; IemUI.CreateGameBanner(gsm.eg.player, ""); EntitiesTakingDamage -= gsm.eg.PlayerImmortal; CuiHelper.DestroyUi(gsm.eg.player, "ShowIntroOverlay"); }
public static void UpdateGameBanner(string message, IemGameBase.IemGame game) { foreach (IemGameBase.IemPlayer iemPlayer in game.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); IemUI.CreateGameBanner(player, message); } }
public new void Exit(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; CuiHelper.DestroyUi(gsm.eg.player, "CreateFadeoutBanner"); foreach (IemGameBase.IemPlayer iemPlayer in gsm.eg.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); IemUI.CreateGameBanner(player, ""); } }
public override IemGameBase.IemGame CreateGame(BasePlayer player) { var newGame = new IemGameEmbankmentGame(); newGame.Players[player.UserIDString] = new IemEmbankmentPlayer(player, newGame); IemUI.ShowTeamUiForPlayer(player, newGame); if (!newGame.CanStart()) { IemUI.CreateGameBanner(player, newGame.CanStartCriteria()); } return(newGame); }
public new void Enter(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; gsm.partition = new IemObjectPlacement.CopyPastePlacement( "tp_v1_" + gsm.eg.difficultyLevel, gsm.location); ResearchTable researchtable = IemUtils.FindComponentNearestToLocation <ResearchTable>( gsm.location, 50); Vector3 playerstart = researchtable.transform.position; researchtable.Kill(BaseNetworkable.DestroyMode.None); RepairBench repairbench = IemUtils.FindComponentNearestToLocation <RepairBench>( gsm.location, 50); Vector3 playerlook = repairbench.transform.position; repairbench.Kill(BaseNetworkable.DestroyMode.None); me.Puts("player start location is " + playerstart); me.Puts("player look location is " + playerlook); me.Puts("swutcged " + IemUtils.SwitchTypesToTarget <BaseOven>(gsm.location)); gsm.eg.player.inventory.Strip(); EntitiesTakingDamage += gsm.eg.PlayerImmortal; IemUtils.MovePlayerToTeamLocation(gsm.eg.player, playerstart); Vector3 relativePos = playerstart - playerlook; Quaternion rotation = Quaternion.LookRotation(relativePos); gsm.eg.player.transform.rotation = rotation; IemUtils.SetMetabolismValues(gsm.eg.player); IemUtils.ClearInventory(gsm.eg.player); IemUI.CreateGameBanner(gsm.eg.player, "GAME LOBBY"); IemUtils.PlaySound(gsm.eg.player); gsm.eg.returnZone = new IemUtils.ReturnZone(playerstart, gsm.eg.player); IemUI.Confirm(gsm.eg.player, $"Weclome to target practice\n" + $"Knock down the targets to proceed to the next level.\n" + $"each level timer will start when you fire the first shot", "Start Shootin'", gsm.proceedAction); gsm.eg.targets = IemUtils.FindComponentsNearToLocation <ReactiveTarget>(gsm.location, 50); me.Puts("targets count is " + gsm.eg.targets.Count()); }
public new void Exit(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; RunWeaponFired -= gsm.eg.TPWeaponFired; IemUI.CreateGameBanner(gsm.eg.player, ""); TPGameLevel gamelevel = gsm.eg.gamelevels[gsm.eg.level]; EntitiesTakingDamage -= gsm.eg.PlayerImmortal; EntitiesTakingDamage -= gsm.eg.ScorePlayerHit; IemUI.CreateGameBanner2(gsm.eg.player, ""); CuiHelper.DestroyUi(gsm.eg.player, "CreateFadeoutBanner"); IemUtils.GameTimer.Destroy(gsm.eg.player); }
//private DateTime startTime = DateTime.UtcNow; //TimeSpan breakDuration = TimeSpan.FromSeconds(15); public new void Enter(IemStateManager.StateManager sm) { EmbankStateManager gsm = (EmbankStateManager)sm; me.Subscribe(nameof(OnRunPlayerMetabolism)); // nullify any damage EntitiesTakingDamage += gsm.eg.PlayerImmortal; foreach (IemGameBase.IemTeam iemTeam in gsm.eg.Teams.Values) { foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); //player.EndSleeping(); me.Kits?.Call("GiveKit", player, "embank_v1"); player.inventory.SendSnapshot(); IemUtils.PlaySound(player); IemUI.CreateGameBanner(player, "Zone is Partitioned!"); IemUI.ShowGameTimer(player, gsm.eg.PartitionWait, "partion removed in: "); } } updatesTimer = me.timer.Every(1f, () => { gsm.Update(); }); countdown = gsm.eg.PartitionWait; partitionTimer = me.timer.Once( gsm.eg.PartitionWait, () => { gsm.ChangeState(MainPhase.Instance); }); }
public new void Enter(IemStateManager.StateManager sm) { EmbankStateManager gsm = (EmbankStateManager)sm; foreach (var partition in gsm.partitions) { partition?.Remove(); } foreach (IemGameBase.IemTeam iemTeam in gsm.eg.Teams.Values) { foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); IemUI.CreateGameBanner(player, "Main Phase, partition is removed!"); IemUI.ShowGameTimer(player, gsm.eg.PartitionWait, "Main Phase: "); } } // change the player status PlayerDying += gsm.eg.PlayerDied; // log the score PlayerDying += gsm.eg.ScorePlayerKill; gameTimer = me.timer.Once(gsm.eg.MainPhaseWait, () => { gsm.ChangeState(SuddenDeath.Instance); }); countdown = gsm.eg.MainPhaseWait; updatesTimer = me.timer.Every(1f, () => { gsm.Update(); }); }
public new void Enter(IemStateManager.StateManager sm) { EmbankStateManager gsm = (EmbankStateManager)sm; EntitiesTakingDamage += gsm.eg.PlayerImmortal; me.rust.RunServerCommand("env.time", "12"); for (int i = 0; i <= gsm.blockshigh; i++) { gsm.partitions.Add(new IemObjectPlacement.CopyPastePlacement( "base_partition_wall", new Vector3(-500, gsm.startheight + (gsm.wallheight * i), 10))); } // gsm.CreateGameBanner("GAME LOBBY"); gameLobbyWaitTimer = me.timer.Once(gsm.eg.GameLobbyWait, () => { gsm.ChangeState(PartitionedPeriod.Instance); }); // gsm.CreateGameBanner("GAME LOBBY"); gameLobbyBannerTimer = me.timer.Once(gsm.eg.GameLobbyWait - 3, () => { foreach (IemGameBase.IemTeam iemTeam in gsm.eg.Teams.Values) { foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); CuiHelper.DestroyUi(player, "ShowIntroOverlay"); } } }); foreach (IemGameBase.IemTeam iemTeam in gsm.eg.Teams.Values) { foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values) { BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId); IemUI.ShowGameTimer(player, gsm.eg.GameLobbyWait - 3, "starting in: "); if (player.IsConnected()) { if (player.IsDead()) { IemUtils.GLog("player is dead"); player.Respawn(); } } player.EndSleeping(); gsm.eg.MovePlayerToTeamLocation(player, iemTeam.Location); IemUtils.SetMetabolismValues(player); IemUtils.ClearInventory(player); IemUI.CreateGameBanner(player, "GAME LOBBY"); IemUI.ShowIntroOverlay(player, $"The Game is Embankment\n" + $"it is in 3 phases.\n" + $"1) <color=green>The paritioned period</color> ({gsm.eg.PartitionWait}) a time for crafting and building\n" + $"a wall separates the teams. Players are invulnerable\n" + $"Once the first phase is finished, the wall comes down\n" + $"2) <color=blue>The main phase.</color> Players have 1 life. Attack and defend.\n" + $"after {gsm.eg.MainPhaseWait} the games enters....\n" + $"3) <color=red>Sudden Death</color>. All melle, weapon and explosion damage\n" + $"is fatal. This period lasts for {gsm.eg.SuddenDeathPhaseWait}\n" + $"if players remain after sudden death. The Winning team is the one\n" + $"with the most total health points remaining.\n"); IemUtils.PlaySound(player); } } }
public new void Enter(IemStateManager.StateManager sm) { TargetPracticeStateManager gsm = (TargetPracticeStateManager)sm; // this is a fresh game at pregame if (gsm.eg.level == -1) { gsm.eg.level++; } else { // level has already been started, and this is a rerun of the level // reset level vals if (gsm.eg.gamelevels[gsm.eg.level].Started && !gsm.eg.gamelevels[gsm.eg.level].Ended) { gsm.eg.gamelevels[gsm.eg.level].Reset(); } else { // this is a new level gsm.eg.level++; } } // get the properties of this game level TPGameLevel gamelevel = gsm.eg.gamelevels[gsm.eg.level]; EntitiesTakingDamage += gsm.eg.PlayerImmortal; // reset the player score for this level gsm.eg.iemPlayer.Score = 0; IemUI.CreateGameBanner(gsm.eg.player, "Level " + (gsm.eg.level + 1) + " - targets remaining " + (gamelevel.Targets - gsm.eg.iemPlayer.Score)); IemUtils.GameTimer.CreateTimerPaused(gsm.eg.player, gamelevel.Timer, () => { if (!gsm.eg.CheckLevelComplete()) { IemUI.ConfirmCancel(gsm.eg.player, "Level was not completed!\nYou can play this level again, or return to the map", "Play Again", "Quit", gsm.eg.wasConfirmed, gsm.eg.wasCancelled); } }); // log the score EntitiesTakingDamage += gsm.eg.ScorePlayerHit; // refill magazines in weapons on belt container IemUtils.RefillBeltMagazines(gsm.eg.player); foreach (var target in gsm.eg.targets) { if (target != null) { target.ResetTarget(); var health = knockdownHealth.GetValue(target); knockdownHealth.SetValue(target, 100f); } } RunWeaponFired += gsm.eg.TPWeaponFired; IemUtils.PlaySound(gsm.eg.player); }
public void ScorePlayerHit(BaseCombatEntity entity, HitInfo hitinfo) { try { if (entity is ReactiveTarget && hitinfo.Initiator is BasePlayer) { var target = (ReactiveTarget)entity; if (!targets.Contains(target)) { me.Puts("is not game target"); return; } var attacker = (BasePlayer)hitinfo.Initiator; if (attacker.UserIDString != iemPlayer.AsBasePlayer().UserIDString) { me.Puts("is not game player"); return; } if (entity == null || attacker == null) { return; } // TODO resolve problem that the ReactiveTarget is squashing the HitInfo //me.Puts("hitinfo.HitBone " + hitinfo.HitBone); //me.Puts("target_collider_bullseye " + StringPool.Get("target_collider_bullseye")); if (hitinfo.HitBone == StringPool.Get("target_collider_bullseye")) { IemUtils.DrawChatMessage(attacker, target, "Bullseye!!!!"); } // hits on reactive targets tigger OnEntityTakeDamage twice // this selects for the one created by on shared hit in ReactiveTarget if (hitinfo.damageTypes.Total() != 1f) { return; } //this is the amount of damage done to the target by the hit var health = knockdownHealth.GetValue(target); TPGameLevel gamelevel = gamelevels[level]; if (!gamelevel.Started) { me.Puts("starting gamelevel " + (level)); gamelevel.Start(); IemUtils.GameTimer.Start(player); } else { me.Puts("gamelevel " + (level) + " is already started at " + gamelevel.StartTime); } gamelevel.accuracy.ShotsHit += 1; if (target.IsKnockedDown()) { iemPlayer.Score += 1; IemUI.CreateGameBanner(attacker, "Level " + (level + 1) + " - targets remaining " + (gamelevel.Targets - iemPlayer.Score)); if (CheckLevelComplete()) { GoNextLevel(); } else { target.CancelInvoke("ResetTarget"); target.health = target.MaxHealth(); target.SendNetworkUpdate(); } } } } catch (Exception ex) { me.Puts("exception " + ex); } }