Иконка ресурса

FREE IemGameEmbankment : 0.1.0 0.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
//Requires: IemGameBase
//Requires: IemStateManager
//Requires: IemObjectPlacement
//Requires: IncursionHoldingArea
//Requires: IemUI
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Incursion Embankment", "tolland", "0.1.0")]
    class IemGameEmbankment : RustPlugin
    { 

        #region header

        [PluginReference]
        IemUtils IemUtils;

        [PluginReference]
        IemUI IemUI;

        [PluginReference]
        Plugin Kits;

        [PluginReference]
        IemObjectPlacement IemObjectPlacement;

        [PluginReference]
        IncursionHoldingArea IncursionHoldingArea;

        [PluginReference]
        IemGameBase IemGameBase;

        static IemGameEmbankment me;
        static EMGameManager gm;
        public static IemUtils.IIemGame game;

        #endregion

        #region boiler plate

        void Init()
        {
            me = this;
            IemUtils.LogL("IemGameEmbankment: Init complete");
        }

        void Loaded()
        {
            Unsubscribe(nameof(OnRunPlayerMetabolism));

            gm = new EMGameManager();
            IemGameBase.RegisterGameManager(gm);
            IemUtils.LogL("IemGameEmbankment: Loaded complete");
            IemUtils.LogL(" ");
        }

        void Unload()
        {
            IemUtils.DDLog("IemGameEmbankment: in unload");
            IemUtils.LogL("IemGameEmbankment: unloaded started");
            IemGameBase.UnregisterGameManager(gm);
            IemUtils.LogL("IemGameEmbankment: unloaded complete");
        }


        void OnServerInitialized()
        {
            // IemUtils.LogL("IemGameEmbankment: OnServerInitialized started");
            // IemUtils.LogL("IemGameEmbankment: OnServerInitialized complete");
        }

        void LoadDefaultConfig()
        {
            Config.Clear();
            Config["Enabled"] = false;
            Config.Save();
        }

        void OnGameEnded(IemGameBase.IemGame endedGame)
        {
            IemUtils.GLog("Hook called to indicate game ended");
        }

        #endregion

        #region IemGameEmbankmentGame

         
        public class EMGameManager : IemGameBase.GameManager
        {
            public EMGameManager() : base()
            {

                Enabled = true;
                Mode = "Team";
                Name = "Embankment";
                TileImgUrl = "http://www.limepepper.co.uk/images/high_walls_08.jpg";
            }


            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 class IemEmbankmentPlayer : IemGameBase.IemPlayer
        {
            public IemEmbankmentPlayer(BasePlayer player, IemGameEmbankmentGame game) : base(player)
            {
                IemUtils.TeleportPlayerPosition(player, game.teamLobby.location);
                me.IemUtils?.SaveInventory(player, game.GetGuid());
                game.teamLobby.OpenDoors();
            }
        }   

        public class IemGameEmbankmentGame : IemGameBase.IemTeamGame
        {
            public EmbankStateManager gsm;
            public float GameLobbyWait = 10;
            public int PartitionWait = 5;
            public int MainPhaseWait = 5;
            public int SuddenDeathPhaseWait = 5;
            public IncursionHoldingArea.TeamSelectLobby teamLobby;

            public IemGameEmbankmentGame()
            {
                Name = "Embankment";
                OnlyOneAtATime = true;
                Mode = "Team";
                MinPlayersPerTeam = 0;

                //adds some teams to the game, sets the team locations
                InitGame();

                //create the team select lobby
                teamLobby = new IncursionHoldingArea.TeamSelectLobby("teamlobby_v1", this);
            }

            //TODO utility function, this needs to be moved to default config
            void InitGame()
            {
                IemGameBase.IemTeam team1 = AddTeam(
                    new IemGameBase.IemTeam("team_1", "blue", 1, 20, "Blue Bandits"));

                team1.Location = new Vector3(27, 34, 36);

                IemGameBase.IemTeam team2 = AddTeam(
                    new IemGameBase.IemTeam("team_2", "red", 1, 20, "Red Devils"));
                team2.Location = new Vector3(21, 41, -14);
            }

            public override IemUtils.IIemTeamPlayer AddPlayer(BasePlayer player)
            {
                if (!Players.ContainsKey(player.UserIDString))
                    Players[player.UserIDString] = new IemEmbankmentPlayer(player, this);
                IemUI.ShowTeamUiForPlayer(player, this);
                IemUtils.TeleportPlayerPosition(player, teamLobby.location);

                return (IemUtils.IIemTeamPlayer)Players[player.UserIDString];
            }

            public override bool StartGame()
            {
                IemUtils.GLog("calling StartGame in IemGameEmbankmentGame");
                if (gsm == null)
                {
                    base.StartGame();
                    gsm = new EmbankStateManager(EmbankStateManager.Created.Instance, this);
                    gsm.ChangeState(EmbankStateManager.GameLobby.Instance);
                }
                return true;
            } 

            public override bool CleanUp()
            {
                base.CleanUp();

                IemUtils.DDLog("cleaning up the game");
                teamLobby?.Destroy();

                foreach (var partition in gsm.partitions)
                    partition?.Remove();

                return true;
            }

            public override bool CancelGame()
            {
                gsm?.ChangeState(EmbankStateManager.GameCancelled.Instance);
                base.CancelGame();
                return true;
            }

            public bool MovePlayerToTeamLocation(BasePlayer player, Vector3 location)
            {

                IemUtils.GLog("moving players to game");

                if (!IemUtils.CheckPointNearToLocation(
                    player.transform.position, location, 2))
                    IemUtils.TeleportPlayerPosition(player, location);

                return true;
            }

            public override IemUtils.IIemTeam Winner()
            {
                IemUtils.IIemTeam team = null;
                int bestscore = 0;
                foreach (var iemTeam in Teams.Values)
                {
                    if (iemTeam.Score > bestscore)
                    {
                        bestscore = iemTeam.Score;
                        team = iemTeam;
                    }
                    IemUtils.GLog("best score is " + bestscore);
                }
                return team;
            }

            public int GetCountOfLivingPlayers(IemGameBase.IemTeam iemTeam)
            {
                int count = 0;
                foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values)
                {
                    BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId);
                    if (iemPlayer.PlayerState == IemUtils.PlayerState.Alive)
                        count++;
                }
                return count;
            }

            public bool CheckGameState()
            {
                bool someoneWon = false;
                foreach (IemGameBase.IemTeam iemTeam in Teams.Values)
                {
                    if (iemTeam.State != IemUtils.TeamState.Empty)
                    {
                        int count = 0;
                        foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values)
                        {
                            BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId);
                            if (iemPlayer.PlayerState == IemUtils.PlayerState.Alive)
                                count++;
                        }
                        if (count == 0)
                        {
                            iemTeam.State = IemUtils.TeamState.Lost;
                        }
                    }
                }
                int teamsNotLost = 0;
                IemGameBase.IemTeam winTeam = null;
                foreach (IemGameBase.IemTeam iemTeam in Teams.Values)
                {
                    if (iemTeam.State != IemUtils.TeamState.Empty &&
                        iemTeam.State != IemUtils.TeamState.Lost)
                    {
                        teamsNotLost++;
                        winTeam = iemTeam;
                    }
                }
                if (teamsNotLost == 1)
                {
                    someoneWon = true;
                    winTeam.State = IemUtils.TeamState.Won;
                }
                if (someoneWon)
                {
                    gsm.ChangeState(EmbankStateManager.GameComplete.Instance);
                }
                return someoneWon;
            }

            public void ShowGameStatus()
            {
                string status = "";
                foreach (IemGameBase.IemTeam iemTeam in Teams.Values)
                {
                    status += iemTeam.Name + " (" + GetCountOfLivingPlayers(iemTeam) + ") ";
                }
                IemUI.UpdateGameStatusBanner(status, this);
            } 

            public void ShowGameTimer(int countdown)
            {
                string status = "";

                foreach (IemGameBase.IemTeam iemTeam in Teams.Values)
                {
                    foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values)
                    {
                        BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId);
                        IemUI.CreateGameTimer(player, countdown);
                    }
                }
            }

            public void PlayerDied(BasePlayer victim, HitInfo info)
            {
                IemUtils.GLog("player died in one life phase");


                if (victim.ToPlayer() != null)
                {
                    IemUtils.GLog("player died - setting player dead");
                    BasePlayer player = victim.ToPlayer();

                    GetIemPlayerById(victim.UserIDString).PlayerState =
                        IemUtils.PlayerState.Dead;

                }
            }

            public void ScorePlayerKill(BasePlayer victim, HitInfo hitInfo)
            {
                IemUtils.GLog("player died in game phase, calculate new score");

                if (victim.ToPlayer() != null)
                {
                    IemUtils.GLog("player died - hook called");
                    BasePlayer player = victim.ToPlayer();

                    if (hitInfo?.Initiator != null &&
                        hitInfo?.Initiator?.ToPlayer() != null &&
                        victim.ToPlayer() != null)
                    {
                        IemUtils.GLog("found player hit, found player scoring kill");
                        //       PlayerDying(player, info);
                        IemUtils.IIemTeamPlayer iemTeamPlayer = GetIemPlayerById(victim.UserIDString);
                        if (iemTeamPlayer != null)
                        {
                            IemUtils.GLog("incrementing score");
                            GetIemPlayerById(hitInfo?.Initiator?.ToPlayer().UserIDString).Score += 1;
                            GetIemPlayerById(hitInfo?.Initiator?.ToPlayer().UserIDString).Team.Score += 1;
                        }
                    }
                }
            }

            public bool SuddenDeathWounded(BaseCombatEntity entity, HitInfo hitInfo)
            {
                return false;
            }


            public void SuddenDeath(BaseCombatEntity entity, HitInfo hitInfo)
            {
                if (entity as BasePlayer == null || hitInfo == null) return;
                
                if (entity.ToPlayer() != null)
                {
                    IemUtils.DLog("player died");
                    BasePlayer player = entity.ToPlayer();
                    
                    if (GetIemPlayerById(player.UserIDString) != null)
                    {

                        IemUtils.GLog("scaling damage");
                        hitInfo.damageTypes.Scale(DamageType.Bullet, 1000f);
                        hitInfo.damageTypes.Scale(DamageType.Arrow, 1000f);
                        hitInfo.damageTypes.Scale(DamageType.Blunt, 1000f);
                        hitInfo.damageTypes.Scale(DamageType.Explosion, 1000f);
                        hitInfo.damageTypes.Scale(DamageType.Stab, 1000f);
                        //hitInfo.damageTypes.Scale(DamageType., 1000f);
                    }
                    else
                    {
                        IemUtils.GLog("not found player");
                    }
                }
            }   

            public void PlayerImmortal(BaseCombatEntity entity, HitInfo hitInfo)
            {
                IemUtils.GLog("calling immortality check");
                if (entity as BasePlayer == null || hitInfo == null)
                {
                    IemUtils.GLog("was null");
                    return;
                }

                if (entity.ToPlayer() != null)
                {
                    IemUtils.GLog("scaling player damage to zero");
                    BasePlayer player = entity.ToPlayer();
                    
                    if (GetIemPlayerById(player.UserIDString) != null)
                    {
                        // TODO probably better way to scale this damage
                        //hitInfo.damageTypes.Scale(DamageType.Bullet, 0f);
                        IemUtils.NullifyDamage(ref hitInfo);
                    }
                }
            }
        }

        #endregion

        #region EmbankStateManager

        public class EmbankStateManager : IemStateManager.StateManager
        {

            public List<IemObjectPlacement.CopyPastePlacement> partitions
                    = new List<IemObjectPlacement.CopyPastePlacement>();
            int wallheight = 7;
            int startheight = -30;
            int blockshigh = 15;

            private IemGameEmbankmentGame eg;

            public EmbankStateManager(IemStateManager.IStateMachine initialState,
                IemGameEmbankmentGame newEg)
                : base(initialState)
            {

                IemUtils.GLog("eg is " + newEg);
                eg = newEg;
            }

            private Timer walltimer;

            public class Created : IemStateManager.StateBase<Created>,
                IemStateManager.IStateMachine
            {
            }

            /// <summary>
            /// transitioning to this state is where players are moved to the field
            /// game has not yet started.A pre game message can be shown
            /// inventories can be reset
            /// however something must be done to prevent players attacking and building etc
            /// </summary>
            public class GameLobby : IemStateManager.StateBase<GameLobby>,
                IemStateManager.IStateMachine
            {
                private Timer gameLobbyWaitTimer;
                private Timer gameLobbyBannerTimer;


                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 Exit(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    gameLobbyWaitTimer.Destroy();
                    gameLobbyBannerTimer.Destroy();

                    EntitiesTakingDamage -= gsm.eg.PlayerImmortal;

                }
            }

            public class PartitionedPeriod : IemStateManager.StateBase<PartitionedPeriod>,
                IemStateManager.IStateMachine
            {

                private Timer partitionTimer;
                private Timer updatesTimer;
                private int countdown;

                //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 Exit(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    partitionTimer?.Destroy();
                    updatesTimer?.Destroy();

                    // remove hook on damage for immortality
                    EntitiesTakingDamage -= gsm.eg.PlayerImmortal;
                }

                public new void Execute(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;
                    gsm.eg.ShowGameStatus();

                }
            }

            public class MainPhase : IemStateManager.StateBase<MainPhase>,
                IemStateManager.IStateMachine
            {

                private Timer gameTimer;
                private Timer updatesTimer;
                private int countdown;

                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 Exit(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    updatesTimer?.Destroy();
                    gameTimer?.Destroy();

                    // don't set the player status
                    PlayerDying -= gsm.eg.PlayerDied;
                    // don't log the score
                    PlayerDying -= gsm.eg.ScorePlayerKill;
                    

                }

                public new void Execute(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    gsm.eg.CheckGameState();
                    gsm.eg.ShowGameStatus();
                }
            }


            public class SuddenDeath : IemStateManager.StateBase<SuddenDeath>,
                IemStateManager.IStateMachine
            {
                private int countdown;

                //TODO this only works because its a team game
                private Timer suddenDeathTimer;
                private Timer updatesTimer;

                //private DateTime startTime = DateTime.UtcNow;
                //TimeSpan breakDuration = TimeSpan.FromSeconds(15);

                public new void Enter(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;
                    
                    // change the player status
                    PlayerDying += gsm.eg.PlayerDied;
                    //log the score
                    PlayerDying += gsm.eg.ScorePlayerKill;

                    // any damage is fatal
                    EntitiesTakingDamage += gsm.eg.SuddenDeath;
                    // player can't be wounded in sudden death
                    EntitiesBeingWounded += gsm.eg.SuddenDeathWounded;

                    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.PartitionWait, "Sudden Death: ");
                        }
                    }


                    suddenDeathTimer = me.timer.Once(
                        gsm.eg.SuddenDeathPhaseWait, () =>
                        {
                            gsm.ChangeState(EmbankStateManager.GameComplete.Instance);
                        });
                    //}

                    IemUI.UpdateGameBanner("Sudden Death - all hits are fatal!!!", gsm.eg);


                    countdown = gsm.eg.SuddenDeathPhaseWait;
                    updatesTimer = me.timer.Every(1f, () =>
                    {
                        gsm.Update();

                    });
                }

                public new void Exit(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;
                    IemUI.UpdateGameStatusBanner("", gsm.eg);
                    IemUI.UpdateGameBanner("", gsm.eg);

                    // set the player status
                    PlayerDying -= gsm.eg.PlayerDied;
                    // log the score
                    PlayerDying -= gsm.eg.ScorePlayerKill;

                    // any damage is fatal
                    EntitiesTakingDamage -= gsm.eg.SuddenDeath;
                    // player can't be wounded in sudden death
                    EntitiesBeingWounded -= gsm.eg.SuddenDeathWounded;
                    
                    suddenDeathTimer?.Destroy();
                    updatesTimer?.Destroy();
                }

                public new void Execute(IemStateManager.StateManager sm)
                {

                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    gsm.eg.CheckGameState();
                    gsm.eg.ShowGameStatus();
                }

            }

            /// <summary>
            /// GameComplete is effectively a post game lobby for the players
            /// </summary>
            public class GameComplete : IemStateManager.StateBase<GameComplete>,
                IemStateManager.IStateMachine
            {
                private Timer completeTimer;
                private Timer resultsTimer;

                public new void Enter(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    resultsTimer = IemUI.ShowResultsUiFor(
                        gsm.eg.Players.Select(d => d.Value).ToList(), gsm.eg, 8);

                    gsm.eg.EndGame();

                    completeTimer = me.timer.Once(10f, () =>
                    {
                        gsm.ChangeState(EmbankStateManager.CleanUp.Instance);
                    });
                }

                public new void Exit(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    IemUI.UpdateGameStatusBanner("", gsm.eg);
                    completeTimer?.Destroy();
                }

            }

            public class GameCancelled : IemStateManager.StateBase<GameCancelled>,
                IemStateManager.IStateMachine
            {

                public new void Enter(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;
                    
                    foreach (var partition in gsm.partitions)
                        partition?.Remove();

                    me.Unsubscribe(nameof(OnRunPlayerMetabolism));
                }
            }

            /// <summary>
            /// CleanUp is where the field is reset, should be the exit point of
            /// the GSM
            /// </summary>
            public class CleanUp : IemStateManager.StateBase<CleanUp>,
                IemStateManager.IStateMachine
            {
                private Timer completeTimer;

                public new void Enter(IemStateManager.StateManager sm)
                {
                    EmbankStateManager gsm = (EmbankStateManager)sm;

                    gsm.eg.teamLobby.Destroy();

                    foreach (IemGameBase.IemTeam iemTeam in gsm.eg.Teams.Values)
                    {
                        foreach (IemGameBase.IemPlayer iemPlayer in iemTeam.Players.Values)
                        {
                            BasePlayer player = IemUtils.FindPlayerByID(iemPlayer.PlayerId);
                            me.IemUtils?.RestoreInventory(player, gsm.eg.GetGuid());
                        }
                    }

                    foreach (var partition in gsm.partitions)
                        partition?.Remove();

                    me.Unsubscribe(nameof(OnRunPlayerMetabolism));
                }
            }
        }

        #endregion

        #region Oxide Hooks for game

        void OnRunPlayerMetabolism(PlayerMetabolism m, BaseCombatEntity entity)
        {
            var player = entity.ToPlayer();
            if (player == null)
                return;
            IemUtils.SetMetabolismNoNutrition(player);
        }

        static bool NullFunc(BasePlayer entity, HitInfo hitInfo)
        {
            return true;
        }

        public delegate bool EntitiesCanBeWounded(BasePlayer player, HitInfo hitInfo);
        private static EntitiesCanBeWounded EntitiesBeingWounded = NullFunc;

        private bool CanBeWounded(BasePlayer player, HitInfo hitInfo)
        {

            //if (player == null || hitInfo == null) return true;

            return EntitiesBeingWounded(player, hitInfo);
        }

        public delegate void PlayerDeath(BasePlayer player, HitInfo hitInfo);

        private static PlayerDeath PlayerDying = OnEntityDeathXXX; // delegate { };

        // TODO how to shorthand a null delegate with a specific number of parameters
        static void OnEntityDeathXXX(BaseCombatEntity victim, HitInfo info)
        {
            IemUtils.GLog("player diedgjruioghui!!!");
        }

        void OnEntityDeath(BaseCombatEntity victim, HitInfo info)
        {
            if (victim == null)
                return;

            if (victim.ToPlayer() != null)
            {
                IemUtils.GLog("player died - calling hooks");
                BasePlayer player = victim.ToPlayer();

                PlayerDying(player, info);

            }
        }

        public delegate void EntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo);

        private static EntityTakeDamage EntitiesTakingDamage = delegate { };

        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
        {
            if (entity as BasePlayer == null || hitInfo == null) return;
            //IemUtils.GLog("player took damage - calling hooks");
            EntitiesTakingDamage(entity, hitInfo);
        }

        #endregion


        string ListGames()
        {
            string buff = "listing games in embank\n";
            foreach (var mygame in gm.games)
            {
                buff += "Game: " + mygame.Name;

            }
            return buff;
        }

        #region console

        [ConsoleCommand("embank")]
        void ccmdEvent222(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg))
                return;
            switch (arg.Args[0].ToLower())
            {
                case "next":
                    NextPhase();
                    break;
                case "list_games":

                    SendReply(arg, me.ListGames());
                    break;
            }
        }

        // debuggin function to allow moving to next phase quickly
        void NextPhase()
        {
            if (game != null)
            {
                if (game.CurrentState == IemUtils.State.Running)
                {
                    IemGameEmbankmentGame teamgame = (IemGameEmbankmentGame)game;
                    if (teamgame.gsm.IsAny(EmbankStateManager.PartitionedPeriod.Instance))
                    {
                        teamgame.gsm.ChangeState(EmbankStateManager.MainPhase.Instance);
                    }
                    else if (teamgame.gsm.IsAny(EmbankStateManager.MainPhase.Instance))
                    {
                        teamgame.gsm.ChangeState(EmbankStateManager.SuddenDeath.Instance);
                    }
                    else if (teamgame.gsm.IsAny(EmbankStateManager.SuddenDeath.Instance))
                    {
                        teamgame.gsm.ChangeState(EmbankStateManager.GameComplete.Instance);
                    }
                }
            }
        }

        #endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху