Simplified PacMan state
This commit is contained in:
@@ -227,7 +227,6 @@ namespace Marro.PacManUdon
|
|||||||
|
|
||||||
AddScore(scoreBonus);
|
AddScore(scoreBonus);
|
||||||
StartTimeSequence(PacManTimeSequence.GhostCaught);
|
StartTimeSequence(PacManTimeSequence.GhostCaught);
|
||||||
pacMan.HideUntilUnfrozen();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PacManCaught()
|
public void PacManCaught()
|
||||||
|
|||||||
@@ -12,29 +12,40 @@ namespace Marro.PacManUdon
|
|||||||
Dead,
|
Dead,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum PacManState
|
||||||
|
{
|
||||||
|
Idle,
|
||||||
|
Normal,
|
||||||
|
PowerPellet,
|
||||||
|
Dead,
|
||||||
|
Big,
|
||||||
|
}
|
||||||
|
|
||||||
[RequireComponent(typeof(Animator))]
|
[RequireComponent(typeof(Animator))]
|
||||||
[RequireComponent(typeof(Renderer))]
|
[RequireComponent(typeof(Renderer))]
|
||||||
public class PacMan : GridMover
|
public class PacMan : GridMover
|
||||||
{
|
{
|
||||||
private PlayerInput input;
|
private PlayerInput input;
|
||||||
private CollisionManager collisionManager;
|
private CollisionManager collisionManager;
|
||||||
|
private Animator animator;
|
||||||
|
private new Renderer renderer;
|
||||||
|
|
||||||
|
private Vector2 startPosition;
|
||||||
private float defaultSpeed;
|
private float defaultSpeed;
|
||||||
private float powerPelletSpeed;
|
private float powerPelletSpeed;
|
||||||
|
|
||||||
|
private PacManState state;
|
||||||
|
|
||||||
private float speed;
|
private float speed;
|
||||||
private Vector2 startPosition;
|
private float freezeSeconds;
|
||||||
private Animator animator;
|
private bool frozen;
|
||||||
new Renderer renderer;
|
|
||||||
private bool hideUntilUnfrozen;
|
|
||||||
private bool dead;
|
|
||||||
private bool kinematic;
|
private bool kinematic;
|
||||||
|
|
||||||
private bool followingPredefinedPath;
|
private bool followingPredefinedPath;
|
||||||
private Direction[] predefinedPath;
|
private Direction[] predefinedPath;
|
||||||
private int predefinedPathIndex;
|
private int predefinedPathIndex;
|
||||||
|
|
||||||
private float freezeSeconds;
|
|
||||||
private bool frozen;
|
|
||||||
|
|
||||||
private readonly int animatorKeyState = Animator.StringToHash("State");
|
private readonly int animatorKeyState = Animator.StringToHash("State");
|
||||||
private readonly int animatorKeyDirection = Animator.StringToHash("Direction");
|
private readonly int animatorKeyDirection = Animator.StringToHash("Direction");
|
||||||
|
|
||||||
@@ -45,7 +56,6 @@ namespace Marro.PacManUdon
|
|||||||
animator = GetComponent<Animator>();
|
animator = GetComponent<Animator>();
|
||||||
renderer = GetComponent<Renderer>();
|
renderer = GetComponent<Renderer>();
|
||||||
frozen = false;
|
frozen = false;
|
||||||
hideUntilUnfrozen = false;
|
|
||||||
startPosition = startTransform.localPosition;
|
startPosition = startTransform.localPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,13 +64,13 @@ namespace Marro.PacManUdon
|
|||||||
SetPosition(startPosition);
|
SetPosition(startPosition);
|
||||||
direction = Direction.Left;
|
direction = Direction.Left;
|
||||||
targetDirection = Direction.Left;
|
targetDirection = Direction.Left;
|
||||||
speed = defaultSpeed;
|
|
||||||
kinematic = false;
|
kinematic = false;
|
||||||
followingPredefinedPath = false;
|
followingPredefinedPath = false;
|
||||||
|
|
||||||
SetDead(false);
|
state = PacManState.Idle;
|
||||||
|
|
||||||
SetAnimatorState((int)PacManAnimatorState.Idle);
|
UpdateSpeed();
|
||||||
|
UpdateAnimator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SyncedUpdate()
|
public override void SyncedUpdate()
|
||||||
@@ -72,12 +82,6 @@ namespace Marro.PacManUdon
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hideUntilUnfrozen)
|
|
||||||
{
|
|
||||||
hideUntilUnfrozen = false;
|
|
||||||
SetVisibility(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
float speed = this.speed;
|
float speed = this.speed;
|
||||||
if (freezeSeconds > 0)
|
if (freezeSeconds > 0)
|
||||||
{
|
{
|
||||||
@@ -220,11 +224,19 @@ namespace Marro.PacManUdon
|
|||||||
if (!gameObject.activeInHierarchy)
|
if (!gameObject.activeInHierarchy)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (dead)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
case PacManState.Dead:
|
||||||
SetAnimatorState((int)PacManAnimatorState.Dead);
|
SetAnimatorState((int)PacManAnimatorState.Dead);
|
||||||
animator.speed = 1;
|
animator.speed = 1;
|
||||||
return;
|
return;
|
||||||
|
case PacManState.Idle:
|
||||||
|
SetAnimatorState((int)PacManAnimatorState.Idle);
|
||||||
|
return;
|
||||||
|
case PacManState.Big:
|
||||||
|
SetAnimatorState((int)PacManAnimatorState.Big);
|
||||||
|
animator.speed = 1;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
animator.speed = frozen ? 0 : 1;
|
animator.speed = frozen ? 0 : 1;
|
||||||
@@ -251,22 +263,22 @@ namespace Marro.PacManUdon
|
|||||||
private void SetAnimatorState(int value) =>
|
private void SetAnimatorState(int value) =>
|
||||||
animator.SetFloat(animatorKeyState, value);
|
animator.SetFloat(animatorKeyState, value);
|
||||||
|
|
||||||
public void SetDead(bool dead)
|
public void Die()
|
||||||
{
|
{
|
||||||
this.dead = dead;
|
state = PacManState.Dead;
|
||||||
UpdateAnimator();
|
UpdateAnimator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetFrozen(bool frozen)
|
public void SetFrozen(bool frozen)
|
||||||
{
|
{
|
||||||
this.frozen = frozen;
|
this.frozen = frozen;
|
||||||
UpdateAnimator();
|
|
||||||
|
if (!frozen && state == PacManState.Idle)
|
||||||
|
{
|
||||||
|
state = PacManState.Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HideUntilUnfrozen()
|
UpdateAnimator();
|
||||||
{
|
|
||||||
hideUntilUnfrozen = true;
|
|
||||||
SetVisibility(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetLevel(int level)
|
public void SetLevel(int level)
|
||||||
@@ -278,7 +290,13 @@ namespace Marro.PacManUdon
|
|||||||
|
|
||||||
public void SetPowerPellet(bool powerPellet)
|
public void SetPowerPellet(bool powerPellet)
|
||||||
{
|
{
|
||||||
if (powerPellet)
|
state = powerPellet ? PacManState.PowerPellet : PacManState.Normal;
|
||||||
|
UpdateSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSpeed()
|
||||||
|
{
|
||||||
|
if (state == PacManState.PowerPellet)
|
||||||
{
|
{
|
||||||
speed = powerPelletSpeed;
|
speed = powerPelletSpeed;
|
||||||
}
|
}
|
||||||
@@ -312,12 +330,32 @@ namespace Marro.PacManUdon
|
|||||||
|
|
||||||
public void BecomeBig()
|
public void BecomeBig()
|
||||||
{
|
{
|
||||||
SetAnimatorState((int)PacManAnimatorState.Big);
|
state = PacManState.Big;
|
||||||
|
UpdateAnimator();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetVisibility(bool visible)
|
public void SetVisibility(bool visible)
|
||||||
{
|
{
|
||||||
renderer.enabled = visible;
|
renderer.enabled = visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void CollectSyncedData(byte[] data, ref int index, NetworkEventType eventType)
|
||||||
|
{
|
||||||
|
data.AppendAsByte((int)state, ref index);
|
||||||
|
data.Append(freezeSeconds, ref index);
|
||||||
|
data.Append(frozen, ref index);
|
||||||
|
|
||||||
|
base.CollectSyncedData(data, ref index, eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool WriteSyncedData(byte[] data, ref int index, NetworkEventType eventType)
|
||||||
|
{
|
||||||
|
state = (PacManState)data.ReadByte(ref index);
|
||||||
|
freezeSeconds = data.ReadFloat(ref index);
|
||||||
|
frozen = data.ReadBool(ref index);
|
||||||
|
UpdateSpeed();
|
||||||
|
|
||||||
|
return base.WriteSyncedData(data, ref index, eventType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,11 +279,17 @@ MonoBehaviour:
|
|||||||
Entry: 1
|
Entry: 1
|
||||||
Data: inputMethod
|
Data: inputMethod
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 6
|
Entry: 7
|
||||||
|
Data: 16|System.RuntimeType, mscorlib
|
||||||
|
- Name:
|
||||||
|
Entry: 1
|
||||||
|
Data: Marro.PacManUdon.InputMethod, Assembly-CSharp
|
||||||
|
- Name:
|
||||||
|
Entry: 8
|
||||||
Data:
|
Data:
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 16|System.RuntimeType, mscorlib
|
Data: 17|System.RuntimeType, mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: System.Int32, mscorlib
|
Data: System.Int32, mscorlib
|
||||||
@@ -304,7 +310,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 17|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 18|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -328,13 +334,13 @@ MonoBehaviour:
|
|||||||
Data: resultInput
|
Data: resultInput
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 18|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 19|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: resultInput
|
Data: resultInput
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 19|System.RuntimeType, mscorlib
|
Data: 20|System.RuntimeType, mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: Marro.PacManUdon.Direction, Assembly-CSharp
|
Data: Marro.PacManUdon.Direction, Assembly-CSharp
|
||||||
@@ -343,7 +349,7 @@ MonoBehaviour:
|
|||||||
Data:
|
Data:
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 16
|
Data: 17
|
||||||
- Name: <SyncMode>k__BackingField
|
- Name: <SyncMode>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
||||||
@@ -358,7 +364,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 20|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 21|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -382,16 +388,16 @@ MonoBehaviour:
|
|||||||
Data: inputHorizontal
|
Data: inputHorizontal
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 21|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 22|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: inputHorizontal
|
Data: inputHorizontal
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 19
|
Data: 20
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 16
|
Data: 17
|
||||||
- Name: <SyncMode>k__BackingField
|
- Name: <SyncMode>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
||||||
@@ -406,7 +412,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 22|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 23|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -430,16 +436,16 @@ MonoBehaviour:
|
|||||||
Data: inputVertical
|
Data: inputVertical
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 23|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 24|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: inputVertical
|
Data: inputVertical
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 19
|
Data: 20
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 16
|
Data: 17
|
||||||
- Name: <SyncMode>k__BackingField
|
- Name: <SyncMode>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
||||||
@@ -454,7 +460,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 24|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 25|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -478,13 +484,13 @@ MonoBehaviour:
|
|||||||
Data: horizontalValue
|
Data: horizontalValue
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 25|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 26|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: horizontalValue
|
Data: horizontalValue
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 26|System.RuntimeType, mscorlib
|
Data: 27|System.RuntimeType, mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: System.Single, mscorlib
|
Data: System.Single, mscorlib
|
||||||
@@ -493,7 +499,7 @@ MonoBehaviour:
|
|||||||
Data:
|
Data:
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 26
|
Data: 27
|
||||||
- Name: <SyncMode>k__BackingField
|
- Name: <SyncMode>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
||||||
@@ -508,7 +514,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 27|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 28|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -532,16 +538,16 @@ MonoBehaviour:
|
|||||||
Data: verticalValue
|
Data: verticalValue
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 28|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 29|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: verticalValue
|
Data: verticalValue
|
||||||
- Name: <UserType>k__BackingField
|
- Name: <UserType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 26
|
Data: 27
|
||||||
- Name: <SystemType>k__BackingField
|
- Name: <SystemType>k__BackingField
|
||||||
Entry: 9
|
Entry: 9
|
||||||
Data: 26
|
Data: 27
|
||||||
- Name: <SyncMode>k__BackingField
|
- Name: <SyncMode>k__BackingField
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
|
||||||
@@ -556,7 +562,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 29|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 30|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
@@ -580,7 +586,7 @@ MonoBehaviour:
|
|||||||
Data: horizontalPriority
|
Data: horizontalPriority
|
||||||
- Name: $v
|
- Name: $v
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 30|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
Data: 31|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
|
||||||
- Name: <Name>k__BackingField
|
- Name: <Name>k__BackingField
|
||||||
Entry: 1
|
Entry: 1
|
||||||
Data: horizontalPriority
|
Data: horizontalPriority
|
||||||
@@ -604,7 +610,7 @@ MonoBehaviour:
|
|||||||
Data: false
|
Data: false
|
||||||
- Name: _fieldAttributes
|
- Name: _fieldAttributes
|
||||||
Entry: 7
|
Entry: 7
|
||||||
Data: 31|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
Data: 32|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
|
||||||
- Name:
|
- Name:
|
||||||
Entry: 12
|
Entry: 12
|
||||||
Data: 0
|
Data: 0
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace Marro.PacManUdon
|
|||||||
case 1:
|
case 1:
|
||||||
// Hide ghosts, start pacman death animation
|
// Hide ghosts, start pacman death animation
|
||||||
SetGhostsActive(false);
|
SetGhostsActive(false);
|
||||||
pacMan.SetDead(true);
|
pacMan.Die();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// Start playing death sound
|
// Start playing death sound
|
||||||
|
|||||||
Reference in New Issue
Block a user