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()); }
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()); }
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()); }
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()); }
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()); }
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)); }
// 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); }
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()); }