예제 #1
0
        public override void Receive(Farmer source, List <object> data)
        {
            for (int i = 0; i < Game1.player.items.Count; i++)
            {
                if (Game1.player.items[i] is not StardewValley.Objects.Hat)
                {
                    Game1.player.items[i] = null;
                }
            }

            DelayedAction.functionAfterDelay(() =>
            {
                if (!ModEntry.BRGame.InProgress)
                {
                    return;
                }

                var oldLocation = Game1.player.currentLocation;
                var oldPosition = new xTile.Dimensions.Location(
                    (int)Game1.player.Position.X - Game1.viewport.Width / 2,
                    (int)Game1.player.Position.Y - Game1.viewport.Height / 2
                    );

                SpectatorMode.EnterSpectatorMode(oldLocation, oldPosition);
            }, 1000);
        }
예제 #2
0
    /**
     *
     * FOLLOW MODE
     * Makes the spectator follow a live player
     *
     **/

    private void setFollowCameraMode()
    {
        _spectatorMode = SpectatorMode.FOLLOW;
        _ui.modeSwitch(SpectatorMode.FOLLOW);
        _thirdPersonCamera.enabled = true;
        switchPlayerView(_currentPlayerIdx);
    }
예제 #3
0
 public void modeSwitch(SpectatorMode mode)
 {
     this.mode = mode;
     spectatingNameText.gameObject.SetActive(mode == SpectatorMode.FOLLOW);
     transform.GetChild(1).gameObject.SetActive(mode == SpectatorMode.FOLLOW);
     transform.GetChild(3).gameObject.SetActive(mode == SpectatorMode.FOLLOW);
 }
예제 #4
0
 protected override void Parse(ref BitStreamReader bsr)
 {
     SpecMode = (SpectatorMode)bsr.ReadByte();
     Target1  = bsr.ReadByte();
     Target2  = bsr.ReadByte();
     Unknown  = bsr.ReadByte();
 }
예제 #5
0
        public override bool SetSpectatorID(SpectatorMode mode, int spectatorId)
        {
            if (SpectatorMode == mode && mode != SpectatorMode.Player ||
                SpectatorMode == SpectatorMode.Player && mode == SpectatorMode.Player &&
                (spectatorId == -1 || SpectatorId == spectatorId || ClientId == spectatorId))
            {
                return(false);
            }

            if (Team == Team.Spectators)
            {
                if (mode != SpectatorMode.Player ||
                    mode == SpectatorMode.Player &&
                    GameContext.Players[SpectatorId] != null &&
                    GameContext.Players[SpectatorId].Team != Team.Spectators)
                {
                    if (mode == SpectatorMode.FlagRed || mode == SpectatorMode.FlagBlue)
                    {
                        foreach (var flag in Flag.Entities)
                        {
                            if (flag.Team == Team.Red && mode == SpectatorMode.FlagRed ||
                                flag.Team == Team.Blue && mode == SpectatorMode.FlagBlue)
                            {
                                SpectatorFlag = null;
                                SpectatorId   = flag.Carrier?.Player.ClientId ?? -1;
                                break;
                            }
                        }

                        if (SpectatorFlag == null)
                        {
                            return(false);
                        }

                        SpectatorMode = mode;
                        return(true);
                    }

                    SpectatorFlag = null;
                    SpectatorMode = mode;
                    SpectatorId   = spectatorId;
                    return(true);
                }
            }
            else if (DeadSpectatorMode)
            {
                if (mode == SpectatorMode.Player && DeadCanFollow(GameContext.Players[SpectatorId]))
                {
                    SpectatorMode = mode;
                    SpectatorFlag = null;
                    SpectatorId   = spectatorId;
                    return(true);
                }
            }

            return(false);
        }
예제 #6
0
    /**
     *
     * FREE MOVE MODE
     * Allows the spectator to move freely around the arena
     *
     **/

    private void setFreeCameraMode()
    {
        _spectatorMode = SpectatorMode.FREE;
        _ui.modeSwitch(SpectatorMode.FREE);
        _thirdPersonCamera.enabled = false;

        _freeCameraTarget.SetActive(true);
        _freeCameraTarget.transform.position = transform.position;// _thirdPersonCamera.getTarget().position;
        transform.SetParent(_freeCameraTarget.transform);

        transform.localPosition = Vector3.zero;
    }
    IEnumerator Change(SpectatorMode newMode)
    {
        yield return(new WaitForSeconds(0.5f));

        mode = newMode;
        freeCameraGameobject.SetActive(false);
        cinematicCameraGameobject.SetActive(false);
        camera.GetComponent <Camera>().enabled = true;
        if (_cameraObjects.Count > 1)
        {
            _cameraObjects[1].enabled = false;
        }
        if (_cameraObjects.Count > 2)
        {
            _cameraObjects[2].enabled = false;
        }
        switch (mode)
        {
        case SpectatorMode.Free:
            _dof.dofEnable = false;
            freeCameraGameobject.SetActive(true);
            break;

        case SpectatorMode.Cinematic:
            _dof.dofEnable = true;
            cinematicCameraGameobject.SetActive(true);
            timeline.Stop();
            timeline.time = times[Random.Range(0, times.Count - 1)];
            timeline.Evaluate();
            timeline.Play();
            break;

        case SpectatorMode.View:
            _dof.dofEnable = false;
            if (_cameraObjects.Count != 1)
            {
                camera.GetComponent <Camera>().enabled = false;
                _cameraObjects[_current].enabled       = true;
                _cameraObjects[_current].fieldOfView   = 70;
                if (_current == 1 && _cameraObjects.Count == 3)
                {
                    _current = 2;
                }
                else if (_current == 2)
                {
                    _current = 1;
                }
            }

            break;
        }
    }
예제 #8
0
    private void setSpectatorMode(SpectatorMode mode)
    {
        switch (mode)
        {
        case SpectatorMode.FOLLOW:
            setFollowCameraMode();
            break;

        case SpectatorMode.FREE:
            setFreeCameraMode();
            break;

        default:
            throw new InvalidOperationException("This should not happen!");
        }
    }
예제 #9
0
        public static void TakeDamage(Farmer who, DamageSource source, int damage, long?damagerID = null, string monster = "")
        {
            if (!ModEntry.BRGame.InProgress)
            {
                damage = 0;
            }

            if (who != Game1.player)
            {
                NetworkUtils.SendDamageToPlayer(who, source, damage, damagerID);
                return;
            }

            if (IsDying(Game1.player))
            {
                return;
            }

            Round round = ModEntry.BRGame.GetActiveRound();

            Game1.currentMinigame = null;

            Farmer damager = null;

            if (damagerID != null)
            {
                damager = Game1.getFarmer((long)damagerID);
            }

            if (damager != null && Game1.player != damager && IsOnSameTeamAs(Game1.player, damager))
            {
                return;
            }

            if (source != DamageSource.MONSTER)
            {
                bool oldIsEating = Game1.player.isEating;
                Game1.player.isEating = false; // Prevent invincibility
                Game1.player.takeDamage(source, damage, false, damager);
                Game1.player.isEating = oldIsEating;
            }

            bool wasInvincible = Game1.player.temporarilyInvincible;

            //Hit shake timer / Invincibility frames
            if (source != DamageSource.THORNS && !round.IsSpecialRoundType(SpecialRoundType.SLUGFEST) && !Game1.player.temporarilyInvincible)
            {
                int invincibilityDuration = 1200;
                int multiplier            = Game1.player.GetEffectsOfRingMultiplier(861);
                invincibilityDuration += 1000 * multiplier;

                NetworkMessage.Send(
                    NetworkUtils.MessageTypes.TELL_PLAYER_HIT_SHAKE_TIMER,
                    NetworkMessageDestination.ALL,
                    new List <object>()
                {
                    invincibilityDuration
                }
                    );
            }

            if (Game1.player.health <= 0)
            {
                ResetStatistics();

                Game1.player.CanMove = false;
                NetworkMessage.Send(
                    NetworkUtils.MessageTypes.SEND_DEATH_ANIMATION,
                    NetworkMessageDestination.ALL,
                    new List <object>()
                    );

                DelayedAction.functionAfterDelay(() =>
                {
                    Random random = new();

                    //Spawn their items onto the floor
                    foreach (var item in Game1.player.Items)
                    {
                        if (item != null)
                        {
                            if (item is not Tool || item is MeleeWeapon || item is Slingshot)
                            {
                                Debris debris = new(item, Game1.player.getStandingPosition(), Game1.player.getStandingPosition() + new Vector2(64 * (float)(random.NextDouble() * 2 - 1), 64 * (float)(random.NextDouble() * 2 - 1)));
                                Game1.currentLocation.debris.Add(debris);
                            }
                        }
                    }

                    var oldLocation = Game1.player.currentLocation;
                    var oldPosition = new xTile.Dimensions.Location(
                        (int)Game1.player.Position.X - Game1.viewport.Width / 2,
                        (int)Game1.player.Position.Y - Game1.viewport.Height / 2);

                    ClearInventory();

                    SpectatorMode.EnterSpectatorMode(oldLocation, oldPosition);

                    NetworkUtils.AnnounceClientDeath(source, monster, damagerID);
                }, 1800);
            }
            else if (source == DamageSource.PLAYER && damage > 0 && canBeKnockedBack && damager != null && !wasInvincible) // Knockback
            {
                double amount = 10 + 8 * (-1 + 2 / (1 + Math.Pow(Math.E, -0.03 * damage)));
                amount = Math.Min(18, amount); //Just in case

                if (damager.leftRing.Value != null && damager.leftRing.Value.GetsEffectOfRing(529))
                {
                    amount *= 1.5;
                }
                if (damager.rightRing.Value != null && damager.rightRing.Value.GetsEffectOfRing(529))
                {
                    amount *= 1.5;
                }

                Vector2 displacement = Vector2.Subtract(Game1.player.Position, damager.Position);
                if (displacement.LengthSquared() != 0)
                {
                    displacement.Normalize();

                    displacement.Y *= -1;
                    displacement    = Vector2.Multiply(displacement, (float)amount);

                    Game1.player.setTrajectory((int)displacement.X, (int)displacement.Y);
                }
            }
        }
 public void EnableMode(SpectatorMode newMode)
 {
     animator.SetTrigger("Cut");
     StartCoroutine(Change(newMode));
 }
예제 #11
0
 public abstract bool SetSpectatorID(SpectatorMode mode, int spectatorId);