示例#1
0
        private static bool SetClass(CharacterClassManager __instance, RoleType id, CharacterClassManager.SpawnReason spawnReason)
        {
            var player = __instance.GetPlayer();

            __instance.SetClassIDAdv(id, player.LiteRoleSet, spawnReason, false);
            return(false);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="OwnerChangingRoleEventArgs"/> class.
 /// </summary>
 /// <param name="item"><inheritdoc cref="Item"/></param>
 /// <param name="player"><inheritdoc cref="ChangingRoleEventArgs.Player"/></param>
 /// <param name="newRole"><inheritdoc cref="ChangingRoleEventArgs.NewRole"/></param>
 /// <param name="shouldPreservePosition"><inheritdoc cref="ChangingRoleEventArgs.Lite"/></param>
 /// <param name="reason"><inheritdoc cref="ChangingRoleEventArgs.Reason"/></param>
 public OwnerChangingRoleEventArgs(ItemBase item, Player player, RoleType newRole, bool shouldPreservePosition, CharacterClassManager.SpawnReason reason)
     : base(player, newRole, shouldPreservePosition, reason)
 {
     Item = item;
 }
示例#3
0
        private static void ChangeInventory(Exiled.API.Features.Player player, List <ItemType> items, Dictionary <ItemType, ushort> ammo, RoleType prevRole, RoleType newRole, CharacterClassManager.SpawnReason reason)
        {
            try
            {
                Inventory inventory = player.Inventory;
                if (reason == CharacterClassManager.SpawnReason.Escaped && prevRole != newRole)
                {
                    List <ItemPickupBase> list = new List <ItemPickupBase>();
                    if (inventory.TryGetBodyArmor(out BodyArmor bodyArmor))
                    {
                        bodyArmor.DontRemoveExcessOnDrop = true;
                    }
                    while (inventory.UserInventory.Items.Count > 0)
                    {
                        int            startCount = inventory.UserInventory.Items.Count;
                        ushort         key        = inventory.UserInventory.Items.ElementAt(0).Key;
                        ItemPickupBase item       = inventory.ServerDropItem(key);

                        // If the list wasn't changed, we need to manually remove the item to avoid a softlock.
                        if (startCount == inventory.UserInventory.Items.Count)
                        {
                            inventory.UserInventory.Items.Remove(key);
                        }
                        else
                        {
                            list.Add(item);
                        }
                    }

                    InventoryItemProvider.PreviousInventoryPickups[player.ReferenceHub] = list;
                }
                else
                {
                    while (inventory.UserInventory.Items.Count > 0)
                    {
                        int    startCount = inventory.UserInventory.Items.Count;
                        ushort key        = inventory.UserInventory.Items.ElementAt(0).Key;
                        inventory.ServerRemoveItem(key, null);

                        // If the list wasn't changed, we need to manually remove the item to avoid a softlock.
                        if (startCount == inventory.UserInventory.Items.Count)
                        {
                            inventory.UserInventory.Items.Remove(key);
                        }
                    }

                    inventory.UserInventory.ReserveAmmo.Clear();
                    inventory.SendAmmoNextFrame = true;
                }

                foreach (KeyValuePair <ItemType, ushort> keyValuePair in ammo)
                {
                    inventory.ServerAddAmmo(keyValuePair.Key, keyValuePair.Value);
                }
                foreach (ItemType item in items)
                {
                    InventoryItemProvider.OnItemProvided?.Invoke(player.ReferenceHub, inventory.ServerAddItem(item));
                }
            }
            catch (Exception e)
            {
                Log.Error($"{nameof(ChangingRole)}.{nameof(ChangeInventory)}: {e}");
            }
        }
示例#4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ChangingRoleEventArgs"/> class.
        /// </summary>
        /// <param name="player"><inheritdoc cref="Player"/></param>
        /// <param name="newRole"><inheritdoc cref="NewRole"/></param>
        /// <param name="shouldPreservePosition"><inheritdoc cref="Lite"/></param>
        /// <param name="reason"><inheritdoc cref="Reason"/></param>
        public ChangingRoleEventArgs(Player player, RoleType newRole, bool shouldPreservePosition, CharacterClassManager.SpawnReason reason)
        {
            Player  = player;
            NewRole = newRole;
            if (InventorySystem.Configs.StartingInventories.DefinedInventories.ContainsKey(newRole))
            {
                foreach (ItemType itemType in InventorySystem.Configs.StartingInventories.DefinedInventories[newRole].Items)
                {
                    Items.Add(itemType);
                }
                foreach (KeyValuePair <ItemType, ushort> ammoPair in InventorySystem.Configs.StartingInventories.DefinedInventories[newRole].Ammo)
                {
                    Ammo.Add(ammoPair.Key, ammoPair.Value);
                }
            }

            Lite   = shouldPreservePosition;
            Reason = (SpawnReason)reason;
        }
        private static bool OnSetClass(ref RoleType classid, GameObject ply, CharacterClassManager.SpawnReason spawnReason)
        {
            try
            {
                var player = ply.GetPlayer();

                if (player.Hub.isDedicatedServer || !player.Hub.Ready)
                {
                    return(false);
                }

                //Initialise eventargs
                var eventargs = new PlayerSetClassEventArgs
                {
                    Allow       = true,
                    Player      = player,
                    Role        = classid,
                    SpawnReason = spawnReason,
                    EscapeItems = new List <SynapseItem>(),
                    Position    = Vector3.zero,
                    Rotation    = 0f,
                    Items       = new List <SynapseItem>(),
                    Ammo        = new Dictionary <AmmoType, ushort>(),
                };

                //Set EscapeItems if the Player is escaping
                if (eventargs.IsEscaping)
                {
                    eventargs.EscapeItems = player.Inventory.Items;
                }

                //Find the Position and Rotation if the player becomes a living Role
                if (classid != RoleType.Spectator && classid != RoleType.None)
                {
                    var randomPosition = SpawnpointManager.GetRandomPosition(classid);
                    if (Map.Get.RespawnPoint != Vector3.zero)
                    {
                        eventargs.Position = Map.Get.RespawnPoint;
                    }
                    else if (randomPosition != null)
                    {
                        eventargs.Position = randomPosition.transform.position;
                        eventargs.Rotation = randomPosition.transform.rotation.eulerAngles.y;
                    }
                    else
                    {
                        eventargs.Position = player.ClassManager.DeathPosition;
                    }
                }

                //Find and create the Items that the Player should spawn with
                if (InventorySystem.Configs.StartingInventories.DefinedInventories.TryGetValue(classid, out var roleitems))
                {
                    foreach (var ammo in roleitems.Ammo)
                    {
                        eventargs.Ammo[(AmmoType)ammo.Key] = ammo.Value;
                    }

                    foreach (var itemtype in roleitems.Items)
                    {
                        eventargs.Items.Add(new SynapseItem(itemtype));
                    }
                }

                Server.Get.Events.Player.InvokeSetClassEvent(eventargs);

                classid = eventargs.Role;

                if (eventargs.Allow)
                {
                    player.setClassEventArgs = eventargs;
                }

                return(eventargs.Allow);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerSetClass(SetPlayersClass) failed!!\n{e}");
                return(true);
            }
        }
示例#6
0
        public static bool Prefix(ReferenceHub userHub, RoleType prevClass, RoleType newClass, bool lite, CharacterClassManager.SpawnReason spawnReason)
        {
            if (spawnReason == CharacterClassManager.SpawnReason.Escaped)
            {
                switch (prevClass)
                {
                case RoleType.ClassD:
                    if (newClass == RoleType.ChaosConscript)
                    {
                        RoundSummary.EscapedClassD++;
                    }
                    break;

                case RoleType.Scientist:
                    if (newClass == RoleType.NtfSpecialist)
                    {
                        RoundSummary.EscapedScientists++;
                    }
                    break;
                }
            }
            else if (spawnReason == CharacterClassManager.SpawnReason.Revived && prevClass == RoleType.Spectator && newClass == RoleType.Scp0492)
            {
                RoundSummary.ChangedIntoZombies++;
                RoundSummary.singleton.classlistStart.scps_except_zombies++;
                RoundSummary.singleton.classlistStart.zombies++;
            }

            return(false);
        }