Added notifications for new objectives to scripted missions
Fixes #6692
This commit is contained in:
@@ -97,6 +97,16 @@ namespace OpenRA.Mods.RA.Scripting
|
|||||||
return mo.Objectives[id].Description;
|
return mo.Objectives[id].Description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ScriptActorPropertyActivity]
|
||||||
|
[Desc("Returns the type of an objective.")]
|
||||||
|
public string GetObjectiveType(int id)
|
||||||
|
{
|
||||||
|
if (id < 0 || id >= mo.Objectives.Count)
|
||||||
|
throw new LuaException("Objective ID is out of range.");
|
||||||
|
|
||||||
|
return mo.Objectives[id].Type == ObjectiveType.Primary ? "Primary" : "Secondary";
|
||||||
|
}
|
||||||
|
|
||||||
[ScriptActorPropertyActivity]
|
[ScriptActorPropertyActivity]
|
||||||
[Desc("Returns true if this player has lost all units/actors that have the MustBeDestroyed trait.")]
|
[Desc("Returns true if this player has lost all units/actors that have the MustBeDestroyed trait.")]
|
||||||
public bool HasNoRequiredUnits()
|
public bool HasNoRequiredUnits()
|
||||||
|
|||||||
@@ -44,10 +44,9 @@ WorldLoaded = function()
|
|||||||
player = Player.GetPlayer("GDI")
|
player = Player.GetPlayer("GDI")
|
||||||
enemy = Player.GetPlayer("Nod")
|
enemy = Player.GetPlayer("Nod")
|
||||||
|
|
||||||
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
gdiObjective2 = player.AddSecondaryObjective("Establish a beachhead")
|
end)
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -69,6 +68,10 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
|
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
|
gdiObjective2 = player.AddSecondaryObjective("Establish a beachhead")
|
||||||
|
|
||||||
Trigger.OnIdle(Gunboat, function() SetGunboatPath(Gunboat) end)
|
Trigger.OnIdle(Gunboat, function() SetGunboatPath(Gunboat) end)
|
||||||
|
|
||||||
SendNodPatrol()
|
SendNodPatrol()
|
||||||
|
|||||||
@@ -33,10 +33,9 @@ WorldLoaded = function()
|
|||||||
player = Player.GetPlayer("GDI")
|
player = Player.GetPlayer("GDI")
|
||||||
enemy = Player.GetPlayer("Nod")
|
enemy = Player.GetPlayer("Nod")
|
||||||
|
|
||||||
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
gdiObjective2 = player.AddSecondaryObjective("Capture the Tiberium Refinery")
|
end)
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -58,6 +57,10 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
|
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
|
gdiObjective2 = player.AddSecondaryObjective("Capture the Tiberium Refinery")
|
||||||
|
|
||||||
Trigger.OnCapture(NodRefinery, function() player.MarkCompletedObjective(gdiObjective2) end)
|
Trigger.OnCapture(NodRefinery, function() player.MarkCompletedObjective(gdiObjective2) end)
|
||||||
Trigger.OnKilled(NodRefinery, function() player.MarkFailedObjective(gdiObjective2) end)
|
Trigger.OnKilled(NodRefinery, function() player.MarkFailedObjective(gdiObjective2) end)
|
||||||
|
|
||||||
|
|||||||
@@ -65,10 +65,9 @@ WorldLoaded = function()
|
|||||||
player = Player.GetPlayer("GDI")
|
player = Player.GetPlayer("GDI")
|
||||||
nod = Player.GetPlayer("Nod")
|
nod = Player.GetPlayer("Nod")
|
||||||
|
|
||||||
nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
gdiObjective1 = player.AddPrimaryObjective("Defend the town of Białystok")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
end)
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -94,6 +93,10 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
|
gdiObjective1 = player.AddPrimaryObjective("Defend the town of Bialystok")
|
||||||
|
gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
|
|
||||||
Trigger.OnExitedFootprint(TownAttackTrigger, function(a, id)
|
Trigger.OnExitedFootprint(TownAttackTrigger, function(a, id)
|
||||||
if a.Owner == player then
|
if a.Owner == player then
|
||||||
Trigger.RemoveFootprintTrigger(id)
|
Trigger.RemoveFootprintTrigger(id)
|
||||||
|
|||||||
@@ -21,11 +21,9 @@ WorldLoaded = function()
|
|||||||
gdi = Player.GetPlayer("GDI")
|
gdi = Player.GetPlayer("GDI")
|
||||||
villagers = Player.GetPlayer("Villagers")
|
villagers = Player.GetPlayer("Villagers")
|
||||||
|
|
||||||
NodObjective1 = nod.AddPrimaryObjective("Kill Nikoomba")
|
Trigger.OnObjectiveAdded(nod, function(p, id)
|
||||||
NodObjective2 = nod.AddPrimaryObjective("Destroy the village")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
NodObjective3 = nod.AddSecondaryObjective("Destroy all GDI troops in the area")
|
end)
|
||||||
GDIObjective1 = gdi.AddPrimaryObjective("Eliminate all Nod forces")
|
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(nod, function(p, id)
|
Trigger.OnObjectiveCompleted(nod, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -44,6 +42,11 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
NodObjective1 = nod.AddPrimaryObjective("Kill Nikoomba")
|
||||||
|
NodObjective2 = nod.AddPrimaryObjective("Destroy the village")
|
||||||
|
NodObjective3 = nod.AddSecondaryObjective("Destroy all GDI troops in the area")
|
||||||
|
GDIObjective1 = gdi.AddPrimaryObjective("Eliminate all Nod forces")
|
||||||
|
|
||||||
Trigger.OnKilled(Nikoomba, function()
|
Trigger.OnKilled(Nikoomba, function()
|
||||||
nod.MarkCompletedObjective(NodObjective1)
|
nod.MarkCompletedObjective(NodObjective1)
|
||||||
Trigger.AfterDelay(Utils.Seconds(1), function()
|
Trigger.AfterDelay(Utils.Seconds(1), function()
|
||||||
|
|||||||
@@ -19,15 +19,9 @@ WorldLoaded = function()
|
|||||||
player = Player.GetPlayer("Nod")
|
player = Player.GetPlayer("Nod")
|
||||||
enemy = Player.GetPlayer("GDI")
|
enemy = Player.GetPlayer("GDI")
|
||||||
|
|
||||||
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
end)
|
||||||
|
|
||||||
InsertNodUnits()
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(20), function() SendAttackWave(FirstAttackWave, AttackWaveSpawnA.Location) end)
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(50), function() SendAttackWave(SecondThirdAttackWave, AttackWaveSpawnB.Location) end)
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(100), function() SendAttackWave(SecondThirdAttackWave, AttackWaveSpawnC.Location) end)
|
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -35,16 +29,6 @@ WorldLoaded = function()
|
|||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnCapture(TechCenter, function()
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(2), function()
|
|
||||||
player.MarkCompletedObjective(nodObjective1)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnKilled(TechCenter, function()
|
|
||||||
player.MarkFailedObjective(nodObjective1)
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(Utils.Seconds(1), function()
|
Trigger.AfterDelay(Utils.Seconds(1), function()
|
||||||
@@ -59,6 +43,25 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
|
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
||||||
|
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
||||||
|
|
||||||
|
Trigger.OnCapture(TechCenter, function()
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(2), function()
|
||||||
|
player.MarkCompletedObjective(nodObjective1)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnKilled(TechCenter, function()
|
||||||
|
player.MarkFailedObjective(nodObjective1)
|
||||||
|
end)
|
||||||
|
|
||||||
|
InsertNodUnits()
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(20), function() SendAttackWave(FirstAttackWave, AttackWaveSpawnA.Location) end)
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(50), function() SendAttackWave(SecondThirdAttackWave, AttackWaveSpawnB.Location) end)
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(100), function() SendAttackWave(SecondThirdAttackWave, AttackWaveSpawnC.Location) end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("nod3.vqa")
|
Media.PlayMovieFullscreen("nod3.vqa")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -35,11 +35,9 @@ WorldLoaded = function()
|
|||||||
player = Player.GetPlayer("Nod")
|
player = Player.GetPlayer("Nod")
|
||||||
enemy = Player.GetPlayer("GDI")
|
enemy = Player.GetPlayer("GDI")
|
||||||
|
|
||||||
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
end)
|
||||||
|
|
||||||
InsertNodUnits()
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -47,17 +45,6 @@ WorldLoaded = function()
|
|||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(40), function() SendAttackWave(FirstAttackWaveUnits, FirstAttackWave) end)
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(80), function() SendAttackWave(SecondAttackWaveUnits, SecondAttackWave) end)
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(140), function() SendAttackWave(ThirdAttackWaveUnits, FirstAttackWave) end)
|
|
||||||
|
|
||||||
Trigger.OnKilled(TechCenter, function() player.MarkFailedObjective(nodObjective1) end)
|
|
||||||
Trigger.OnCapture(TechCenter, function()
|
|
||||||
Trigger.AfterDelay(Utils.Seconds(2), function()
|
|
||||||
player.MarkCompletedObjective(nodObjective1)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(Utils.Seconds(1), function()
|
Trigger.AfterDelay(Utils.Seconds(1), function()
|
||||||
@@ -72,6 +59,22 @@ WorldLoaded = function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
|
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
||||||
|
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
||||||
|
|
||||||
|
Trigger.OnKilled(TechCenter, function() player.MarkFailedObjective(nodObjective1) end)
|
||||||
|
Trigger.OnCapture(TechCenter, function()
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(2), function()
|
||||||
|
player.MarkCompletedObjective(nodObjective1)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
InsertNodUnits()
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(40), function() SendAttackWave(FirstAttackWaveUnits, FirstAttackWave) end)
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(80), function() SendAttackWave(SecondAttackWaveUnits, SecondAttackWave) end)
|
||||||
|
Trigger.AfterDelay(Utils.Seconds(140), function() SendAttackWave(ThirdAttackWaveUnits, FirstAttackWave) end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("nod3.vqa")
|
Media.PlayMovieFullscreen("nod3.vqa")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -162,12 +162,9 @@ WorldLoaded = function()
|
|||||||
england = Player.GetPlayer("England")
|
england = Player.GetPlayer("England")
|
||||||
ussr = Player.GetPlayer("USSR")
|
ussr = Player.GetPlayer("USSR")
|
||||||
|
|
||||||
FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.")
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
SurviveObjective = player.AddPrimaryObjective("Tanya and Einstein must survive.")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
england.AddPrimaryObjective("Destroy the soviet base after a successful rescue.")
|
end)
|
||||||
CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.")
|
|
||||||
DefendObjective = ussr.AddPrimaryObjective("Kill Tanya and keep Einstein hostage.")
|
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
end)
|
end)
|
||||||
@@ -178,6 +175,12 @@ WorldLoaded = function()
|
|||||||
Trigger.OnPlayerLost(player, MissionFailed)
|
Trigger.OnPlayerLost(player, MissionFailed)
|
||||||
Trigger.OnPlayerWon(player, MissionAccomplished)
|
Trigger.OnPlayerWon(player, MissionAccomplished)
|
||||||
|
|
||||||
|
FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.")
|
||||||
|
SurviveObjective = player.AddPrimaryObjective("Tanya and Einstein must survive.")
|
||||||
|
england.AddPrimaryObjective("Destroy the soviet base after a successful rescue.")
|
||||||
|
CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.")
|
||||||
|
DefendObjective = ussr.AddPrimaryObjective("Kill Tanya and keep Einstein hostage.")
|
||||||
|
|
||||||
Trigger.OnKilled(Lab, LabDestroyed)
|
Trigger.OnKilled(Lab, LabDestroyed)
|
||||||
Trigger.OnKilled(OilPump, OilPumpDestroyed)
|
Trigger.OnKilled(OilPump, OilPumpDestroyed)
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,18 @@ WorldLoaded = function()
|
|||||||
ussr = Player.GetPlayer("USSR")
|
ussr = Player.GetPlayer("USSR")
|
||||||
ukraine = Player.GetPlayer("Ukraine")
|
ukraine = Player.GetPlayer("Ukraine")
|
||||||
|
|
||||||
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
|
end)
|
||||||
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
|
end)
|
||||||
|
Trigger.OnObjectiveFailed(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
|
end)
|
||||||
|
Trigger.OnPlayerLost(player, MissionFailed)
|
||||||
|
Trigger.OnPlayerWon(player, MissionAccomplished)
|
||||||
|
|
||||||
ConquestObjective = player.AddPrimaryObjective("Secure the area.")
|
ConquestObjective = player.AddPrimaryObjective("Secure the area.")
|
||||||
ussr.AddPrimaryObjective("Defend your base.")
|
ussr.AddPrimaryObjective("Defend your base.")
|
||||||
ukraine.AddPrimaryObjective("Destroy the convoy.")
|
ukraine.AddPrimaryObjective("Destroy the convoy.")
|
||||||
@@ -109,16 +121,6 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.AfterDelay(Utils.Minutes(10), SendTrucks)
|
Trigger.AfterDelay(Utils.Minutes(10), SendTrucks)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, MissionFailed)
|
|
||||||
Trigger.OnPlayerWon(player, MissionAccomplished)
|
|
||||||
|
|
||||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
|
||||||
end)
|
|
||||||
Trigger.OnObjectiveFailed(player, function(p, id)
|
|
||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
|
||||||
end)
|
|
||||||
|
|
||||||
Camera.Position = ReinforcementsEntryPoint.CenterPosition
|
Camera.Position = ReinforcementsEntryPoint.CenterPosition
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("ally2.vqa", function() Media.PlayMovieFullscreen("mcv.vqa") end)
|
Media.PlayMovieFullscreen("ally2.vqa", function() Media.PlayMovieFullscreen("mcv.vqa") end)
|
||||||
|
|||||||
Reference in New Issue
Block a user