Example #1
0
    public void DismountPlayer(BasePlayer player, bool lite = false)
    {
        if (_mounted == null || _mounted != player || Interface.CallHook("CanDismountEntity", player, this) != null)
        {
            return;
        }
        BaseVehicle baseVehicle = VehicleParent();
        Vector3     res;

        if (lite)
        {
            if (baseVehicle != null)
            {
                baseVehicle.PrePlayerDismount(player, this);
            }
            _mounted.DismountObject();
            _mounted = null;
            SetFlag(Flags.Busy, false);
            if (baseVehicle != null)
            {
                baseVehicle.PlayerDismounted(player, this);
            }
            Interface.CallHook("OnEntityDismounted", this, player);
        }
        else if (!GetDismountPosition(player, out res) || Distance(res) > 10f)
        {
            if (baseVehicle != null)
            {
                baseVehicle.PrePlayerDismount(player, this);
            }
            res = player.transform.position;
            _mounted.DismountObject();
            _mounted.MovePosition(res);
            _mounted.ClientRPCPlayer(null, _mounted, "ForcePositionTo", res);
            BasePlayer mounted = _mounted;
            _mounted = null;
            Debug.LogWarning("Killing player due to invalid dismount point :" + player.displayName + " / " + player.userID + " on obj : " + base.gameObject.name);
            mounted.Hurt(1000f, DamageType.Suicide, mounted, false);
            SetFlag(Flags.Busy, false);
            if (baseVehicle != null)
            {
                baseVehicle.PlayerDismounted(player, this);
            }
        }
        else
        {
            if (baseVehicle != null)
            {
                baseVehicle.PrePlayerDismount(player, this);
            }
            _mounted.DismountObject();
            _mounted.transform.rotation = Quaternion.LookRotation(Vector3.forward, Vector3.up);
            _mounted.MovePosition(res);
            _mounted.SendNetworkUpdateImmediate();
            _mounted = null;
            SetFlag(Flags.Busy, false);
            if (baseVehicle != null)
            {
                baseVehicle.PlayerDismounted(player, this);
            }
            player.ForceUpdateTriggers();
            if ((bool)player.GetParentEntity())
            {
                BaseEntity baseEntity = player.GetParentEntity();
                player.ClientRPCPlayer(null, player, "ForcePositionToParentOffset", baseEntity.transform.InverseTransformPoint(res), baseEntity.net.ID);
            }
            else
            {
                Interface.CallHook("OnEntityDismounted", this, player);
                player.ClientRPCPlayer(null, player, "ForcePositionTo", res);
            }
            OnPlayerDismounted(player);
        }
    }