public Task <IVehicle?> SpawnVehicleAsync(Vector3 position, Quaternion rotation, string vehicleAssetId, IVehicleState?state = null)
        {
            async UniTask <IVehicle?> SpawnVehicleTask()
            {
                await UniTask.SwitchToMainThread();

                if (!ushort.TryParse(vehicleAssetId, out var parsedVehicleId))
                {
                    throw new Exception($"Invalid vehicle id: {vehicleAssetId}");
                }

                if (Assets.find(EAssetType.VEHICLE, parsedVehicleId) is not VehicleAsset vehicleAsset)
                {
                    return(null);
                }

                UnturnedVehicle?vehicle = null;

                if (state is UnturnedVehicleState && state.StateData?.Length > 0)
                {
                    ReadState(state.StateData, out _ /* id doesn't require i guess? */, out var skinId, out var mythicId,
                              out var roadPosition, out var fuel, out var health, out var batteryCharge,
                              out var owner, out var group, out var locked, out byte[][] turrets,
                              out _, out var tireAliveMask, out var items);

                    var iVehicle = VehicleManager.SpawnVehicleV3(vehicleAsset, skinId, mythicId, roadPosition,
                                                                 position.ToUnityVector(), rotation.ToUnityQuaternion(), false, false, false,
                                                                 false, fuel, health, batteryCharge, owner, group, locked, turrets, tireAliveMask);

                    if (iVehicle != null)
                    {
                        vehicle = new UnturnedVehicle(iVehicle);

                        if (items != null)
                        {
                            foreach (var item in items)
                            {
                                iVehicle.trunkItems.loadItem(item.x, item.y, item.rot, item.item);
                            }
                        }
                    }
                }
                else
                {
                    var iVehicle = VehicleManager.spawnVehicleV2(parsedVehicleId, position.ToUnityVector(),
                                                                 Quaternion.Identity.ToUnityQuaternion());
                    if (iVehicle != null)
                    {
                        vehicle = new UnturnedVehicle(iVehicle);
                    }
                }

                return(vehicle);
            }

            return(SpawnVehicleTask().AsTask());
        }
示例#2
0
        public Task <bool> SetPositionAsync(Vector3 position, Vector3 rotation)
        {
            async UniTask <bool> TeleportationTask()
            {
                await UniTask.SwitchToMainThread();

                if (Player.transform.position == position.ToUnityVector() &&
                    Player.transform.rotation.eulerAngles == rotation.ToUnityVector())
                {
                    return(true);
                }

                if (!ValidationHelper.IsValid(position) || !ValidationHelper.IsValid(rotation))
                {
                    return(false);
                }

                var rotationAngle = MeasurementTool.angleToByte(rotation.Y);

                Player.channel.send("askTeleport", ESteamCall.ALL, ESteamPacket.UPDATE_RELIABLE_BUFFER, position, rotationAngle);
                return(true);
            }

            return(TeleportationTask().AsTask());
        }
示例#3
0
        public virtual Task <bool> SetPositionAsync(Vector3 targetPosition)
        {
            async UniTask <bool> PositionTask()
            {
                if (!ValidationHelper.IsValid(targetPosition))
                {
                    return(false);
                }

                await UniTask.SwitchToMainThread();

                var unityPosition = targetPosition.ToUnityVector();

                if (m_Rigidbody != null)
                {
                    m_Rigidbody.position = unityPosition;
                }
                else
                {
                    m_Transform.position = unityPosition;
                }

                return(true);
            }

            return(PositionTask().AsTask());
        }
示例#4
0
        public virtual Task <bool> SetRotationAsync(Vector3 rotation)
        {
            async UniTask <bool> RotationTask()
            {
                if (!ValidationHelper.IsValid(rotation))
                {
                    return(false);
                }

                await UniTask.SwitchToMainThread();

                var unityRotation = Quaternion.Euler(rotation.ToUnityVector());

                if (m_Rigidbody != null)
                {
                    m_Rigidbody.rotation = unityRotation;
                }
                else
                {
                    m_Transform.rotation = unityRotation;
                }

                return(true);
            }

            return(RotationTask().AsTask());
        }
示例#5
0
        public Task <bool> SetPositionAsync(Vector3 position, Vector3 rotation)
        {
            async UniTask <bool> TeleportationTask()
            {
                await UniTask.SwitchToMainThread();

                if (Player.transform.position == position.ToUnityVector() &&
                    Player.transform.rotation.eulerAngles == rotation.ToUnityVector())
                {
                    return(true);
                }

                if (!ValidationHelper.IsValid(position) || !ValidationHelper.IsValid(rotation))
                {
                    return(false);
                }

                return(Player.teleportToLocation(position.ToUnityVector(), rotation.Y));
            }

            return(TeleportationTask().AsTask());
        }
示例#6
0
        private UnturnedItemDrop?DropItem(Item item, Vector3 position)
        {
            var point = position.ToUnityVector();

            ItemManager.dropItem(item, point, playEffect: true, isDropped: true, wideSpread: false);

            if (!Regions.tryGetCoordinate(point, out var x, out var y))
            {
                return(null);
            }

            var region   = ItemManager.regions[x, y];
            var itemData = region.items.FirstOrDefault(d => d.item == item);

            return(itemData == null ? null : new UnturnedItemDrop(x, y, itemData));
        }
示例#7
0
        // similar to ItemManager.dropItem but with some useful return values
        private (ItemDrop drop, ItemRegion region) DropItem(Item item, Vector3 position)
        {
            var point = position.ToUnityVector();

            if (!Regions.tryGetCoordinate(point, out var x, out var y))
            {
                return(null, null);
            }

            if (point.y > 0.0)
            {
                Physics.Raycast(point + UVector3.up, UVector3.down, out var hitInfo,
                                Mathf.Min(point.y + 1f, Level.HEIGHT), RayMasks.BLOCK_ITEM);
                if (hitInfo.collider != null)
                {
                    point.y = hitInfo.point.y;
                }
            }

            bool shouldAllow = true;

            ItemManager.onServerSpawningItemDrop?.Invoke(item, ref point, ref shouldAllow);
            if (!shouldAllow)
            {
                return(null, null);
            }

            EffectManager.sendEffect(6, EffectManager.SMALL, point);
            var nextInstanceId = (uint)s_InstanceCountField.GetValue(null) + 1;

            s_InstanceCountField.SetValue(null, nextInstanceId);

            var itemData = new ItemData(item, nextInstanceId, point, newDropped: true);

            var region = ItemManager.regions[x, y];

            region.items.Add(itemData);
            ItemManager.instance.channel.send("tellItem",
                                              ESteamCall.CLIENTS, x, y, ItemManager.ITEM_REGIONS,
                                              ESteamPacket.UPDATE_RELIABLE_BUFFER, x, y, item.id,
                                              item.amount, item.quality, item.state, point, itemData.instanceID);

            var drop = region.drops[region.drops.Count - 1];

            return(drop, region);
        }
示例#8
0
        public Task <bool> SetVelocityAsync(Vector3 velocity)
        {
            async UniTask <bool> SetVelocityTask()
            {
                await UniTask.SwitchToMainThread();

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

                m_Rigidbody.velocity = velocity.ToUnityVector();
                return(true);
            }

            return(SetVelocityTask().AsTask());
        }