mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-22 12:05:51 -04:00
Merge fix
This commit is contained in:
commit
f62fefc977
@ -80,7 +80,7 @@ namespace MCGalaxy.Commands {
|
|||||||
Player[] players = PlayerInfo.Online.Items;
|
Player[] players = PlayerInfo.Online.Items;
|
||||||
foreach (Player pl in players) {
|
foreach (Player pl in players) {
|
||||||
if (pl.level == p.level && pl.name != p.name)
|
if (pl.level == p.level && pl.name != p.name)
|
||||||
PlayerActions.ChangeMap(pl, Server.mainLevel.name);
|
PlayerActions.ChangeMap(pl, Server.mainLevel);
|
||||||
}
|
}
|
||||||
} else if (cmd == "KICK") {
|
} else if (cmd == "KICK") {
|
||||||
if (arg == "") { p.SendMessage("You must specify a player to kick."); return; }
|
if (arg == "") { p.SendMessage("You must specify a player to kick."); return; }
|
||||||
@ -88,7 +88,7 @@ namespace MCGalaxy.Commands {
|
|||||||
Player pl = PlayerInfo.FindMatches(p, arg);
|
Player pl = PlayerInfo.FindMatches(p, arg);
|
||||||
if (pl != null) {
|
if (pl != null) {
|
||||||
if (pl.level.name == p.level.name)
|
if (pl.level.name == p.level.name)
|
||||||
PlayerActions.ChangeMap(pl, Server.mainLevel.name);
|
PlayerActions.ChangeMap(pl, Server.mainLevel);
|
||||||
else
|
else
|
||||||
p.SendMessage("Player is not on your level!");
|
p.SendMessage("Player is not on your level!");
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ namespace MCGalaxy.Commands {
|
|||||||
}
|
}
|
||||||
Player.Message(p, blocked.name + " has been blacklisted from your map.");
|
Player.Message(p, blocked.name + " has been blacklisted from your map.");
|
||||||
if (blocked.level.name == p.level.name) {
|
if (blocked.level.name == p.level.name) {
|
||||||
PlayerActions.ChangeMap(blocked, Server.mainLevel.name); return;
|
PlayerActions.ChangeMap(blocked, Server.mainLevel); return;
|
||||||
}
|
}
|
||||||
} else if (cmd == "UNBLOCK") {
|
} else if (cmd == "UNBLOCK") {
|
||||||
if (value == "") {
|
if (value == "") {
|
||||||
|
@ -74,10 +74,12 @@ namespace MCGalaxy.Commands {
|
|||||||
}
|
}
|
||||||
Player.Message(p, " BlockDB (Used for /b) is {0}", data.blockDB ? "&aEnabled" : "&cDisabled");
|
Player.Message(p, " BlockDB (Used for /b) is {0}", data.blockDB ? "&aEnabled" : "&cDisabled");
|
||||||
ShowPermissions(p, data);
|
ShowPermissions(p, data);
|
||||||
Player.Message(p, "Use %T/mi env {0} %Sto see environment settings.", data.Name);
|
Player.Message(p, "Use %T/mi env {0} %Sto see environment settings.", data.Name);
|
||||||
|
if (!Server.zombie.IsZombieMap(data.Name)) return;
|
||||||
|
|
||||||
if (!Server.zombie.IsZombieMap(data.Name)) return;
|
string[] authors = data.Authors.Replace(" ", "").Split(',');
|
||||||
Player.Message(p, "Map authors: " + data.Authors);
|
Player.Message(p, "Map authors: {0}",
|
||||||
|
authors.Join(n => PlayerInfo.GetColoredName(p, n)));
|
||||||
int winChance = data.TotalRounds == 0 ? 100 : (data.HumanRounds * 100) / data.TotalRounds;
|
int winChance = data.TotalRounds == 0 ? 100 : (data.HumanRounds * 100) / data.TotalRounds;
|
||||||
Player.Message(p, "&a{0} %Srounds played total, &a{1}% %Swin chance for humans.",
|
Player.Message(p, "&a{0} %Srounds played total, &a{1}% %Swin chance for humans.",
|
||||||
data.TotalRounds, winChance);
|
data.TotalRounds, winChance);
|
||||||
|
@ -65,7 +65,7 @@ namespace MCGalaxy.Commands {
|
|||||||
if (who.muted) mute.Use(p, message);
|
if (who.muted) mute.Use(p, message);
|
||||||
if (who.frozen) freeze.Use(p, message);
|
if (who.frozen) freeze.Use(p, message);
|
||||||
|
|
||||||
PlayerActions.ChangeMap(who, Server.mainLevel.name);
|
PlayerActions.ChangeMap(who, Server.mainLevel);
|
||||||
who.BlockUntilLoad(10);
|
who.BlockUntilLoad(10);
|
||||||
|
|
||||||
jail.Use(p, message);
|
jail.Use(p, message);
|
||||||
|
@ -16,9 +16,6 @@
|
|||||||
permissions and limitations under the Licenses.
|
permissions and limitations under the Licenses.
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using MCGalaxy.Games;
|
|
||||||
|
|
||||||
namespace MCGalaxy.Commands.World {
|
namespace MCGalaxy.Commands.World {
|
||||||
public sealed class CmdGoto : Command {
|
public sealed class CmdGoto : Command {
|
||||||
@ -34,113 +31,13 @@ namespace MCGalaxy.Commands.World {
|
|||||||
|
|
||||||
public override void Use(Player p, string message) {
|
public override void Use(Player p, string message) {
|
||||||
if (p == null) { MessageInGameOnly(p); return; }
|
if (p == null) { MessageInGameOnly(p); return; }
|
||||||
if (message == "") { Help(p); return; }
|
if (message == "") { Help(p); return; }
|
||||||
if (p.usingGoto) { Player.Message(p, "Cannot use /goto, already loading a map."); return; }
|
if (!Formatter.ValidName(p, message, "level")) return;
|
||||||
|
PlayerActions.ChangeMap(p, message);
|
||||||
Level oldLevel = p.level;
|
|
||||||
p.usingGoto = true;
|
|
||||||
bool didJoin = false;
|
|
||||||
try {
|
|
||||||
didJoin = HandleGoto(p, message);
|
|
||||||
} finally {
|
|
||||||
p.usingGoto = false;
|
|
||||||
GC.Collect();
|
|
||||||
GC.WaitForPendingFinalizers();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!didJoin) return;
|
|
||||||
bool unloadOld = true;
|
|
||||||
if (oldLevel.unload && !oldLevel.IsMuseum) {
|
|
||||||
Player[] players = PlayerInfo.Online.Items;
|
|
||||||
foreach (Player pl in players)
|
|
||||||
if (pl.level == oldLevel) { unloadOld = false; break; }
|
|
||||||
if (unloadOld && Server.AutoLoad) oldLevel.Unload(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HandleGoto(Player p, string message) {
|
|
||||||
Level lvl = LevelInfo.FindExact(message);
|
|
||||||
if (lvl != null) {
|
|
||||||
return GoToLevel(p, lvl, message);
|
|
||||||
} else if (Server.AutoLoad) {
|
|
||||||
// First try exactly matching unloaded levels
|
|
||||||
if (LevelInfo.ExistsOffline(message))
|
|
||||||
return GotoOfflineLevel(p, message);
|
|
||||||
lvl = LevelInfo.Find(message);
|
|
||||||
if (lvl != null) return GoToLevel(p, lvl, message);
|
|
||||||
|
|
||||||
string map = LevelInfo.FindMapMatches(p, message);
|
|
||||||
if (map == null) return false;
|
|
||||||
return GotoOfflineLevel(p, map);
|
|
||||||
} else {
|
|
||||||
lvl = LevelInfo.Find(message);
|
|
||||||
if (lvl == null) {
|
|
||||||
Player.Message(p, "There is no level \"{0}\" loaded. Did you mean..", message);
|
|
||||||
Command.all.Find("search").Use(p, "levels " + message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return GoToLevel(p, lvl, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool GotoOfflineLevel(Player p, string message) {
|
|
||||||
if (Level.CheckLoadOnGoto(message)) {
|
|
||||||
CmdLoad.LoadLevel(p, message, "0", true);
|
|
||||||
Level lvl = LevelInfo.Find(message);
|
|
||||||
if (lvl != null) {
|
|
||||||
return GoToLevel(p, lvl, message);
|
|
||||||
} else {
|
|
||||||
Player.Message(p, "Level \"{0}\" failed to be auto-loaded.", message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Player.Message(p, "Level \"{0}\" cannot be loaded using /goto.", message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool GoToLevel(Player p, Level lvl, string message) {
|
|
||||||
if (p.level == lvl) { Player.Message(p, "You are already in \"" + lvl.name + "\"."); return false; }
|
|
||||||
if (!lvl.CanJoin(p)) return false;
|
|
||||||
if (!Server.zombie.PlayerCanJoinLevel(p, lvl, p.level)) return false;
|
|
||||||
|
|
||||||
p.Loading = true;
|
|
||||||
Entities.DespawnEntities(p);
|
|
||||||
Level oldLevel = p.level;
|
|
||||||
p.level = lvl; p.SendUserMOTD(); p.SendMap(oldLevel);
|
|
||||||
|
|
||||||
ushort x = (ushort)(lvl.spawnx * 32 + 16);
|
|
||||||
ushort y = (ushort)(lvl.spawny * 32 + 32);
|
|
||||||
ushort z = (ushort)(lvl.spawnz * 32 + 16);
|
|
||||||
Entities.SpawnEntities(p, x, y, z, lvl.rotx, lvl.roty);
|
|
||||||
p.Loading = false;
|
|
||||||
CheckGamesJoin(p, oldLevel);
|
|
||||||
p.prevMsg = "";
|
|
||||||
|
|
||||||
if (!p.hidden && p.level.ShouldShowJoinMessage(oldLevel)) {
|
|
||||||
Player.SendChatFrom(p, p.color + "*" + p.DisplayName + " %Swent to &b" + lvl.name, false);
|
|
||||||
Player.RaisePlayerAction(p, PlayerAction.JoinWorld, lvl.name);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void CheckGamesJoin(Player p, Level oldLvl) {
|
|
||||||
Server.lava.PlayerJoinedLevel(p, p.level, oldLvl);
|
|
||||||
Server.zombie.PlayerJoinedLevel(p, p.level, oldLvl);
|
|
||||||
|
|
||||||
if (p.inTNTwarsMap) p.canBuild = true;
|
|
||||||
TntWarsGame game = TntWarsGame.Find(p.level);
|
|
||||||
if (game == null) return;
|
|
||||||
|
|
||||||
if (game.GameStatus != TntWarsGame.TntWarsGameStatus.Finished &&
|
|
||||||
game.GameStatus != TntWarsGame.TntWarsGameStatus.WaitingForPlayers) {
|
|
||||||
p.canBuild = false;
|
|
||||||
Player.Message(p, "TNT Wars: Disabled your building because you are in a TNT Wars map!");
|
|
||||||
}
|
|
||||||
p.inTNTwarsMap = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/goto <mapname>");
|
Player.Message(p, "%T/goto [map name]");
|
||||||
Player.Message(p, "%HTeleports yourself to a different level.");
|
Player.Message(p, "%HTeleports yourself to a different level.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ namespace MCGalaxy.Commands {
|
|||||||
}
|
}
|
||||||
if (p != null && who.level != p.level) {
|
if (p != null && who.level != p.level) {
|
||||||
Player.Message(p, "Moving player to your map...");
|
Player.Message(p, "Moving player to your map...");
|
||||||
PlayerActions.ChangeMap(who, p.level.name);
|
PlayerActions.ChangeMap(who, p.level);
|
||||||
who.BlockUntilLoad(500);
|
who.BlockUntilLoad(500);
|
||||||
}
|
}
|
||||||
Chat.MessageAll("{0} %Shas been locked down!", who.ColoredName);
|
Chat.MessageAll("{0} %Shas been locked down!", who.ColoredName);
|
||||||
|
@ -33,7 +33,7 @@ namespace MCGalaxy.Commands.World {
|
|||||||
if (p.level.name == Server.mainLevel.name) {
|
if (p.level.name == Server.mainLevel.name) {
|
||||||
Player.Message(p, "You are already on the server's main level."); return;
|
Player.Message(p, "You are already on the server's main level."); return;
|
||||||
}
|
}
|
||||||
PlayerActions.ChangeMap(p, Server.mainLevel.name);
|
PlayerActions.ChangeMap(p, Server.mainLevel);
|
||||||
} else {
|
} else {
|
||||||
if (!CheckExtraPerm(p)) { MessageNeedExtra(p, "change the main level"); return; }
|
if (!CheckExtraPerm(p)) { MessageNeedExtra(p, "change the main level"); return; }
|
||||||
if (!Formatter.ValidName(p, message, "level")) return;
|
if (!Formatter.ValidName(p, message, "level")) return;
|
||||||
|
@ -74,7 +74,7 @@ namespace MCGalaxy.Commands.World {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/museum <map> <restore>");
|
Player.Message(p, "%T/museum [map] [restore]");
|
||||||
Player.Message(p, "%HAllows you to access a restore of the map entered. Works on unloaded maps");
|
Player.Message(p, "%HAllows you to access a restore of the map entered. Works on unloaded maps");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ namespace MCGalaxy.Commands {
|
|||||||
|
|
||||||
if (p.level != who.level) {
|
if (p.level != who.level) {
|
||||||
Player.Message(p, who.ColoredName + " %Sis in a different Level. Forcefetching has started!");
|
Player.Message(p, who.ColoredName + " %Sis in a different Level. Forcefetching has started!");
|
||||||
PlayerActions.ChangeMap(who, p.level.name);
|
PlayerActions.ChangeMap(who, p.level);
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
// Sleep for a bit while they load
|
// Sleep for a bit while they load
|
||||||
}
|
}
|
||||||
|
@ -85,8 +85,7 @@ namespace MCGalaxy.Commands {
|
|||||||
sender.currentTpa = "";
|
sender.currentTpa = "";
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
if (p.level != sender.level) {
|
if (p.level != sender.level) {
|
||||||
Level where = p.level;
|
PlayerActions.ChangeMap(sender, p.level);
|
||||||
PlayerActions.ChangeMap(sender, where.name);
|
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,9 +297,9 @@ namespace MCGalaxy.Games
|
|||||||
if (pl.level == oldMap)
|
if (pl.level == oldMap)
|
||||||
{
|
{
|
||||||
if (sendAfkMain && pl.IsAfk)
|
if (sendAfkMain && pl.IsAfk)
|
||||||
PlayerActions.ChangeMap(pl, Server.mainLevel.name);
|
PlayerActions.ChangeMap(pl, Server.mainLevel);
|
||||||
else
|
else
|
||||||
PlayerActions.ChangeMap(pl, map.name);
|
PlayerActions.ChangeMap(pl, map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OnMapChange != null)
|
if (OnMapChange != null)
|
||||||
|
@ -157,7 +157,7 @@ namespace MCGalaxy.Games
|
|||||||
{
|
{
|
||||||
foreach (player p in Players.Where(p => p.p.level != lvl))
|
foreach (player p in Players.Where(p => p.p.level != lvl))
|
||||||
{
|
{
|
||||||
PlayerActions.ChangeMap(p.p, lvl.name);
|
PlayerActions.ChangeMap(p.p, lvl);
|
||||||
p.p.inTNTwarsMap = true;
|
p.p.inTNTwarsMap = true;
|
||||||
}
|
}
|
||||||
if (GameMode == TntWarsGameMode.TDM) { Command.all.Find("reveal").Use(null, "all " + lvl.name); }//So peoples names apear above their heads in the right color!
|
if (GameMode == TntWarsGameMode.TDM) { Command.all.Find("reveal").Use(null, "all " + lvl.name); }//So peoples names apear above their heads in the right color!
|
||||||
|
@ -83,10 +83,14 @@ namespace MCGalaxy.Games {
|
|||||||
if (Server.votingforlevel && HandleVote(p, message)) return true;
|
if (Server.votingforlevel && HandleVote(p, message)) return true;
|
||||||
|
|
||||||
if (message[0] == '~' && message.Length > 1) {
|
if (message[0] == '~' && message.Length > 1) {
|
||||||
Player[] players = p.Game.Infected ? Infected.Items : Alive.Items;
|
Player[] players = PlayerInfo.Online.Items;
|
||||||
string type = p.Game.Infected ? " &cto zombies%S: " : " &ato humans%S: ";
|
string type = p.Game.Infected ? " &cto zombies%S: " : " &ato humans%S: ";
|
||||||
foreach (Player pl in players)
|
|
||||||
pl.SendMessage(p.ColoredName + type + message.Substring(1));
|
foreach (Player pl in players) {
|
||||||
|
if (!pl.level.name.CaselessEq(CurLevelName)) continue;
|
||||||
|
if (pl.Game.Referee || pl.Game.Infected == p.Game.Infected)
|
||||||
|
pl.SendMessage(p.ColoredName + type + message.Substring(1));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (message[0] == '`' && message.Length > 1) {
|
} else if (message[0] == '`' && message.Length > 1) {
|
||||||
if (p.Game.Team == null) {
|
if (p.Game.Team == null) {
|
||||||
@ -142,8 +146,11 @@ namespace MCGalaxy.Games {
|
|||||||
"%SPillaring " + (CurLevel.Pillaring ? "&aYes" : "&cNo") +
|
"%SPillaring " + (CurLevel.Pillaring ? "&aYes" : "&cNo") +
|
||||||
"%S, Type is &a" + CurLevel.BuildType);
|
"%S, Type is &a" + CurLevel.BuildType);
|
||||||
|
|
||||||
if (CurLevel.Authors != "")
|
if (CurLevel.Authors != "") {
|
||||||
p.SendMessage("It was created by " + CurLevel.Authors);
|
string[] authors = CurLevel.Authors.Replace(" ", "").Split(',');
|
||||||
|
Player.Message(p, "It was created by {0}",
|
||||||
|
authors.Join(n => PlayerInfo.GetColoredName(p, n)));
|
||||||
|
}
|
||||||
PlayerMoneyChanged(p);
|
PlayerMoneyChanged(p);
|
||||||
UpdatePlayerStatus(p);
|
UpdatePlayerStatus(p);
|
||||||
|
|
||||||
|
@ -230,9 +230,11 @@ namespace MCGalaxy {
|
|||||||
BuildAccess.CheckDetailed(p, false);
|
BuildAccess.CheckDetailed(p, false);
|
||||||
p.ZoneSpam = DateTime.UtcNow.AddSeconds(2);
|
p.ZoneSpam = DateTime.UtcNow.AddSeconds(2);
|
||||||
}
|
}
|
||||||
|
if (p.level == this) return p.AllowBuild;
|
||||||
return p.level == this
|
|
||||||
? p.AllowBuild : BuildAccess.Check(p, false);
|
LevelAccessResult access = BuildAccess.Check(p, false);
|
||||||
|
return access == LevelAccessResult.Whitelisted
|
||||||
|
|| access == LevelAccessResult.Allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CheckAffectPermissions(Player p, ushort x, ushort y, ushort z,
|
public bool CheckAffectPermissions(Player p, ushort x, ushort y, ushort z,
|
||||||
|
@ -208,7 +208,7 @@ namespace MCGalaxy {
|
|||||||
foreach (Player p in players) {
|
foreach (Player p in players) {
|
||||||
if (p.level == this) {
|
if (p.level == this) {
|
||||||
Player.Message(p, "You were moved to the main level as " + name + " was unloaded.");
|
Player.Message(p, "You were moved to the main level as " + name + " was unloaded.");
|
||||||
PlayerActions.ChangeMap(p, Server.mainLevel.name);
|
PlayerActions.ChangeMap(p, Server.mainLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,15 +62,21 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary> Returns whether the given player is allowed by these access permissions. </summary>
|
/// <summary> Returns the allowed state for the given player. </summary>
|
||||||
public bool Check(Player p, bool ignoreRankPerm = false) {
|
public LevelAccessResult Check(Player p, bool ignoreRankPerm = false) {
|
||||||
if (Blacklisted.CaselessContains(p.name)) return false;
|
if (Blacklisted.CaselessContains(p.name))
|
||||||
if (Whitelisted.CaselessContains(p.name) || ignoreRankPerm) return true;
|
return LevelAccessResult.Blacklisted;
|
||||||
|
if (Whitelisted.CaselessContains(p.name))
|
||||||
|
return LevelAccessResult.Whitelisted;
|
||||||
|
if (ignoreRankPerm)
|
||||||
|
return LevelAccessResult.Allowed;
|
||||||
|
|
||||||
if (p.Rank < Min) return false;
|
if (p.Rank < Min)
|
||||||
|
return LevelAccessResult.BelowMinRank;
|
||||||
string maxCmd = IsVisit ? "pervisitmax" : "perbuildmax";
|
string maxCmd = IsVisit ? "pervisitmax" : "perbuildmax";
|
||||||
if (p.Rank > Max && !p.group.CanExecute(maxCmd)) return false;
|
if (p.Rank > Max && !p.group.CanExecute(maxCmd))
|
||||||
return true;
|
return LevelAccessResult.AboveMaxRank;
|
||||||
|
return LevelAccessResult.Allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Returns whether the given player is allowed for these access permissions. </summary>
|
/// <summary> Returns whether the given player is allowed for these access permissions. </summary>
|
||||||
@ -134,7 +140,7 @@ namespace MCGalaxy {
|
|||||||
bool CheckRank(Player p, LevelPermission perm, string target, bool newPerm) {
|
bool CheckRank(Player p, LevelPermission perm, string target, bool newPerm) {
|
||||||
if (p != null && perm > p.Rank) {
|
if (p != null && perm > p.Rank) {
|
||||||
Player.Message(p, "You cannot change the {0} of a level {1} a {0} higher than your rank.",
|
Player.Message(p, "You cannot change the {0} of a level {1} a {0} higher than your rank.",
|
||||||
target, newPerm ? "to" : "with");
|
target, newPerm ? "to" : "with");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -153,8 +159,29 @@ namespace MCGalaxy {
|
|||||||
Player[] players = PlayerInfo.Online.Items;
|
Player[] players = PlayerInfo.Online.Items;
|
||||||
foreach (Player p in players) {
|
foreach (Player p in players) {
|
||||||
if (p.level != lvl) continue;
|
if (p.level != lvl) continue;
|
||||||
p.AllowBuild = lvl.BuildAccess.Check(p, false);
|
|
||||||
|
LevelAccessResult access = lvl.BuildAccess.Check(p, false);
|
||||||
|
p.AllowBuild = access == LevelAccessResult.Whitelisted
|
||||||
|
|| access == LevelAccessResult.Allowed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum LevelAccessResult {
|
||||||
|
|
||||||
|
/// <summary> The player is whitelisted and always allowed. </summary>
|
||||||
|
Whitelisted,
|
||||||
|
|
||||||
|
/// <summary> The player is blacklisted and never allowed. </summary>
|
||||||
|
Blacklisted,
|
||||||
|
|
||||||
|
/// <summary> The player is allowed (by their rank) </summary>
|
||||||
|
Allowed,
|
||||||
|
|
||||||
|
/// <summary> The player's rank is below the minimum rank allowed. </summary>
|
||||||
|
BelowMinRank,
|
||||||
|
|
||||||
|
/// <summary> The player's rank is above the maximum rank allowed. </summary>
|
||||||
|
AboveMaxRank,
|
||||||
|
}
|
||||||
}
|
}
|
@ -319,7 +319,10 @@ namespace MCGalaxy {
|
|||||||
bool success = true;
|
bool success = true;
|
||||||
useCheckpointSpawn = false;
|
useCheckpointSpawn = false;
|
||||||
lastCheckpointIndex = -1;
|
lastCheckpointIndex = -1;
|
||||||
AllowBuild = level.BuildAccess.Check(this, false);
|
|
||||||
|
LevelAccessResult access = level.BuildAccess.Check(this, false);
|
||||||
|
AllowBuild = access == LevelAccessResult.Whitelisted
|
||||||
|
|| access == LevelAccessResult.Allowed;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (hasBlockDefs) {
|
if (hasBlockDefs) {
|
||||||
@ -356,7 +359,7 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
success = false;
|
success = false;
|
||||||
PlayerActions.ChangeMap(this, Server.mainLevel.name);
|
PlayerActions.ChangeMap(this, Server.mainLevel);
|
||||||
SendMessage("There was an error sending the map data, you have been sent to the main level.");
|
SendMessage("There was an error sending the map data, you have been sent to the main level.");
|
||||||
Server.ErrorLog(ex);
|
Server.ErrorLog(ex);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -187,8 +187,8 @@ namespace MCGalaxy {
|
|||||||
byte[] remaining = new byte[buffer.Length - size];
|
byte[] remaining = new byte[buffer.Length - size];
|
||||||
Buffer.BlockCopy(buffer, size, remaining, 0, remaining.Length);
|
Buffer.BlockCopy(buffer, size, remaining, 0, remaining.Length);
|
||||||
return ProcessReceived(remaining);
|
return ProcessReceived(remaining);
|
||||||
} catch (Exception e) {
|
} catch (Exception ex) {
|
||||||
Server.ErrorLog(e);
|
Server.ErrorLog(ex);
|
||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
@ -441,7 +441,6 @@ return;
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HandleChat(byte[] packet) {
|
void HandleChat(byte[] packet) {
|
||||||
try {
|
|
||||||
if (!loggedIn) return;
|
if (!loggedIn) return;
|
||||||
byte continued = packet[1];
|
byte continued = packet[1];
|
||||||
string text = GetString(packet, 2);
|
string text = GetString(packet, 2);
|
||||||
@ -518,8 +517,6 @@ return;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckForMessageSpam();
|
CheckForMessageSpam();
|
||||||
}
|
|
||||||
catch ( Exception e ) { Server.ErrorLog(e); Chat.MessageAll("An error occurred: {0}", e.Message); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FilterChat(ref string text, byte continued) {
|
bool FilterChat(ref string text, byte continued) {
|
||||||
|
@ -20,14 +20,14 @@ using MCGalaxy.Commands.World;
|
|||||||
using MCGalaxy.Games;
|
using MCGalaxy.Games;
|
||||||
using MCGalaxy.SQL;
|
using MCGalaxy.SQL;
|
||||||
|
|
||||||
namespace MCGalaxy {
|
namespace MCGalaxy {
|
||||||
public sealed partial class Player : IDisposable {
|
public sealed partial class Player : IDisposable {
|
||||||
|
|
||||||
void HandleLogin(byte[] packet) {
|
void HandleLogin(byte[] packet) {
|
||||||
LastAction = DateTime.UtcNow;
|
LastAction = DateTime.UtcNow;
|
||||||
try {
|
if (loggedIn) return;
|
||||||
if (loggedIn) return;
|
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
byte version = packet[1];
|
byte version = packet[1];
|
||||||
name = enc.GetString(packet, 2, 64).Trim();
|
name = enc.GetString(packet, 2, 64).Trim();
|
||||||
if (name.Length > 16) {
|
if (name.Length > 16) {
|
||||||
@ -47,89 +47,116 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
if (altsCount > 0) {
|
if (altsCount > 0) {
|
||||||
Leave("Already logged in!", true); return;
|
Leave("Already logged in!", true); return;
|
||||||
|
=======
|
||||||
|
byte version = packet[1];
|
||||||
|
name = enc.GetString(packet, 2, 64).Trim();
|
||||||
|
if (name.Length > 16) {
|
||||||
|
Leave("Usernames must be 16 characters or less", true); return;
|
||||||
|
}
|
||||||
|
truename = name;
|
||||||
|
skinName = name;
|
||||||
|
|
||||||
|
int altsCount = 0;
|
||||||
|
lock (pendingLock) {
|
||||||
|
DateTime now = DateTime.UtcNow;
|
||||||
|
foreach (PendingItem item in pendingNames) {
|
||||||
|
if (item.Name == truename && (now - item.Connected).TotalSeconds <= 60)
|
||||||
|
altsCount++;
|
||||||
|
>>>>>>> 22ce3355275dac2590aae6a9ecc600706f28e377
|
||||||
}
|
}
|
||||||
|
pendingNames.Add(new PendingItem(name));
|
||||||
|
}
|
||||||
|
if (altsCount > 0) {
|
||||||
|
Leave("Already logged in!", true); return;
|
||||||
|
}
|
||||||
|
|
||||||
string verify = enc.GetString(packet, 66, 32).Trim();
|
string verify = enc.GetString(packet, 66, 32).Trim();
|
||||||
verifiedName = false;
|
verifiedName = false;
|
||||||
if (Server.verify) {
|
if (Server.verify) {
|
||||||
byte[] hash = null;
|
byte[] hash = null;
|
||||||
lock (md5Lock)
|
lock (md5Lock)
|
||||||
hash = md5.ComputeHash(enc.GetBytes(Server.salt + truename));
|
hash = md5.ComputeHash(enc.GetBytes(Server.salt + truename));
|
||||||
|
|
||||||
string hashHex = BitConverter.ToString(hash);
|
|
||||||
if (!verify.CaselessEq(hashHex.Replace("-", ""))) {
|
|
||||||
if (!IPInPrivateRange(ip)) {
|
|
||||||
Leave("Login failed! Try signing in again.", true); return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
verifiedName = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DisplayName = name;
|
string hashHex = BitConverter.ToString(hash);
|
||||||
if (Server.ClassicubeAccountPlus) name += "+";
|
if (!verify.CaselessEq(hashHex.Replace("-", ""))) {
|
||||||
isDev = Server.Devs.CaselessContains(truename);
|
if (!IPInPrivateRange(ip)) {
|
||||||
isMod = Server.Mods.CaselessContains(truename);
|
Leave("Login failed! Try signing in again.", true); return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
verifiedName = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplayName = name;
|
||||||
|
if (Server.ClassicubeAccountPlus) name += "+";
|
||||||
|
isDev = Server.Devs.CaselessContains(truename);
|
||||||
|
isMod = Server.Mods.CaselessContains(truename);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Server.TempBan tBan = Server.tempBans.Find(tB => tB.name.ToLower() == name.ToLower());
|
Server.TempBan tBan = Server.tempBans.Find(tB => tB.name.ToLower() == name.ToLower());
|
||||||
if (tBan.expiryTime < DateTime.UtcNow) {
|
if (tBan.expiryTime < DateTime.UtcNow) {
|
||||||
Server.tempBans.Remove(tBan);
|
Server.tempBans.Remove(tBan);
|
||||||
} else {
|
} else {
|
||||||
string reason = String.IsNullOrEmpty(tBan.reason) ? "" :
|
string reason = String.IsNullOrEmpty(tBan.reason) ? "" :
|
||||||
" (" + tBan.reason + ")";
|
" (" + tBan.reason + ")";
|
||||||
Kick("You're still temp banned!" + reason, true);
|
Kick("You're still temp banned!" + reason, true);
|
||||||
}
|
}
|
||||||
} catch { }
|
} catch { }
|
||||||
|
|
||||||
if (!CheckWhitelist()) { Leave("This is a private server!", true); return; }
|
if (!CheckWhitelist()) { Leave("This is a private server!", true); return; }
|
||||||
Group foundGrp = Group.findPlayerGroup(name);
|
Group foundGrp = Group.findPlayerGroup(name);
|
||||||
|
|
||||||
// ban check
|
// ban check
|
||||||
if (Server.bannedIP.Contains(ip) && (!Server.useWhitelist || !onWhitelist)) {
|
if (Server.bannedIP.Contains(ip) && (!Server.useWhitelist || !onWhitelist)) {
|
||||||
Kick(Server.defaultBanMessage, true); return;
|
Kick(Server.defaultBanMessage, true); return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundGrp.Permission == LevelPermission.Banned) {
|
if (foundGrp.Permission == LevelPermission.Banned) {
|
||||||
string[] data = Ban.GetBanData(name);
|
string[] data = Ban.GetBanData(name);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
Kick(Ban.FormatBan(data[0], data[1]), true);
|
Kick(Ban.FormatBan(data[0], data[1]), true);
|
||||||
} else {
|
} else {
|
||||||
Kick(Server.defaultBanMessage, true);
|
Kick(Server.defaultBanMessage, true);
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// maxplayer check
|
|
||||||
if (!CheckPlayersCount(foundGrp)) return;
|
|
||||||
if (version != Server.version) { Leave("Wrong version!", true); return; }
|
|
||||||
|
|
||||||
Player[] players = PlayerInfo.Online.Items;
|
|
||||||
foreach (Player p in players) {
|
|
||||||
if (p.name != name) continue;
|
|
||||||
|
|
||||||
if (Server.verify) {
|
|
||||||
string reason = p.ip == ip ? "(Reconnecting)" : "(Reconnecting from a different IP)";
|
|
||||||
p.Leave(reason); break;
|
|
||||||
} else {
|
|
||||||
Leave("Already logged in!", true); return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
byte type = packet[130];
|
byte type = packet[130];
|
||||||
if (type == 0x42) { hasCpe = true; SendCpeExtensions(); }
|
if (type == 0x42) { hasCpe = true; SendCpeExtensions(); }
|
||||||
|
=======
|
||||||
group = foundGrp;
|
return;
|
||||||
Loading = true;
|
|
||||||
if (disconnected) return;
|
|
||||||
id = NextFreeId();
|
|
||||||
|
|
||||||
if (type != 0x42)
|
|
||||||
CompleteLoginProcess();
|
|
||||||
} catch (Exception e) {
|
|
||||||
Server.ErrorLog(e);
|
|
||||||
Chat.MessageAll("An error occurred: {0}", e.Message);
|
|
||||||
}
|
}
|
||||||
|
>>>>>>> 22ce3355275dac2590aae6a9ecc600706f28e377
|
||||||
|
|
||||||
|
// maxplayer check
|
||||||
|
if (!CheckPlayersCount(foundGrp)) return;
|
||||||
|
if (version != Server.version) { Leave("Wrong version!", true); return; }
|
||||||
|
|
||||||
|
Player[] players = PlayerInfo.Online.Items;
|
||||||
|
foreach (Player p in players) {
|
||||||
|
if (p.name != name) continue;
|
||||||
|
|
||||||
|
if (Server.verify) {
|
||||||
|
string reason = p.ip == ip ? "(Reconnecting)" : "(Reconnecting from a different IP)";
|
||||||
|
p.Leave(reason); break;
|
||||||
|
} else {
|
||||||
|
Leave("Already logged in!", true); return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadIgnores();
|
||||||
|
byte type = packet[130];
|
||||||
|
if (type == 0x42) { hasCpe = true; SendCpeExtensions(); }
|
||||||
|
|
||||||
|
try { left.Remove(name.ToLower()); }
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
group = foundGrp;
|
||||||
|
Loading = true;
|
||||||
|
if (disconnected) return;
|
||||||
|
id = NextFreeId();
|
||||||
|
|
||||||
|
if (type != 0x42)
|
||||||
|
CompleteLoginProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckPlayersCount(Group foundGrp) {
|
bool CheckPlayersCount(Group foundGrp) {
|
||||||
@ -194,20 +221,15 @@ namespace MCGalaxy {
|
|||||||
void CompleteLoginProcess() {
|
void CompleteLoginProcess() {
|
||||||
LevelPermission adminChatRank = CommandOtherPerms.FindPerm("adminchat", LevelPermission.Admin);
|
LevelPermission adminChatRank = CommandOtherPerms.FindPerm("adminchat", LevelPermission.Admin);
|
||||||
|
|
||||||
try {
|
SendUserMOTD();
|
||||||
SendUserMOTD();
|
SendMap(null);
|
||||||
SendMap(null);
|
if (disconnected) return;
|
||||||
if (disconnected) return;
|
loggedIn = true;
|
||||||
loggedIn = true;
|
|
||||||
|
PlayerInfo.Online.Add(this);
|
||||||
PlayerInfo.Online.Add(this);
|
connections.Remove(this);
|
||||||
connections.Remove(this);
|
RemoveFromPending();
|
||||||
RemoveFromPending();
|
Server.s.PlayerListUpdate();
|
||||||
Server.s.PlayerListUpdate();
|
|
||||||
} catch (Exception e) {
|
|
||||||
Server.ErrorLog(e);
|
|
||||||
Chat.MessageAll("An error occurred: {0}", e.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//OpenClassic Client Check
|
//OpenClassic Client Check
|
||||||
SendBlockchange(0, 0, 0, 0);
|
SendBlockchange(0, 0, 0, 0);
|
||||||
@ -275,17 +297,15 @@ namespace MCGalaxy {
|
|||||||
Server.s.Log(name + " [" + ip + "] has joined the server.");
|
Server.s.Log(name + " [" + ip + "] has joined the server.");
|
||||||
Game.InfectMessages = PlayerDB.GetInfectMessages(this);
|
Game.InfectMessages = PlayerDB.GetInfectMessages(this);
|
||||||
Server.zombie.PlayerJoinedServer(this);
|
Server.zombie.PlayerJoinedServer(this);
|
||||||
try {
|
|
||||||
ushort x = (ushort)((0.5 + level.spawnx) * 32);
|
ushort x = (ushort)((0.5 + level.spawnx) * 32);
|
||||||
ushort y = (ushort)((1 + level.spawny) * 32);
|
ushort y = (ushort)((1 + level.spawny) * 32);
|
||||||
ushort z = (ushort)((0.5 + level.spawnz) * 32);
|
ushort z = (ushort)((0.5 + level.spawnz) * 32);
|
||||||
pos = new ushort[3] { x, y, z }; rot = new byte[2] { level.rotx, level.roty };
|
pos = new ushort[3] { x, y, z };
|
||||||
Entities.SpawnEntities(this, x, y, z, rot[0], rot[1]);
|
rot = new byte[2] { level.rotx, level.roty };
|
||||||
} catch (Exception e) {
|
|
||||||
Server.ErrorLog(e);
|
Entities.SpawnEntities(this, x, y, z, rot[0], rot[1]);
|
||||||
Server.s.Log("Error spawning player \"" + name + "\"");
|
PlayerActions.CheckGamesJoin(this, null);
|
||||||
}
|
|
||||||
CmdGoto.CheckGamesJoin(this, null);
|
|
||||||
Loading = false;
|
Loading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,6 +360,7 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
if (alts.Count == 0) return;
|
if (alts.Count == 0) return;
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
LevelPermission adminChatRank = CommandOtherPerms.FindPerm("adminchat", LevelPermission.Admin);
|
LevelPermission adminChatRank = CommandOtherPerms.FindPerm("adminchat", LevelPermission.Admin);
|
||||||
string altsMsg = p.ColoredName + " %Sis lately known as: " + alts.Join();
|
string altsMsg = p.ColoredName + " %Sis lately known as: " + alts.Join();
|
||||||
if (p.group.Permission < adminChatRank || !Server.adminsjoinsilent) {
|
if (p.group.Permission < adminChatRank || !Server.adminsjoinsilent) {
|
||||||
@ -347,6 +368,13 @@ namespace MCGalaxy {
|
|||||||
//IRCBot.Say(temp, true); //Tells people in op channel on IRC
|
//IRCBot.Say(temp, true); //Tells people in op channel on IRC
|
||||||
}
|
}
|
||||||
Server.s.Log(altsMsg);
|
Server.s.Log(altsMsg);
|
||||||
|
=======
|
||||||
|
short reachDist;
|
||||||
|
if (!short.TryParse(reach, out reachDist)) return;
|
||||||
|
ReachDistance = reachDist / 32f;
|
||||||
|
if (HasCpeExt(CpeExt.ClickDistance))
|
||||||
|
Send(Packet.MakeClickDistance(reachDist));
|
||||||
|
>>>>>>> 22ce3355275dac2590aae6a9ecc600706f28e377
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,11 @@
|
|||||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||||
or implied. See the Licenses for the specific language governing
|
or implied. See the Licenses for the specific language governing
|
||||||
permissions and limitations under the Licenses.
|
permissions and limitations under the Licenses.
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
|
using MCGalaxy.Games;
|
||||||
|
using MCGalaxy.Commands.World;
|
||||||
|
|
||||||
namespace MCGalaxy {
|
namespace MCGalaxy {
|
||||||
public static class PlayerActions {
|
public static class PlayerActions {
|
||||||
|
|
||||||
@ -25,7 +28,7 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Moves the player to the specified block coordinates. </summary>
|
/// <summary> Moves the player to the specified block coordinates. </summary>
|
||||||
public static void MoveCoords(Player p, int bX, int bY, int bZ,
|
public static void MoveCoords(Player p, int bX, int bY, int bZ,
|
||||||
byte rotX, byte rotY) {
|
byte rotX, byte rotY) {
|
||||||
ushort x = (ushort)(bX * 32 + 16);
|
ushort x = (ushort)(bX * 32 + 16);
|
||||||
ushort y = (ushort)(bY * 32);
|
ushort y = (ushort)(bY * 32);
|
||||||
@ -34,8 +37,121 @@ namespace MCGalaxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Moves the player to the specified map. </summary>
|
/// <summary> Moves the player to the specified map. </summary>
|
||||||
public static void ChangeMap(Player p, string name) {
|
public static bool ChangeMap(Player p, string name) { return ChangeMap(p, null, name); }
|
||||||
Command.all.Find("goto").Use(p, name);
|
|
||||||
|
/// <summary> Moves the player to the specified map. </summary>
|
||||||
|
public static bool ChangeMap(Player p, Level lvl) { return ChangeMap(p, lvl, null); }
|
||||||
|
|
||||||
|
static bool ChangeMap(Player p, Level lvl, string name) {
|
||||||
|
if (p.usingGoto) { Player.Message(p, "Cannot use /goto, already loading a map."); return false; }
|
||||||
|
Level oldLevel = p.level;
|
||||||
|
p.usingGoto = true;
|
||||||
|
bool didJoin = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
didJoin = name == null ?
|
||||||
|
GotoLevel(p, lvl) : GotoMap(p, name);
|
||||||
|
} finally {
|
||||||
|
p.usingGoto = false;
|
||||||
|
GC.Collect();
|
||||||
|
GC.WaitForPendingFinalizers();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!didJoin) return false;
|
||||||
|
Unload(oldLevel);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool GotoMap(Player p, string name) {
|
||||||
|
Level lvl = LevelInfo.FindExact(name);
|
||||||
|
if (lvl != null) return GotoLevel(p, lvl);
|
||||||
|
|
||||||
|
if (Server.AutoLoad) {
|
||||||
|
// First try exactly matching unloaded levels
|
||||||
|
if (LevelInfo.ExistsOffline(name))
|
||||||
|
return LoadOfflineLevel(p, name);
|
||||||
|
lvl = LevelInfo.Find(name);
|
||||||
|
if (lvl != null) return GotoLevel(p, lvl);
|
||||||
|
|
||||||
|
string matches = LevelInfo.FindMapMatches(p, name);
|
||||||
|
if (matches == null) return false;
|
||||||
|
return LoadOfflineLevel(p, matches);
|
||||||
|
} else {
|
||||||
|
lvl = LevelInfo.Find(name);
|
||||||
|
if (lvl == null) {
|
||||||
|
Player.Message(p, "There is no level \"{0}\" loaded. Did you mean..", name);
|
||||||
|
Command.all.Find("search").Use(p, "levels " + name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return GotoLevel(p, lvl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool LoadOfflineLevel(Player p, string name) {
|
||||||
|
if (!Level.CheckLoadOnGoto(name)) {
|
||||||
|
Player.Message(p, "Level \"{0}\" cannot be loaded using /goto.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CmdLoad.LoadLevel(p, name, "0", true);
|
||||||
|
Level lvl = LevelInfo.FindExact(name);
|
||||||
|
if (lvl != null) return GotoLevel(p, lvl);
|
||||||
|
|
||||||
|
Player.Message(p, "Level \"{0}\" failed to be auto-loaded.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool GotoLevel(Player p, Level lvl) {
|
||||||
|
if (p.level == lvl) { Player.Message(p, "You are already in \"" + lvl.name + "\"."); return false; }
|
||||||
|
if (!lvl.CanJoin(p)) return false;
|
||||||
|
if (!Server.zombie.PlayerCanJoinLevel(p, lvl, p.level)) return false;
|
||||||
|
|
||||||
|
p.Loading = true;
|
||||||
|
Entities.DespawnEntities(p);
|
||||||
|
Level oldLevel = p.level;
|
||||||
|
p.level = lvl; p.SendUserMOTD(); p.SendMap(oldLevel);
|
||||||
|
|
||||||
|
ushort x = (ushort)(lvl.spawnx * 32 + 16);
|
||||||
|
ushort y = (ushort)(lvl.spawny * 32 + 32);
|
||||||
|
ushort z = (ushort)(lvl.spawnz * 32 + 16);
|
||||||
|
Entities.SpawnEntities(p, x, y, z, lvl.rotx, lvl.roty);
|
||||||
|
p.Loading = false;
|
||||||
|
CheckGamesJoin(p, oldLevel);
|
||||||
|
p.prevMsg = "";
|
||||||
|
|
||||||
|
if (!p.hidden && p.level.ShouldShowJoinMessage(oldLevel)) {
|
||||||
|
Player.SendChatFrom(p, p.color + "*" + p.DisplayName + " %Swent to &b" + lvl.name, false);
|
||||||
|
Player.RaisePlayerAction(p, PlayerAction.JoinWorld, lvl.name);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void CheckGamesJoin(Player p, Level oldLvl) {
|
||||||
|
Server.lava.PlayerJoinedLevel(p, p.level, oldLvl);
|
||||||
|
Server.zombie.PlayerJoinedLevel(p, p.level, oldLvl);
|
||||||
|
|
||||||
|
if (p.inTNTwarsMap) p.canBuild = true;
|
||||||
|
TntWarsGame game = TntWarsGame.Find(p.level);
|
||||||
|
if (game == null) return;
|
||||||
|
|
||||||
|
if (game.GameStatus != TntWarsGame.TntWarsGameStatus.Finished &&
|
||||||
|
game.GameStatus != TntWarsGame.TntWarsGameStatus.WaitingForPlayers) {
|
||||||
|
p.canBuild = false;
|
||||||
|
Player.Message(p, "TNT Wars: Disabled your building because you are in a TNT Wars map!");
|
||||||
|
}
|
||||||
|
p.inTNTwarsMap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Unload(Level lvl) {
|
||||||
|
bool unloadOld = true;
|
||||||
|
if (lvl.IsMuseum || !lvl.unload) return;
|
||||||
|
|
||||||
|
Player[] players = PlayerInfo.Online.Items;
|
||||||
|
foreach (Player pl in players) {
|
||||||
|
if (pl.level == lvl) { unloadOld = false; break; }
|
||||||
|
}
|
||||||
|
if (unloadOld && Server.AutoLoad) lvl.Unload(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ namespace MCGalaxy {
|
|||||||
|
|
||||||
Level lvl = LevelInfo.FindExact(wp.lvlname);
|
Level lvl = LevelInfo.FindExact(wp.lvlname);
|
||||||
if (p.level != lvl)
|
if (p.level != lvl)
|
||||||
PlayerActions.ChangeMap(p, wp.lvlname);
|
PlayerActions.ChangeMap(p, lvl);
|
||||||
|
|
||||||
if (p.level.name.CaselessEq(wp.lvlname)) {
|
if (p.level.name.CaselessEq(wp.lvlname)) {
|
||||||
p.SendPos(0xFF, wp.x, wp.y, wp.z, wp.rotx, wp.roty);
|
p.SendPos(0xFF, wp.x, wp.y, wp.z, wp.rotx, wp.roty);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user