Dragon escape update
This commit is contained in:
parent
1fc446ae13
commit
ed804e3336
@ -288,28 +288,6 @@ public class GameTeam
|
||||
_spawnDistance = value;
|
||||
}
|
||||
|
||||
public void ReplaceReference(Player player)
|
||||
{
|
||||
Iterator<Player> playerIterator = _players.keySet().iterator();
|
||||
PlayerState state = null;
|
||||
|
||||
while (playerIterator.hasNext())
|
||||
{
|
||||
Player cur = playerIterator.next();
|
||||
|
||||
if (!cur.getName().equals(player.getName()))
|
||||
continue;
|
||||
|
||||
state = _players.get(cur);
|
||||
playerIterator.remove();
|
||||
}
|
||||
|
||||
if (state != null)
|
||||
{
|
||||
_players.put(player, state);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetVisible(boolean b)
|
||||
{
|
||||
_visible = b;
|
||||
|
@ -58,8 +58,8 @@ public class DragonEscape extends SoloGame
|
||||
new Kit[]
|
||||
{
|
||||
new KitLeaper(manager),
|
||||
new KitDisruptor(manager),
|
||||
new KitWarper(manager),
|
||||
new KitDisruptor(manager)
|
||||
},
|
||||
|
||||
new String[]
|
||||
@ -100,7 +100,7 @@ public class DragonEscape extends SoloGame
|
||||
}
|
||||
|
||||
//Ignore Close
|
||||
if (bestDist < 6 && WorldData.GetDataLocs("BLACK").size() > 1)
|
||||
if (bestDist < 3 && WorldData.GetDataLocs("BLACK").size() > 1)
|
||||
{
|
||||
System.out.println("Ignoring Node");
|
||||
WorldData.GetDataLocs("BLACK").remove(best);
|
||||
@ -202,7 +202,7 @@ public class DragonEscape extends SoloGame
|
||||
}
|
||||
|
||||
//Shortcut
|
||||
if (postNode - preNode >= 2)
|
||||
if (postNode - preNode >= 3)
|
||||
{
|
||||
if (!_warpTime.containsKey(score.Player) || UtilTime.elapsed(_warpTime.get(score.Player), 1000))
|
||||
{
|
||||
@ -215,10 +215,14 @@ public class DragonEscape extends SoloGame
|
||||
//Finish
|
||||
if (GetWaypointIndex(player.getLocation()) == _waypoints.size() - 1)
|
||||
{
|
||||
_winner = player;
|
||||
this.SetCustomWinLine(player.getName() + " reached the end of the course!");
|
||||
//Only if NEAR end.
|
||||
if (UtilMath.offset(player.getLocation(), _waypoints.get(_waypoints.size()-1)) < 3)
|
||||
{
|
||||
_winner = player;
|
||||
this.SetCustomWinLine(player.getName() + " reached the end of the course!");
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
score.Score = playerScore;
|
||||
|
@ -1,6 +1,7 @@
|
||||
package nautilus.game.arcade.game.games.dragonescape;
|
||||
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilWorld;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.EnderDragon;
|
||||
@ -39,9 +40,9 @@ public class DragonEscapeData
|
||||
Turn();
|
||||
|
||||
//Speed
|
||||
double speed = 0.2;
|
||||
double speed = 0.20;
|
||||
|
||||
speed += (System.currentTimeMillis() - Host.GetStateTime())/1000d * 0.001;
|
||||
//speed += (System.currentTimeMillis() - Host.GetStateTime())/1000d * 0.001;
|
||||
|
||||
//Speed Distance Boost
|
||||
/*
|
||||
@ -65,6 +66,8 @@ public class DragonEscapeData
|
||||
Location.setYaw(180 + UtilAlg.GetYaw(Velocity));
|
||||
|
||||
Dragon.teleport(Location);
|
||||
|
||||
System.out.println("Flying towards: " + UtilWorld.locToStrClean(Target));
|
||||
}
|
||||
|
||||
private void Turn()
|
||||
|
@ -17,7 +17,7 @@ public class KitDisruptor extends Kit
|
||||
{
|
||||
public KitDisruptor(ArcadeManager manager)
|
||||
{
|
||||
super(manager, "Disruptor", KitAvailability.Blue,
|
||||
super(manager, "Disruptor", KitAvailability.Green,
|
||||
|
||||
new String[]
|
||||
{
|
||||
@ -26,7 +26,7 @@ public class KitDisruptor extends Kit
|
||||
|
||||
new Perk[]
|
||||
{
|
||||
new PerkLeap("Leap", 1, 1, 8000, 2),
|
||||
new PerkLeap("Leap", 1, 1, 8000, 3),
|
||||
new PerkDisruptor(8, 2)
|
||||
},
|
||||
EntityType.ZOMBIE,
|
||||
|
@ -16,7 +16,7 @@ public class KitWarper extends Kit
|
||||
{
|
||||
public KitWarper(ArcadeManager manager)
|
||||
{
|
||||
super(manager, "Warper", KitAvailability.Green,
|
||||
super(manager, "Warper", KitAvailability.Blue,
|
||||
|
||||
new String[]
|
||||
{
|
||||
|
@ -17,6 +17,7 @@ import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Ghast;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Monster;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Skeleton.SkeletonType;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@ -31,6 +32,7 @@ import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
|
||||
import org.bukkit.event.inventory.PrepareItemCraftEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||||
import org.bukkit.event.player.PlayerKickEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
@ -85,12 +87,13 @@ public class UHC extends TeamGame
|
||||
private NautHashMap<String, Long> _deathTime = new NautHashMap<String, Long>();
|
||||
|
||||
private NautHashMap<String, Long> _rejoinTime = new NautHashMap<String, Long>();
|
||||
|
||||
private NautHashMap<String, GameTeam> _rejoinTeam = new NautHashMap<String, GameTeam>();
|
||||
|
||||
private NautHashMap<String, Long> _combatTime = new NautHashMap<String, Long>();
|
||||
|
||||
private int _gameMinutes = 0;
|
||||
private long _lastMinute = System.currentTimeMillis();
|
||||
|
||||
|
||||
private boolean _soloGame = false;
|
||||
|
||||
public UHC(ArcadeManager manager)
|
||||
@ -110,9 +113,9 @@ public class UHC extends TeamGame
|
||||
});
|
||||
|
||||
this.DamageTeamSelf = true;
|
||||
|
||||
|
||||
this.DeathDropItems = true;
|
||||
|
||||
|
||||
this.ItemDrop = true;
|
||||
this.ItemPickup = true;
|
||||
|
||||
@ -222,13 +225,10 @@ public class UHC extends TeamGame
|
||||
|
||||
WorldData.World.setTime(2000);
|
||||
|
||||
//Kill Mobs
|
||||
//Kill Evil Mobs
|
||||
for (Entity ent : WorldData.World.getEntities())
|
||||
{
|
||||
if (!(ent instanceof LivingEntity))
|
||||
continue;
|
||||
|
||||
if (ent instanceof Player)
|
||||
if (!(ent instanceof Monster))
|
||||
continue;
|
||||
|
||||
ent.remove();
|
||||
@ -245,25 +245,6 @@ public class UHC extends TeamGame
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void KillMobs(GameStateChangeEvent event)
|
||||
{
|
||||
if (event.GetState() != GameState.Live)
|
||||
return;
|
||||
|
||||
//Kill Mobs
|
||||
for (Entity ent : WorldData.World.getEntities())
|
||||
{
|
||||
if (!(ent instanceof LivingEntity))
|
||||
continue;
|
||||
|
||||
if (ent instanceof Player)
|
||||
continue;
|
||||
|
||||
ent.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void WorldBoundaryCheck(PlayerMoveEvent event)
|
||||
{
|
||||
@ -301,7 +282,7 @@ public class UHC extends TeamGame
|
||||
this.WorldData.MaxX = 1250;
|
||||
this.WorldData.MinZ = -1250;
|
||||
this.WorldData.MaxZ = 1250;
|
||||
|
||||
|
||||
for (int x=-79 ; x<=78 ; x++)
|
||||
{
|
||||
WorldBoundaryRed(WorldData.World.getChunkAt(x, 78));
|
||||
@ -320,7 +301,7 @@ public class UHC extends TeamGame
|
||||
this.WorldData.MaxX = 1000;
|
||||
this.WorldData.MinZ = -1000;
|
||||
this.WorldData.MaxZ = 1000;
|
||||
|
||||
|
||||
for (int x=-63 ; x<=62 ; x++)
|
||||
{
|
||||
WorldBoundaryRed(WorldData.World.getChunkAt(x, 62));
|
||||
@ -385,15 +366,15 @@ public class UHC extends TeamGame
|
||||
{
|
||||
team.SetColor(ChatColor.WHITE);
|
||||
team.SetName(i+"");
|
||||
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
_soloGame = true;
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (GameTeam team : GetTeamList())
|
||||
{
|
||||
if (team.GetColor() == ChatColor.RED) team.SetName("Red");
|
||||
@ -425,7 +406,7 @@ public class UHC extends TeamGame
|
||||
double dist = 250;
|
||||
if (_soloGame)
|
||||
dist = 200;
|
||||
|
||||
|
||||
//Ensure 250 Blocks between Teams
|
||||
while (true)
|
||||
{
|
||||
@ -599,11 +580,13 @@ public class UHC extends TeamGame
|
||||
GameTeam team = GetTeam(player);
|
||||
if (team == null) return;
|
||||
|
||||
if (team.GetColor() == ChatColor.DARK_GRAY)
|
||||
{
|
||||
team.RemovePlayer(player);
|
||||
if (!team.IsAlive(player))
|
||||
return;
|
||||
|
||||
team.RemovePlayer(player);
|
||||
|
||||
if (team.GetColor() == ChatColor.DARK_GRAY)
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.isDead())
|
||||
return;
|
||||
@ -614,17 +597,12 @@ public class UHC extends TeamGame
|
||||
Announce(team.GetColor() + C.Bold + player.getName() + " was killed for disconnecting during combat.");
|
||||
|
||||
player.damage(5000);
|
||||
team.SetPlayerState(player, PlayerState.OUT);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!team.IsAlive(player))
|
||||
{
|
||||
team.RemovePlayer(player);
|
||||
return;
|
||||
}
|
||||
|
||||
//Store
|
||||
_rejoinTime.put(player.getName(), System.currentTimeMillis());
|
||||
_rejoinTeam.put(player.getName(), team);
|
||||
GetLocationStore().put(player.getName(), player.getLocation());
|
||||
|
||||
//Announcement
|
||||
@ -713,55 +691,32 @@ public class UHC extends TeamGame
|
||||
rejoinIterator.remove();
|
||||
|
||||
//Get Team (By Name)
|
||||
GameTeam team = GetTeam(name, false);
|
||||
GameTeam team = _rejoinTeam.remove(name);
|
||||
if (team != null)
|
||||
{
|
||||
Announce(team.GetColor() + C.Bold + name + " did not reconnent in time!");
|
||||
team.SetPlayerState(team.GetPlayer(name), PlayerState.OUT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void PlayerLoginAllow(PlayerLoginEvent event)
|
||||
{
|
||||
if (!InProgress())
|
||||
return;
|
||||
|
||||
//Get Team and OldPlayer
|
||||
GameTeam team = null;
|
||||
Player oldPlayer = null;
|
||||
for (GameTeam curTeam : GetTeamList())
|
||||
//Rejoined
|
||||
GameTeam team = _rejoinTeam.remove(event.getPlayer().getName());
|
||||
if (team != null && _rejoinTime.remove(event.getPlayer().getName()) != null)
|
||||
{
|
||||
for (Player curPlayer : curTeam.GetPlayers(true))
|
||||
{
|
||||
if (curPlayer.getName().equals(event.getPlayer().getName()))
|
||||
{
|
||||
oldPlayer = curPlayer;
|
||||
team = curTeam;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldPlayer != null)
|
||||
break;
|
||||
}
|
||||
|
||||
if (team != null && oldPlayer != null)
|
||||
{
|
||||
team.ReplaceReference(event.getPlayer());
|
||||
|
||||
if (_rejoinTime.remove(oldPlayer.getName()) != null)
|
||||
{
|
||||
//Announcement
|
||||
Announce(team.GetColor() + C.Bold + event.getPlayer().getName() + " has reconnected!");
|
||||
return;
|
||||
}
|
||||
team.AddPlayer(event.getPlayer());
|
||||
Announce(team.GetColor() + C.Bold + event.getPlayer().getName() + " has reconnected!");
|
||||
return;
|
||||
}
|
||||
|
||||
//Owner Bypass
|
||||
if (Manager.GetClients().Get(event.getPlayer()).GetRank().Has(Rank.OWNER))
|
||||
return;
|
||||
|
||||
//Disallow
|
||||
event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.YELLOW + "You cannot join this UHC.");
|
||||
}
|
||||
@ -871,6 +826,13 @@ public class UHC extends TeamGame
|
||||
if (event.getRegainReason() == RegainReason.SATIATED)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void HeadPlaceCancel(BlockPlaceEvent event)
|
||||
{
|
||||
if (event.getItemInHand().getType() == Material.SKULL || event.getItemInHand().getType() == Material.SKULL_ITEM)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void ConsumeHeadApple(PlayerItemConsumeEvent event)
|
||||
@ -1091,19 +1053,19 @@ public class UHC extends TeamGame
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void clearCreeperExplode(EntityExplodeEvent event)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void clearCreeperExplodeReenable(EntityExplodeEvent event)
|
||||
{
|
||||
event.setCancelled(false);
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void SpecialCloak(UpdateEvent event)
|
||||
{
|
||||
@ -1122,23 +1084,6 @@ public class UHC extends TeamGame
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@EventHandler
|
||||
public void TabHealth(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.FAST)
|
||||
return;
|
||||
|
||||
if (!InProgress())
|
||||
return;
|
||||
|
||||
for (Player player : GetPlayers(true))
|
||||
{
|
||||
_listHealth.getScore(player).setScore((int)player.getHealth());
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
@EventHandler
|
||||
public void HungerHurt(UpdateEvent event)
|
||||
{
|
||||
@ -1218,43 +1163,12 @@ public class UHC extends TeamGame
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@EventHandler
|
||||
public void ScoreboardUpdate(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.FAST)
|
||||
return;
|
||||
/*
|
||||
for (GameTeam team : this.GetTeamList())
|
||||
{
|
||||
String name = team.GetColor() + team.GetName();
|
||||
if (name.length() > 16)
|
||||
name = name.substring(0, 16);
|
||||
|
||||
int health = 0;
|
||||
for (Player player : team.GetPlayers(true))
|
||||
{
|
||||
health += (int)player.getHealth();
|
||||
}
|
||||
|
||||
if (health <= 0)
|
||||
{
|
||||
GetScoreboard().resetScores(Bukkit.getOfflinePlayer(name));
|
||||
continue;
|
||||
}
|
||||
|
||||
Score score = GetObjectiveSide().getScore(Bukkit.getOfflinePlayer(name));
|
||||
score.setScore(health);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean CanJoinTeam(GameTeam team)
|
||||
{
|
||||
if (_soloGame)
|
||||
return (team.GetPlayers(true).isEmpty());
|
||||
|
||||
|
||||
return (team.GetPlayers(true).size() < 3);
|
||||
}
|
||||
|
||||
@ -1298,12 +1212,12 @@ public class UHC extends TeamGame
|
||||
UtilPlayer.message(player, C.cYellow+ C.Bold + this.GetName());
|
||||
UtilPlayer.message(player, "");
|
||||
UtilPlayer.message(player, "");
|
||||
|
||||
|
||||
if (team != null)
|
||||
{
|
||||
WinnerTeam = team;
|
||||
Winner = team.GetName() + " Team";
|
||||
|
||||
|
||||
if (_soloGame)
|
||||
UtilPlayer.message(player, team.GetColor() + C.Bold + team.GetPlayers(false).get(0).getName() + " won the match!");
|
||||
else
|
||||
@ -1353,22 +1267,16 @@ public class UHC extends TeamGame
|
||||
|
||||
ArrayList<GameTeam> teamsAlive = new ArrayList<GameTeam>();
|
||||
|
||||
//Online Teams
|
||||
for (GameTeam team : this.GetTeamList())
|
||||
if (team.GetColor() != ChatColor.DARK_GRAY)
|
||||
if (team.GetPlayers(true).size() > 0)
|
||||
teamsAlive.add(team);
|
||||
/*
|
||||
{
|
||||
for (Player player : team.GetPlayers(true))
|
||||
{
|
||||
if (player.isOnline())
|
||||
{
|
||||
teamsAlive.add(team);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
//Offline Player Team
|
||||
for (GameTeam team : _rejoinTeam.values())
|
||||
if (team.GetColor() != ChatColor.DARK_GRAY)
|
||||
teamsAlive.add(team);
|
||||
|
||||
if (teamsAlive.size() <= 1)
|
||||
{
|
||||
@ -1393,72 +1301,4 @@ public class UHC extends TeamGame
|
||||
SetState(GameState.End);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@EventHandler
|
||||
public void PlayersDisplay(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.SLOW)
|
||||
return;
|
||||
|
||||
for (GameTeam team : GetTeamList())
|
||||
{
|
||||
for (Player player : team.GetPlayers(false))
|
||||
{
|
||||
Announce(team.GetColor() + player.getName() + ": " + (IsAlive(player)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private NautHashMap<Entity, Long> _portalTime = new NautHashMap<Entity, Long>();
|
||||
private NautHashMap<Entity, Integer> _portalTick = new NautHashMap<Entity, Integer>();
|
||||
|
||||
@EventHandler
|
||||
public void NetherPortal(EntityPortalEnterEvent event)
|
||||
{
|
||||
_portalTime.put(event.getEntity(), System.currentTimeMillis());
|
||||
|
||||
int ticks = 1;
|
||||
if (_portalTick.containsKey(event.getEntity()))
|
||||
ticks += _portalTick.get(event.getEntity());
|
||||
|
||||
_portalTick.put(event.getEntity(), ticks);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void NetherUpdate(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.FASTER)
|
||||
return;
|
||||
|
||||
Iterator<Entity> netherIterator = _portalTime.keySet().iterator();
|
||||
|
||||
while (netherIterator.hasNext())
|
||||
{
|
||||
Entity ent = netherIterator.next();
|
||||
|
||||
//Left Portal
|
||||
if (UtilTime.elapsed(_portalTime.get(ent), 1000))
|
||||
{
|
||||
netherIterator.remove();
|
||||
_portalTick.remove(ent);
|
||||
continue;
|
||||
}
|
||||
|
||||
int ticks = _portalTick.get(ent);
|
||||
|
||||
if (ticks < 80)
|
||||
continue;
|
||||
|
||||
netherIterator.remove();
|
||||
_portalTick.remove(ent);
|
||||
|
||||
Vector vec = ent.getLocation().toVector().multiply(1d/16d);
|
||||
Block nether = vec.toLocation(UtilWorld.getWorldType(Environment.NETHER)).getBlock();
|
||||
|
||||
|
||||
//ent.teleport(nether, TeleportCause.NETHER_PORTAL);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
@ -6,6 +6,7 @@ import mineplex.core.common.Rank;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.F;
|
||||
import nautilus.game.arcade.ArcadeManager;
|
||||
import nautilus.game.arcade.GameType;
|
||||
import nautilus.game.arcade.game.GameTeam;
|
||||
import nautilus.game.arcade.game.Game.GameState;
|
||||
|
||||
@ -19,14 +20,14 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
public class GameChatManager implements Listener
|
||||
{
|
||||
ArcadeManager Manager;
|
||||
|
||||
|
||||
public GameChatManager(ArcadeManager manager)
|
||||
{
|
||||
Manager = manager;
|
||||
|
||||
|
||||
Manager.GetPluginManager().registerEvents(this, Manager.GetPlugin());
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void MeCancel(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
@ -42,7 +43,7 @@ public class GameChatManager implements Listener
|
||||
{
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
|
||||
|
||||
Player sender = event.getPlayer();
|
||||
|
||||
//Dead Prefix
|
||||
@ -89,7 +90,11 @@ public class GameChatManager implements Listener
|
||||
else
|
||||
{
|
||||
globalMessage = true;
|
||||
event.setFormat(dead + rankStr + team.GetColor() + "%1$s " + C.cWhite + "%2$s");
|
||||
|
||||
if (Manager.GetGame().GetType() == GameType.UHC && team.GetColor() == ChatColor.WHITE)
|
||||
event.setFormat(dead + rankStr + ChatColor.YELLOW + "%1$s " + C.cWhite + "%2$s");
|
||||
else
|
||||
event.setFormat(dead + rankStr + team.GetColor() + "%1$s " + C.cWhite + "%2$s");
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user