修noteprefab和submodule
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -45,9 +45,12 @@ namespace Ichni.RhythmGame
|
||||
|
||||
this.baseColorDirtyMark = false;
|
||||
this.emissionColorDirtyMark = false;
|
||||
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
}
|
||||
}
|
||||
|
||||
public ColorSubmodule(GameElement attachedGameElement, Color originalBaseColor) : base(attachedGameElement)
|
||||
@@ -64,8 +67,11 @@ namespace Ichni.RhythmGame
|
||||
this.baseColorDirtyMark = false;
|
||||
this.emissionColorDirtyMark = false;
|
||||
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
}
|
||||
}
|
||||
|
||||
public ColorSubmodule(GameElement attachedGameElement, Color originalBaseColor, bool emissionEnabled,
|
||||
@@ -83,8 +89,11 @@ namespace Ichni.RhythmGame
|
||||
this.baseColorDirtyMark = false;
|
||||
this.emissionColorDirtyMark = false;
|
||||
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
|
||||
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
|
||||
}
|
||||
}
|
||||
|
||||
public override void SaveBM()
|
||||
|
||||
@@ -37,14 +37,17 @@ namespace Ichni.RhythmGame
|
||||
effectCollection.Add("Miss", new List<EffectBase>());
|
||||
effectCollection.Add("AfterJudge", new List<EffectBase>());
|
||||
}
|
||||
|
||||
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public EffectSubmodule(GameElement attachedGameElement, Dictionary<string, List<EffectBase_BM>> effectList_BM) : base(attachedGameElement)
|
||||
{
|
||||
effectCollection = new Dictionary<string, List<EffectBase>>();
|
||||
|
||||
|
||||
foreach (var effect in effectList_BM)
|
||||
{
|
||||
List<EffectBase> effectList = new List<EffectBase>();
|
||||
@@ -62,10 +65,14 @@ namespace Ichni.RhythmGame
|
||||
effectList.Add(effectBM.ConvertToGameType(attachedGameElement));
|
||||
}
|
||||
}
|
||||
|
||||
effectCollection.Add(effect.Key, effectList);
|
||||
}
|
||||
|
||||
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,11 @@ namespace Ichni.RhythmGame
|
||||
public NoteJudgeTriggerSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
|
||||
{
|
||||
connectedNotes = new List<NoteBase>();
|
||||
(attachedGameElement as IHaveNoteJudgeTriggerSubmodule).noteJudgeTriggerSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveNoteJudgeTriggerSubmodule).noteJudgeTriggerSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public override void SaveBM()
|
||||
|
||||
@@ -13,18 +13,24 @@ namespace Ichni.RhythmGame
|
||||
public GameElement attachedGameElement;
|
||||
|
||||
public BaseElement_BM matchedBM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 在生成时检测是否已经有重复的submodule
|
||||
/// </summary>
|
||||
public bool HaveSameSubmodule { get; set; }
|
||||
|
||||
public SubmoduleBase(GameElement attachedGameElement)
|
||||
{
|
||||
this.attachedGameElement = attachedGameElement;
|
||||
HaveSameSubmodule = attachedGameElement.submoduleList.Any(x => x.GetType() == this.GetType());
|
||||
|
||||
if (attachedGameElement.submoduleList.Any(x => x.GetType() == this.GetType()))
|
||||
if (HaveSameSubmodule)
|
||||
{
|
||||
Debug.LogWarning("存在重复的Submodule");
|
||||
LogWindow.Log($"There are repeated submodule on Game Element {attachedGameElement.elementName}", Color.yellow);
|
||||
Debug.LogAssertion($"存在重复的Submodule: {GetType()},此操作无效");
|
||||
LogWindow.Log($"There are repeated submodule {GetType()} on Game Element {attachedGameElement.elementName}", Color.red);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
this.attachedGameElement.submoduleList.Add(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,19 +16,26 @@ namespace Ichni.RhythmGame
|
||||
public TimeDurationSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
|
||||
{
|
||||
isOverridingDuration = false;
|
||||
startTime = -32767;//TODO: 换为-delay
|
||||
endTime = 32767;//TODO: 换为songLength
|
||||
startTime = -32767; //TODO: 换为-delay
|
||||
endTime = 32767; //TODO: 换为songLength
|
||||
|
||||
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public TimeDurationSubmodule(GameElement attachedGameElement, bool isOverridingDuration, float startTime, float endTime) : base(attachedGameElement)
|
||||
public TimeDurationSubmodule(GameElement attachedGameElement, bool isOverridingDuration, float startTime, float endTime) :
|
||||
base(attachedGameElement)
|
||||
{
|
||||
this.isOverridingDuration = isOverridingDuration;
|
||||
this.startTime = startTime;
|
||||
this.endTime = endTime;
|
||||
|
||||
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckTimeInDuration(float time, float offset = 0.2f)
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Ichni.RhythmGame
|
||||
public bool scaleDirtyMark;
|
||||
|
||||
public bool eulerAnglesOffsetLock;
|
||||
|
||||
|
||||
public TransformSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
|
||||
{
|
||||
this.originalPosition = Vector3.zero;
|
||||
@@ -51,8 +51,11 @@ namespace Ichni.RhythmGame
|
||||
|
||||
eulerAnglesOffsetLock = false;
|
||||
|
||||
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
|
||||
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
|
||||
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
|
||||
}
|
||||
}
|
||||
|
||||
public TransformSubmodule(GameElement attachedGameElement,
|
||||
@@ -75,13 +78,16 @@ namespace Ichni.RhythmGame
|
||||
scaleDirtyMark = true;
|
||||
|
||||
eulerAnglesOffsetLock = false;
|
||||
|
||||
|
||||
attachedGameElement.transform.localScale = currentScale;
|
||||
attachedGameElement.transform.localEulerAngles = currentEulerAngles;
|
||||
attachedGameElement.transform.localPosition = currentPosition;
|
||||
|
||||
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
|
||||
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
|
||||
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
|
||||
}
|
||||
}
|
||||
|
||||
public override void SaveBM()
|
||||
|
||||
@@ -53,6 +53,7 @@ namespace Ichni.RhythmGame
|
||||
this.tags = tags;
|
||||
EditorManager.instance.beatmapContainer.gameElementList.Add(this);
|
||||
submoduleList = new List<SubmoduleBase>();
|
||||
|
||||
if (isFirstGenerated)
|
||||
{
|
||||
SetDefaultSubmodules();
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace Ichni.RhythmGame
|
||||
public List<string> holdStartAudioList;
|
||||
|
||||
private NoteBase note => attachedGameElement as NoteBase;
|
||||
|
||||
|
||||
public NoteAudioSubmodule(NoteBase attachedGameElement, string defaultAudio) : base(attachedGameElement)
|
||||
{
|
||||
generalJudgeAudioList = new List<string>();
|
||||
@@ -26,14 +26,17 @@ namespace Ichni.RhythmGame
|
||||
badAudioList = new List<string>();
|
||||
missAudioList = new List<string>();
|
||||
holdStartAudioList = new List<string>();
|
||||
|
||||
|
||||
generalJudgeAudioList.Add(defaultAudio);
|
||||
|
||||
this.note.noteAudioSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.note.noteAudioSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public NoteAudioSubmodule(NoteBase attachedGameElement, List<string> generalJudgeAudioList,
|
||||
List<string> perfectAudioList, List<string> goodAudioList, List<string> badAudioList,
|
||||
|
||||
public NoteAudioSubmodule(NoteBase attachedGameElement, List<string> generalJudgeAudioList,
|
||||
List<string> perfectAudioList, List<string> goodAudioList, List<string> badAudioList,
|
||||
List<string> missAudioList, List<string> holdStartAudioList) : base(attachedGameElement)
|
||||
{
|
||||
this.generalJudgeAudioList = generalJudgeAudioList;
|
||||
@@ -42,8 +45,11 @@ namespace Ichni.RhythmGame
|
||||
this.badAudioList = badAudioList;
|
||||
this.missAudioList = missAudioList;
|
||||
this.holdStartAudioList = holdStartAudioList ?? new List<string>();
|
||||
|
||||
this.note.noteAudioSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.note.noteAudioSubmodule = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,24 +10,30 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
public List<NoteJudgeUnit> judgeUnitList;
|
||||
private NoteBase note => attachedGameElement as NoteBase;
|
||||
|
||||
|
||||
public NoteJudgeSubmodule(NoteBase attachedGameElement) : base(attachedGameElement)
|
||||
{
|
||||
judgeUnitList = new List<NoteJudgeUnit>();
|
||||
|
||||
this.note.noteJudgeSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.note.noteJudgeSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public NoteJudgeSubmodule(NoteBase attachedGameElement, List<NoteJudgeUnit_BM> judgeUnitList_BM) : base(attachedGameElement)
|
||||
{
|
||||
judgeUnitList = new List<NoteJudgeUnit>();
|
||||
|
||||
|
||||
foreach (NoteJudgeUnit_BM judgeUnitBM in judgeUnitList_BM)
|
||||
{
|
||||
judgeUnitList.Add(judgeUnitBM.ConvertToGameType(attachedGameElement));
|
||||
}
|
||||
|
||||
this.note.noteJudgeSubmodule = this;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.note.noteJudgeSubmodule = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,12 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
Flick flick = Instantiate(EditorManager.instance.basePrefabs.flickNote, parentElement.transform)
|
||||
.GetComponent<Flick>();
|
||||
|
||||
if (EditorManager.instance.useNotePrefab)
|
||||
{
|
||||
isFirstGenerated = false;
|
||||
}
|
||||
|
||||
flick.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
|
||||
flick.exactJudgeTime = exactJudgeTime;
|
||||
flick.availableFlickDirections = directions;
|
||||
|
||||
@@ -22,6 +22,12 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
Hold hold = Instantiate(EditorManager.instance.basePrefabs.holdNote, parentElement.transform)
|
||||
.GetComponent<Hold>();
|
||||
|
||||
if (EditorManager.instance.useNotePrefab)
|
||||
{
|
||||
isFirstGenerated = false;
|
||||
}
|
||||
|
||||
hold.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
|
||||
hold.exactJudgeTime = exactJudgeTime;
|
||||
hold.holdEndTime = holdEndTime;
|
||||
|
||||
@@ -16,6 +16,12 @@ namespace Ichni.RhythmGame
|
||||
GameElement parentElement, float exactJudgeTime)
|
||||
{
|
||||
Stay stay = Instantiate(EditorManager.instance.basePrefabs.stayNote, parentElement.transform).GetComponent<Stay>();
|
||||
|
||||
if (EditorManager.instance.useNotePrefab)
|
||||
{
|
||||
isFirstGenerated = false;
|
||||
}
|
||||
|
||||
stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
|
||||
stay.exactJudgeTime = exactJudgeTime;
|
||||
|
||||
|
||||
@@ -17,6 +17,12 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
Tap tap = Instantiate(EditorManager.instance.basePrefabs.tapNote, parentElement.transform)
|
||||
.GetComponent<Tap>();
|
||||
|
||||
if (EditorManager.instance.useNotePrefab)
|
||||
{
|
||||
isFirstGenerated = false;
|
||||
}
|
||||
|
||||
tap.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
|
||||
tap.exactJudgeTime = exactJudgeTime;
|
||||
|
||||
|
||||
@@ -25,8 +25,7 @@ namespace Ichni.RhythmGame
|
||||
Track.TrackSamplingType trackSamplingType, bool isClosed, bool isShowingDisplay) : base(track)
|
||||
{
|
||||
this.path = track.AddComponent<SplineComputer>();
|
||||
|
||||
this.track.trackPathSubmodule = this;
|
||||
|
||||
this.pathNodeList = new List<PathNode>();
|
||||
this.trackSpaceType = trackSpaceType;
|
||||
this.trackSamplingType = trackSamplingType;
|
||||
@@ -43,6 +42,11 @@ namespace Ichni.RhythmGame
|
||||
this.trackDisplay.size = 0.1f;
|
||||
|
||||
this.SetDisplay(isShowingDisplay);
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.track.trackPathSubmodule = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,12 +25,16 @@ namespace Ichni.RhythmGame
|
||||
|
||||
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite) : base(track)
|
||||
{
|
||||
this.track.trackRendererSubmodule = this;
|
||||
this.enableEmission = enableEmission;
|
||||
this.emissionIntensity = emissionIntensity;
|
||||
this.materialThemeBundleName = String.Empty;
|
||||
this.materialName = String.Empty;
|
||||
this.zWrite = zWrite;
|
||||
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.track.trackRendererSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyMaterial(string materialThemeBundleName, string materialName)
|
||||
|
||||
@@ -11,8 +11,10 @@ namespace Ichni.RhythmGame
|
||||
|
||||
public TrackTimeSubmodule(Track track) : base(track)
|
||||
{
|
||||
this.track = track;
|
||||
this.track.trackTimeSubmodule = this;
|
||||
if (!HaveSameSubmodule)
|
||||
{
|
||||
this.track.trackTimeSubmodule = this;
|
||||
}
|
||||
}
|
||||
|
||||
public override void SaveBM()
|
||||
|
||||
@@ -312,7 +312,10 @@ namespace Ichni
|
||||
e.submoduleList.ForEach(s =>
|
||||
{
|
||||
s.SaveBM();
|
||||
clip.Add(s.matchedBM);
|
||||
if (s.matchedBM != null)
|
||||
{
|
||||
clip.Add(s.matchedBM);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -4,32 +4,24 @@
|
||||
"value" : [
|
||||
{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
|
||||
"exactJudgeTime" : 12.3,
|
||||
"exactJudgeTime" : 1.5,
|
||||
"elementName" : "New Tap",
|
||||
"tags" : [
|
||||
|
||||
],
|
||||
"elementGuid" : {
|
||||
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
|
||||
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
|
||||
},
|
||||
"attachedElementGuid" : {
|
||||
"value" : "9abab7b8-d2af-4e43-8c1b-4ef6607fca38"
|
||||
"value" : "00000000-0000-0000-0000-000000000000"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
|
||||
"isOverridingDuration" : false,
|
||||
"startTime" : -32767,
|
||||
"isOverridingDuration" : true,
|
||||
"startTime" : -2,
|
||||
"endTime" : 32767,
|
||||
"attachedElementGuid" : {
|
||||
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp",
|
||||
"judgeUnitList" : [
|
||||
|
||||
],
|
||||
"attachedElementGuid" : {
|
||||
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
|
||||
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.NoteAudioSubmodule_BM,Assembly-CSharp",
|
||||
@@ -52,7 +44,15 @@
|
||||
|
||||
],
|
||||
"attachedElementGuid" : {
|
||||
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
|
||||
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp",
|
||||
"judgeUnitList" : [
|
||||
|
||||
],
|
||||
"attachedElementGuid" : {
|
||||
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNoteVisual_BM,Assembly-CSharp",
|
||||
@@ -63,10 +63,10 @@
|
||||
|
||||
],
|
||||
"elementGuid" : {
|
||||
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
|
||||
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
|
||||
},
|
||||
"attachedElementGuid" : {
|
||||
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
|
||||
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
|
||||
@@ -86,7 +86,7 @@
|
||||
"z" : 1
|
||||
},
|
||||
"attachedElementGuid" : {
|
||||
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
|
||||
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
|
||||
@@ -94,7 +94,7 @@
|
||||
"startTime" : -32767,
|
||||
"endTime" : 32767,
|
||||
"attachedElementGuid" : {
|
||||
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
|
||||
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
|
||||
@@ -113,7 +113,7 @@
|
||||
},
|
||||
"originalEmissionIntensity" : 0,
|
||||
"attachedElementGuid" : {
|
||||
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
|
||||
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
|
||||
}
|
||||
},{
|
||||
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
|
||||
@@ -154,7 +154,7 @@
|
||||
]
|
||||
},
|
||||
"attachedElementGuid" : {
|
||||
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
|
||||
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user