충돌 해결
This commit is contained in:
@@ -831,6 +831,7 @@ GameObject:
|
|||||||
- component: {fileID: 6954167609728662753}
|
- component: {fileID: 6954167609728662753}
|
||||||
- component: {fileID: 8549676201747870985}
|
- component: {fileID: 8549676201747870985}
|
||||||
- component: {fileID: 7236664214523229146}
|
- component: {fileID: 7236664214523229146}
|
||||||
|
- component: {fileID: 8105564570549308953}
|
||||||
m_Layer: 5
|
m_Layer: 5
|
||||||
m_Name: Panel_AssetManager
|
m_Name: Panel_AssetManager
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -909,6 +910,23 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 25457a0961cc0bb4a949d5fe58c2ada6, type: 3}
|
m_Script: {fileID: 11500000, guid: 25457a0961cc0bb4a949d5fe58c2ada6, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!114 &8105564570549308953
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2762757506943678736}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: f9c6f8c6f0c462a4ab09d615c0d0db6c, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
state: 0
|
||||||
|
resizeDirection: 0
|
||||||
|
handleThickness: 5
|
||||||
|
minWidth: 100
|
||||||
|
minHeight: 100
|
||||||
--- !u!1 &2774336303168765450
|
--- !u!1 &2774336303168765450
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -6984,6 +6984,74 @@ PrefabInstance:
|
|||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: Panel_AssetManager
|
value: Panel_AssetManager
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2762757506943678736, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2921248101980759983, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2921248101980759983, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2921248101980759983, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2921248101980759983, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4989624515221410691, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4989624515221410691, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4989624515221410691, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6361296329743540470, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6361296329743540470, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6361296329743540470, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6361296329743540470, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6745064031299755140, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7211928151506747948, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7211928151506747948, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7211928151506747948, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7211928151506747948, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 7257151592976347537, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
- target: {fileID: 7257151592976347537, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
propertyPath: m_Pivot.x
|
propertyPath: m_Pivot.x
|
||||||
value: 0.5
|
value: 0.5
|
||||||
@@ -7064,6 +7132,46 @@ PrefabInstance:
|
|||||||
propertyPath: m_LocalEulerAnglesHint.z
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7493294281931036311, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7493294281931036311, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7493294281931036311, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7493294281931036311, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7816452433921728637, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7816452433921728637, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7816452433921728637, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7816452433921728637, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8730527854822624186, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8730527854822624186, guid: d524adc6297ea50418c16190b3f42f66, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
|
|||||||
@@ -117,8 +117,36 @@ namespace Studio.AssetTool
|
|||||||
}
|
}
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnLoadAssetSelected(AssetLibraryItem item, AssetData asset)
|
||||||
|
{
|
||||||
|
if (item == null || item.linkedObject == null)
|
||||||
|
{
|
||||||
|
selectedAssetData = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selectedAssetData = item.linkedObject.GetComponent<CustomAssetData>();
|
||||||
|
if (selectedAssetData == null || selectedAssetData.isLoadComplete == false)
|
||||||
|
{
|
||||||
|
selectedAssetData = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selectedItem = UnityEngine.GameObject.Instantiate(renderObjectPrefab);
|
||||||
|
selectRenderObject = selectedItem.GetComponent<CustomAssetRenderObject>();
|
||||||
|
selectRenderObject.OnSelected += panel_ObjectDistance.SelectObjectFromCreate;
|
||||||
|
selectRenderObject.instantiateObject = selectedAssetData.InstantiateLoadedObject;
|
||||||
|
selectRenderObject.getBounds = selectedAssetData.GetCombinedBoundary;
|
||||||
|
selectRenderObject.CreateRenderObject();
|
||||||
|
selectRenderObject.Select();
|
||||||
|
selectedAssetData.AddTransformToRender(selectedItem.transform);
|
||||||
|
CoroutineRunner.instance.StartCoroutine(ChangeSelectedAssetTransform());
|
||||||
|
|
||||||
|
selectRenderObject.transform.position = new Vector3(asset.position.x, asset.position.y, asset.position.z);
|
||||||
|
selectRenderObject.transform.eulerAngles = new Vector3(asset.rotation.x, asset.rotation.y, asset.rotation.z);
|
||||||
|
selectRenderObject.transform.localScale = new Vector3(asset.scale.x, asset.scale.y, asset.scale.z);
|
||||||
|
}
|
||||||
public void OnAssetSelected(AssetLibraryItem item)
|
public void OnAssetSelected(AssetLibraryItem item)
|
||||||
{
|
{
|
||||||
if (item == null || item.linkedObject == null)
|
if (item == null || item.linkedObject == null)
|
||||||
@@ -190,10 +218,7 @@ namespace Studio.AssetTool
|
|||||||
public void OnLoadAsset(AssetData asset)
|
public void OnLoadAsset(AssetData asset)
|
||||||
{
|
{
|
||||||
AssetLibraryItem item = assetScrollView.FindItem(asset.name, AssetLibraryItemType.file);
|
AssetLibraryItem item = assetScrollView.FindItem(asset.name, AssetLibraryItemType.file);
|
||||||
OnAssetSelected(item);
|
OnLoadAssetSelected(item, asset);
|
||||||
selectRenderObject.transform.position = new Vector3(asset.position.x, asset.position.y, asset.position.z);
|
|
||||||
selectRenderObject.transform.eulerAngles = new Vector3(asset.rotation.x, asset.rotation.y, asset.rotation.z);
|
|
||||||
selectRenderObject.transform.localScale = new Vector3(asset.scale.x, asset.scale.y, asset.scale.z);
|
|
||||||
OnAssetDropped(item);
|
OnAssetDropped(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,11 +55,11 @@ namespace Studio.AssetTool
|
|||||||
|
|
||||||
var files = Directory.GetFiles(path, "*.fbx", SearchOption.AllDirectories);
|
var files = Directory.GetFiles(path, "*.fbx", SearchOption.AllDirectories);
|
||||||
|
|
||||||
if (dataRepo.TryGetDataFromPath(path, out var p))
|
|
||||||
return;
|
|
||||||
|
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
{
|
{
|
||||||
|
if (dataRepo.TryGetDataFromPath(path, out var p))
|
||||||
|
continue;
|
||||||
|
|
||||||
filePaths.Add(file);
|
filePaths.Add(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +74,9 @@ namespace Studio.AssetTool
|
|||||||
var directoryPath = Path.GetDirectoryName(file);
|
var directoryPath = Path.GetDirectoryName(file);
|
||||||
var folderName = Path.GetFileName(directoryPath);
|
var folderName = Path.GetFileName(directoryPath);
|
||||||
|
|
||||||
|
if (dataRepo.TryGetDataFromName(assetName, out var p))
|
||||||
|
continue;
|
||||||
|
|
||||||
GameObject newObject = new GameObject(assetName);
|
GameObject newObject = new GameObject(assetName);
|
||||||
newObject.transform.parent = fbxAnchor;
|
newObject.transform.parent = fbxAnchor;
|
||||||
CustomAssetData assetData = newObject.AddComponent<CustomAssetData>();
|
CustomAssetData assetData = newObject.AddComponent<CustomAssetData>();
|
||||||
@@ -89,6 +92,7 @@ namespace Studio.AssetTool
|
|||||||
|
|
||||||
OnLoadComplete(assetData);
|
OnLoadComplete(assetData);
|
||||||
}
|
}
|
||||||
|
onLoadComplete?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveToLocalData(List<CustomAssetData> assetDatas, string path = "")
|
public void SaveToLocalData(List<CustomAssetData> assetDatas, string path = "")
|
||||||
@@ -231,7 +235,6 @@ namespace Studio.AssetTool
|
|||||||
connector.assetScrollView.AddItem(folderName, null, AssetLibraryItemType.folder);
|
connector.assetScrollView.AddItem(folderName, null, AssetLibraryItemType.folder);
|
||||||
|
|
||||||
AssetLibraryItem item = connector.assetScrollView.AddItem(assetData.assetName, assetData.gameObject, AssetLibraryItemType.file, urlSectionItem);
|
AssetLibraryItem item = connector.assetScrollView.AddItem(assetData.assetName, assetData.gameObject, AssetLibraryItemType.file, urlSectionItem);
|
||||||
onLoadComplete?.Invoke();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,6 +31,7 @@ namespace Studio
|
|||||||
fbxFileManager.onLoadComplete += OnLoadCustomAsset;
|
fbxFileManager.onLoadComplete += OnLoadCustomAsset;
|
||||||
onAssetManagerDatas += canvas_Popup.panel_assetmanager.SetAssetManager;
|
onAssetManagerDatas += canvas_Popup.panel_assetmanager.SetAssetManager;
|
||||||
onAssetManagerDatas += (data) => projectManager.OpenProjectSettingsDataAfterDataLoad();
|
onAssetManagerDatas += (data) => projectManager.OpenProjectSettingsDataAfterDataLoad();
|
||||||
|
|
||||||
}
|
}
|
||||||
public void LoadLocalFBXDirectorys(List<string> folderPaths)
|
public void LoadLocalFBXDirectorys(List<string> folderPaths)
|
||||||
{
|
{
|
||||||
@@ -80,13 +81,12 @@ namespace Studio
|
|||||||
{
|
{
|
||||||
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
||||||
connector.OnLoadAsset(asset);
|
connector.OnLoadAsset(asset);
|
||||||
|
|
||||||
itemDict.Add(asset.id, connector.connectedAssets.Last().hierarchyItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestoreHierarchy(AssetData asset)
|
private void RestoreHierarchy(AssetData asset)
|
||||||
{
|
{
|
||||||
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
||||||
|
itemDict.TryAdd(asset.id, connector.connectedAssets.Last().hierarchyItem);
|
||||||
|
|
||||||
foreach (int id in asset.children)
|
foreach (int id in asset.children)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using System;
|
using System;
|
||||||
using Studio.Util;
|
using Studio.Util;
|
||||||
using Studio.AssetTool;
|
using Studio.AssetTool;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Studio
|
namespace Studio
|
||||||
{
|
{
|
||||||
@@ -27,6 +28,30 @@ namespace Studio
|
|||||||
public Action<UI_DynamicObjectItem> onUISetting;
|
public Action<UI_DynamicObjectItem> onUISetting;
|
||||||
public Action<UI_DynamicObjectItem> onRemoveItem;
|
public Action<UI_DynamicObjectItem> onRemoveItem;
|
||||||
|
|
||||||
|
public void SetDataList(List<string> dataList)
|
||||||
|
{
|
||||||
|
this.dataList = dataList;
|
||||||
|
|
||||||
|
var preDataDropdownOption = Dropdown_Data.options[Dropdown_Data.value].text;
|
||||||
|
SetDataDropdown();
|
||||||
|
|
||||||
|
foreach(var option in Dropdown_Data.options)
|
||||||
|
{
|
||||||
|
Dropdown_Data.value = option.text == preDataDropdownOption ? Dropdown_Data.options.IndexOf(option) : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void SetModelList(List<CustomAssetData> modelList)
|
||||||
|
{
|
||||||
|
this.modelList = modelList;
|
||||||
|
|
||||||
|
var preDataDropdownOption = Dropdown_Model.options[Dropdown_Model.value].text;
|
||||||
|
SetModelDropdown();
|
||||||
|
|
||||||
|
foreach (var option in Dropdown_Model.options)
|
||||||
|
{
|
||||||
|
Dropdown_Model.value = option.text == preDataDropdownOption ? Dropdown_Model.options.IndexOf(option) : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
public void SetData(List<string> dataList, List<CustomAssetData> modelList)
|
public void SetData(List<string> dataList, List<CustomAssetData> modelList)
|
||||||
{
|
{
|
||||||
this.dataList = dataList;
|
this.dataList = dataList;
|
||||||
@@ -106,7 +131,11 @@ namespace Studio
|
|||||||
{
|
{
|
||||||
var dynamic3DModelConnection = new Dynamic3DModelConnection();
|
var dynamic3DModelConnection = new Dynamic3DModelConnection();
|
||||||
dynamic3DModelConnection.dataName = Dropdown_Data.options[Dropdown_Data.value].text;
|
dynamic3DModelConnection.dataName = Dropdown_Data.options[Dropdown_Data.value].text;
|
||||||
dynamic3DModelConnection.modelName = selectedModel.assetName;
|
|
||||||
|
if (selectedModel != null)
|
||||||
|
{
|
||||||
|
dynamic3DModelConnection.modelName = selectedModel.assetName;
|
||||||
|
}
|
||||||
dynamic3DModelConnection.modelUISettingData = selectDynamicObjectData;
|
dynamic3DModelConnection.modelUISettingData = selectDynamicObjectData;
|
||||||
|
|
||||||
return dynamic3DModelConnection;
|
return dynamic3DModelConnection;
|
||||||
|
|||||||
@@ -51,7 +51,9 @@ namespace Studio
|
|||||||
if (mqttSetting == null)
|
if (mqttSetting == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach(var mqttConnection in mqttSetting.mqttConnections)
|
dataList.Clear();
|
||||||
|
|
||||||
|
foreach (var mqttConnection in mqttSetting.mqttConnections)
|
||||||
{
|
{
|
||||||
foreach(var mqttTopic in mqttConnection.topics)
|
foreach(var mqttTopic in mqttConnection.topics)
|
||||||
{
|
{
|
||||||
@@ -59,11 +61,22 @@ namespace Studio
|
|||||||
dataList.Add(dataName);
|
dataList.Add(dataName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
foreach(var item in dynamicObjectItems)
|
||||||
|
{
|
||||||
|
item.SetDataList(dataList);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void SetModelDropdownData(CustomAssetDataRepository customAssetDataRepository)
|
public void SetModelDropdownData(CustomAssetDataRepository customAssetDataRepository)
|
||||||
{
|
{
|
||||||
|
modelList.Clear();
|
||||||
|
|
||||||
var assetDatas = customAssetDataRepository.assetDatas;
|
var assetDatas = customAssetDataRepository.assetDatas;
|
||||||
modelList.AddRange(assetDatas);
|
modelList.AddRange(assetDatas);
|
||||||
|
|
||||||
|
foreach (var item in dynamicObjectItems)
|
||||||
|
{
|
||||||
|
item.SetModelList(modelList);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private void OnClickAddDynamicObjectButton()
|
private void OnClickAddDynamicObjectButton()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user