private static void OnPlayerDroppedWeapon(IPlayer player, PlayerWeaponRemovedArg arg)
        {
            // ID == 0 means no weapon was dropped. For example: Activating instant powerup will make it disappeared, not dropped
            if (arg.TargetObjectID == 0)
            {
                return;
            }

            // player argument may be a null object if the weapon drops right after the player was gibbed
            if (player.UniqueID == 0)
            {
                return;
            }

            // dropped weapons dont not always have IObjectWeaponItem type. For example thrown grenades have IObject type
            var weaponObject = Game.GetObject(arg.TargetObjectID) as IObjectWeaponItem;

            if (weaponObject == null)
            {
                return;
            }

            var oldPlayerWpn  = GetOrCreatePlayerWeapon(player);
            var newWeaponInfo = new WeaponObjectInfo()
            {
                Weapon = weaponObject
            };

            switch (weaponObject.WeaponItemType)
            {
            case WeaponItemType.Melee:
                newWeaponInfo.MeleePowerup = oldPlayerWpn.Melee.Powerup;
                m_owners[player.UniqueID].Melee.Remove();
                // TODO: add null object
                break;

            case WeaponItemType.Rifle:
                newWeaponInfo.RangedPowerup = oldPlayerWpn.Primary.Powerup;
                m_owners[player.UniqueID].Primary.Remove();
                m_owners[player.UniqueID].Primary = RangeWeaponFactory.Create(player, WeaponItem.NONE, RangedWeaponPowerup.None);
                break;

            case WeaponItemType.Handgun:
                newWeaponInfo.RangedPowerup = oldPlayerWpn.Secondary.Powerup;
                m_owners[player.UniqueID].Secondary.Remove();
                m_owners[player.UniqueID].Secondary = RangeWeaponFactory.Create(player, WeaponItem.NONE, RangedWeaponPowerup.None);
                break;

            case WeaponItemType.Thrown:
                newWeaponInfo.RangedPowerup = oldPlayerWpn.Throwable.Powerup;
                m_owners[player.UniqueID].Throwable.Remove();
                m_owners[player.UniqueID].Throwable = RangeWeaponFactory.Create(player, WeaponItem.NONE, RangedWeaponPowerup.None);
                break;
            }

            m_weapons.Add(weaponObject.UniqueID, new Weapon(newWeaponInfo));
        }
        internal static IObjectWeaponItem CreateWeapon(string objectID, RangedWeaponPowerup powerup)
        {
            var weaponObject  = (IObjectWeaponItem)Game.CreateObject(objectID);
            var newWeaponInfo = new WeaponObjectInfo()
            {
                Weapon        = weaponObject,
                RangedPowerup = powerup,
            };

            m_weapons.Add(weaponObject.UniqueID, new Weapon(newWeaponInfo));
            return(weaponObject);
        }
 public Weapon(WeaponObjectInfo info)
 {
     WeaponInfo = info;
 }