Merge branch 'master' of github.com:Hetal728/MCGalaxy

This commit is contained in:
UnknownShadow200 2016-04-07 19:39:47 +10:00
commit a4737d324a
41 changed files with 240 additions and 257 deletions

View File

@ -56,7 +56,14 @@ namespace MCGalaxy {
if (i >= red && i <= white) if (i >= red && i <= white)
Properties[i].KilledByLava = true; Properties[i].KilledByLava = true;
if (i == air || i == shrub || (i >= yellowflower && i <= redmushroom)) {
Properties[i].KilledByLava = true;
Properties[i].KilledByWater = true;
}
} }
// Block specific properties
Properties[wood].KilledByLava = true; Properties[trunk].KilledByLava = true;
Properties[sponge].KilledByLava = true; Properties[bookcase].KilledByLava = true;
SetupDefaultNames(); SetupDefaultNames();
} }

View File

@ -21,23 +21,9 @@ namespace MCGalaxy
{ {
public sealed partial class Block public sealed partial class Block
{ {
public static bool Walkthrough(byte type) public static bool Walkthrough(byte type) {
{ return type == air || type == shrub || (type >= water && type <= lavastill)
switch (type) && (type >= yellowflower && type <= redmushroom);
{
case air:
case water:
case waterstill:
case lava:
case lavastill:
case yellowflower:
case redflower:
case mushroom:
case redmushroom:
case shrub:
return true;
}
return false;
} }
public static bool AllowBreak(byte type) public static bool AllowBreak(byte type)
@ -98,35 +84,14 @@ namespace MCGalaxy
return false; return false;
} }
public static bool Placable(byte type) public static bool Placable(byte type) {
{ return !(type == blackrock || (type >= water && type <= lavastill))
switch (type) && type < Block.CpeCount;
{
// case Block.air:
// case Block.grass:
case Block.blackrock:
case Block.water:
case Block.waterstill:
case Block.lava:
case Block.lavastill:
return false;
}
return type < Block.CpeCount;
} }
public static bool RightClick(byte type, bool countAir = false) public static bool RightClick(byte type, bool countAir = false) {
{
if (countAir && type == Block.air) return true; if (countAir && type == Block.air) return true;
return type >= water && type <= lavastill;
switch (type)
{
case Block.water:
case Block.lava:
case Block.waterstill:
case Block.lavastill:
return true;
}
return false;
} }
public static bool OPBlocks(byte type) { return Properties[type].OPBlock; } public static bool OPBlocks(byte type) { return Properties[type].OPBlock; }
@ -169,60 +134,17 @@ namespace MCGalaxy
public static bool BuildIn(byte type) public static bool BuildIn(byte type)
{ {
if (type == op_water || type == op_lava || Block.portal(type) || Block.mb(type)) return false; if (type == op_water || type == op_lava || Block.portal(type) || Block.mb(type)) return false;
type = Block.Convert(type);
switch (Block.Convert(type)) return type >= water && type <= lavastill;
{
case water:
case lava:
case waterstill:
case lavastill:
return true;
}
return false;
} }
public static bool Mover(byte type) { public static bool Mover(byte type) { return walkthroughHandlers[type] != null; }
return walkthroughHandlers[type] != null;
}
public static bool FireKill(byte type) { public static bool FireKill(byte type) { return type != air && Properties[type].KilledByLava; }
return type != Block.air && LavaKill(type);
}
public static bool LavaKill(byte type) public static bool LavaKill(byte type) { return Properties[type].KilledByLava; }
{
switch (type) public static bool WaterKill(byte type) { return Properties[type].KilledByWater; }
{
case Block.air:
case Block.wood:
case Block.shrub:
case Block.trunk:
case Block.leaf:
case Block.sponge:
case Block.yellowflower:
case Block.redflower:
case Block.mushroom:
case Block.redmushroom:
case Block.bookcase:
return true;
}
return Properties[type].KilledByLava;
}
public static bool WaterKill(byte type)
{
switch (type)
{
case Block.air:
case Block.shrub:
case Block.leaf:
case Block.yellowflower:
case Block.redflower:
case Block.mushroom:
case Block.redmushroom:
return true;
}
return Properties[type].KilledByWater;
}
public static bool LightPass(byte type, byte extType, BlockDefinition[] defs) { public static bool LightPass(byte type, byte extType, BlockDefinition[] defs) {
switch (Convert(type)) { switch (Convert(type)) {

View File

@ -208,8 +208,7 @@ namespace MCGalaxy.Commands {
return; return;
} }
if (pl.group.Permission >= p.group.Permission) { if (pl.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "You can't force someone of a higher or equal rank to join a chatroom."); MessageTooHighRank(p, "force-join", false); return;
return;
} }
if (pl.spyChatRooms.Contains(room)) { if (pl.spyChatRooms.Contains(room)) {
@ -234,8 +233,7 @@ namespace MCGalaxy.Commands {
Player pl = PlayerInfo.FindOrShowMatches(p, name); Player pl = PlayerInfo.FindOrShowMatches(p, name);
if (pl == null) return; if (pl == null) return;
if (pl.group.Permission >= p.group.Permission) { if (pl.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "You can't kick someone of a higher or equal rank from a chatroom."); MessageTooHighRank(p, "kick from a chatroom", false); return;
return;
} }
Player.SendMessage(pl, "You were kicked from the chat room '" + pl.Chatroom + "'"); Player.SendMessage(pl, "You were kicked from the chat room '" + pl.Chatroom + "'");

View File

@ -51,7 +51,7 @@ namespace MCGalaxy.Commands {
Player.SendMessage(p, "You cannot %cdeath-hug %Sat your current rank."); return; Player.SendMessage(p, "You cannot %cdeath-hug %Sat your current rank."); return;
} }
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "You can't %cdeath-hug %Ssomeone of greater rank."); return; MessageTooHighRank(p, "&cdeath-hug%S", true); return;
} }
who.HandleDeath(Block.rock, " died from a %cdeadly hug."); who.HandleDeath(Block.rock, " died from a %cdeadly hug.");
} }

View File

@ -206,7 +206,7 @@ namespace MCGalaxy.Commands
Level.SaveSettings(p.level); Level.SaveSettings(p.level);
} }
} else if (cmd == "GUNS") { } else if (cmd == "GUNS") {
Command.all.Find("allowguns").Use(p, null); Command.all.Find("allowguns").Use(p, "");
} else if (cmd == "PERVISIT") { } else if (cmd == "PERVISIT") {
string rank = value == "" ? Server.defaultRank : value; string rank = value == "" ? Server.defaultRank : value;
Command.all.Find("pervisit").Use(p, rank); Command.all.Find("pervisit").Use(p, rank);

View File

@ -70,6 +70,17 @@ namespace MCGalaxy
else else
Player.SendMessage(p, "Only " + grp.color + grp.name + "%s+ can " + action); Player.SendMessage(p, "Only " + grp.color + grp.name + "%s+ can " + action);
} }
protected void MessageTooHighRank(Player p, string action, bool canAffectOwnRank) {
MessageTooHighRank(p, action, p.group, canAffectOwnRank);
}
protected void MessageTooHighRank(Player p, string action, Group grp, bool canAffectGroup) {
if (canAffectGroup)
Player.SendMessage(p, "Can only " + action + " players ranked " + grp.color + grp.name + " %Sor below");
else
Player.SendMessage(p, "Can only " + action + " players ranked below " + grp.color + grp.name);
}
} }
public struct CommandPerm { public struct CommandPerm {

View File

@ -204,7 +204,7 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, target); Player who = PlayerInfo.FindOrShowMatches(p, target);
if (who == null) return; if (who == null) return;
if (p.group.Permission < who.group.Permission) { if (p.group.Permission < who.group.Permission) {
Player.SendMessage(p, "You can't send rules to someone of a higher rank than yourself!!"); return; MessageTooHighRank(p, "send countdown rules", true); return;
} else { } else {
Player.SendMessage(who, "Countdown rules sent to you by " + p.color + p.name); Player.SendMessage(who, "Countdown rules sent to you by " + p.color + p.name);
Player.SendMessage(who, "The aim of the game is to stay alive the longest."); Player.SendMessage(who, "The aim of the game is to stay alive the longest.");

View File

@ -45,7 +45,7 @@ namespace MCGalaxy.Commands {
return; return;
} }
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "You cannot slap someone ranked higher than you!"); return; MessageTooHighRank(p, "slap", true); return;
} }
ushort curX = (ushort)(who.pos[0] / 32), curY = (ushort)(who.pos[1] / 32), curZ = (ushort)(who.pos[2] / 32); ushort curX = (ushort)(who.pos[0] / 32), curY = (ushort)(who.pos[1] / 32), curZ = (ushort)(who.pos[2] / 32);

View File

@ -40,7 +40,7 @@ namespace MCGalaxy.Commands
who = PlayerInfo.FindOrShowMatches(p, message); who = PlayerInfo.FindOrShowMatches(p, message);
if (who == null) return; if (who == null) return;
if (p != null && p.group.Permission < who.group.Permission) { if (p != null && p.group.Permission < who.group.Permission) {
Player.SendMessage(p, "You cannot send /oprules to a higher or same ranked player."); return; MessageTooHighRank(p, "send /oprules", false); return;
} }
} }

View File

@ -95,14 +95,14 @@ namespace MCGalaxy.Commands {
bool CheckPerms(string name, Group group, Player p) { bool CheckPerms(string name, Group group, Player p) {
if ((int)group.Permission >= CommandOtherPerms.GetPerm(this)) { if ((int)group.Permission >= CommandOtherPerms.GetPerm(this)) {
string highest = Group.findPermInt(CommandOtherPerms.GetPerm(this)).name; Group grp = Group.findPermInt(CommandOtherPerms.GetPerm(this));
Player.SendMessage(p, "You can't ban players ranked " + highest + " or higher!"); return false; MessageTooHighRank(p, "ban", grp, false); return false;
} }
if (group.Permission == LevelPermission.Banned) { if (group.Permission == LevelPermission.Banned) {
Player.SendMessage(p, name + " is already banned."); return false; Player.SendMessage(p, name + " is already banned."); return false;
} }
if (p != null && group.Permission >= p.group.Permission) { if (p != null && group.Permission >= p.group.Permission) {
Player.SendMessage(p, "You cannot ban a person ranked equal or higher than you."); return false; MessageTooHighRank(p, "ban", false); return false;
} }
group.playerList.Remove(name); group.playerList.Remove(name);

View File

@ -95,7 +95,7 @@ namespace MCGalaxy.Commands
} }
if (who == null) { Player.SendMessage(p, "Could not find player."); return; } if (who == null) { Player.SendMessage(p, "Could not find player."); return; }
else if (who == p) { Player.SendMessage(p, "Cannot follow yourself."); return; } else if (who == p) { Player.SendMessage(p, "Cannot follow yourself."); return; }
else if (who.group.Permission >= p.group.Permission) { Player.SendMessage(p, "Cannot follow someone of equal or greater rank."); return; } else if (who.group.Permission >= p.group.Permission) { MessageTooHighRank(p, "follow", false); return;}
else if (who.following != "") { Player.SendMessage(p, who.DisplayName + " is already following " + who.following); return; } else if (who.following != "") { Player.SendMessage(p, who.DisplayName + " is already following " + who.following); return; }
if (!p.hidden) Command.all.Find("hide").Use(p, ""); if (!p.hidden) Command.all.Find("hide").Use(p, "");

View File

@ -32,7 +32,7 @@ namespace MCGalaxy.Commands
if (who == null) return; if (who == null) return;
if (p == who) { Player.SendMessage(p, "Cannot freeze yourself."); return; } if (p == who) { Player.SendMessage(p, "Cannot freeze yourself."); return; }
if (p != null && who.group.Permission >= p.group.Permission) { if (p != null && who.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot freeze someone of equal or greater rank."); return; MessageTooHighRank(p, "freeze", false); return;
} }
string frozenby = (p == null) ? "(console)" : p.ColoredName; string frozenby = (p == null) ? "(console)" : p.ColoredName;

View File

@ -40,7 +40,7 @@ namespace MCGalaxy.Commands
if (!who.jailed) { if (!who.jailed) {
if (p != null &&who.group.Permission >= p.group.Permission) { if (p != null &&who.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot jail someone of equal or greater rank."); return; MessageTooHighRank(p, "jail", false); return;
} }
Player.SendMessage(p, "You jailed " + who.DisplayName); Player.SendMessage(p, "You jailed " + who.DisplayName);
Player.GlobalDespawn(who, false); Player.GlobalDespawn(who, false);

View File

@ -37,7 +37,9 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, message); Player who = PlayerInfo.FindOrShowMatches(p, message);
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { Player.SendMessage(p, "Cannot joker someone of equal or greater rank."); return; } if (p != null && who.group.Permission > p.group.Permission) {
MessageTooHighRank(p, "joker", true); return;
}
if (!who.joker) { if (!who.joker) {
if (stealth) { if (stealth) {

View File

@ -48,7 +48,7 @@ namespace MCGalaxy.Commands
Extensions.DeleteLineWord("ranks/muted.txt", who.name.ToLower()); Extensions.DeleteLineWord("ranks/muted.txt", who.name.ToLower());
} else { } else {
if (p != null && who.group.Permission >= p.group.Permission) { if (p != null && who.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot mute someone of a higher or equal rank."); return; MessageTooHighRank(p, "mute", false); return;
} }
who.muted = true; who.muted = true;
Player.SendChatFrom(who, who.color + who.DisplayName + " %Shas been &8muted", false); Player.SendChatFrom(who, who.color + who.DisplayName + " %Shas been &8muted", false);

View File

@ -39,7 +39,7 @@ namespace MCGalaxy.Commands
} }
if (who.group.Permission >= p.group.Permission) if (who.group.Permission >= p.group.Permission)
{ {
Player.SendMessage(p, "Cannot use this on someone of equal or greater rank."); return; MessageTooHighRank(p, "hide", false); return;
} }
Command.all.Find("hide").Use(who, ""); Command.all.Find("hide").Use(who, "");
Player.SendMessage(p, "Used /hide on " + who.color + who.name + "%S."); Player.SendMessage(p, "Used /hide on " + who.color + who.name + "%S.");

View File

@ -37,7 +37,7 @@ namespace MCGalaxy.Commands {
if (source == null || target == null) return; if (source == null || target == null) return;
if (p.group.Permission < source.group.Permission) { if (p.group.Permission < source.group.Permission) {
Player.SendMessage(p, "You cannot force a player of higher rank to tp to another player."); return; MessageTooHighRank(p, "teleport", true); return;
} }
Player.SendMessage(p, "Attempting to teleport " + source.name + " to " + target.name + "."); Player.SendMessage(p, "Attempting to teleport " + source.name + " to " + target.name + ".");
Command.all.Find("tp").Use(source, target.name); Command.all.Find("tp").Use(source, target.name);

View File

@ -57,7 +57,7 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, message); Player who = PlayerInfo.FindOrShowMatches(p, message);
if (who == null) return; if (who == null) return;
if (who.group.Permission >= p.group.Permission) { if (who.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot possess someone of equal or greater rank."); return; MessageTooHighRank(p, "possess", false); return;
} }
if (who.possess != "") { if (who.possess != "") {

View File

@ -55,8 +55,8 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, parts[0]); Player who = PlayerInfo.FindOrShowMatches(p, parts[0]);
if (who == null) { if (who == null) {
return; return;
} else if (who.group.Permission > p.group.Permission && p != who) { } else if (who.group.Permission > p.group.Permission && p != who) {
Player.SendMessage(p, "Cannot reload the map of someone higher than you."); return; MessageTooHighRank(p, "reload the map for", true); return;
} }
ReloadMap(p, who, true); ReloadMap(p, who, true);
} }

View File

@ -76,8 +76,11 @@ namespace MCGalaxy.Commands
Player.SendMessage(p, "Cannot change the rank to or from \"" + banned.name + "\"."); return false; Player.SendMessage(p, "Cannot change the rank to or from \"" + banned.name + "\"."); return false;
} }
if (p != null && (group.Permission >= p.group.Permission || newRank.Permission >= p.group.Permission)) { if (p != null && (group.Permission >= p.group.Permission || newRank.Permission >= p.group.Permission)) {
Player.SendMessage(p, "Cannot change the rank of someone of or to a rank equal or higher to yours."); return false; MessageTooHighRank(p, "change the rank of", false); return false;
} }
if (p != null && (newRank.Permission >= p.group.Permission)) {
Player.SendMessage(p, "Cannot change the rank of a player to a rank equal or higher to yours."); return false;
}
if (who != null) { if (who != null) {
Group.because(who, newRank); Group.because(who, newRank);

View File

@ -36,7 +36,7 @@ namespace MCGalaxy.Commands {
if (!Player.ValidName(target)) { Player.SendMessage(p, "Invalid name \"" + target + "\"."); return; } if (!Player.ValidName(target)) { Player.SendMessage(p, "Invalid name \"" + target + "\"."); return; }
Group grp = who == null ? PlayerInfo.GetGroup(target) : who.group; Group grp = who == null ? PlayerInfo.GetGroup(target) : who.group;
if (p != null && grp.Permission >= p.group.Permission) { if (p != null && grp.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot temp ban someone of the same or higher rank."); return; MessageTooHighRank(p, "temp ban", false); return;
} }
int minutes = 60; int minutes = 60;

View File

@ -66,7 +66,7 @@ namespace MCGalaxy.Commands {
void UndoOnlinePlayer(Player p, Player who, CatchPos cpos, ushort x, ushort y, ushort z) { void UndoOnlinePlayer(Player p, Player who, CatchPos cpos, ushort x, ushort y, ushort z) {
if (p != who && who.group.Permission >= p.group.Permission) { if (p != who && who.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot undo a user of higher or equal rank"); return; MessageTooHighRank(p, "undo", false); return;
} }
UndoOnlineDrawOp op = new UndoOnlineDrawOp(); UndoOnlineDrawOp op = new UndoOnlineDrawOp();
@ -84,7 +84,7 @@ namespace MCGalaxy.Commands {
void UndoOfflinePlayer(Player p, string whoName, CatchPos cpos, ushort x, ushort y, ushort z) { void UndoOfflinePlayer(Player p, string whoName, CatchPos cpos, ushort x, ushort y, ushort z) {
Group group = Group.findPlayerGroup(whoName); Group group = Group.findPlayerGroup(whoName);
if (group.Permission >= p.group.Permission) { if (group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot undo a user of higher or equal rank"); return; MessageTooHighRank(p, "undo", false); return;
} }
UndoOfflineDrawOp op = new UndoOfflineDrawOp(); UndoOfflineDrawOp op = new UndoOfflineDrawOp();

View File

@ -34,7 +34,7 @@ namespace MCGalaxy.Commands {
if (who == null) return; if (who == null) return;
if (who == p) { Player.SendMessage(p, "you can't warn yourself"); return; } if (who == p) { Player.SendMessage(p, "you can't warn yourself"); return; }
if (p != null && p.group.Permission <= who.group.Permission) { if (p != null && p.group.Permission <= who.group.Permission) {
Player.SendMessage(p, "Cannot warn a player of equal or higher rank."); return; MessageTooHighRank(p, "warn", false); return;
} }
string reason = args.Length == 1 ? "you know why." : args[1]; string reason = args.Length == 1 ? "you know why." : args[1];

View File

@ -40,8 +40,7 @@ namespace MCGalaxy.Commands
if (p != null && muter.group.Permission > p.group.Permission) if (p != null && muter.group.Permission > p.group.Permission)
{ {
Player.SendMessage(p, "You cannot xmute someone ranked higher than you!"); MessageTooHighRank(p, "xmute", true); return;
return;
} }
if (p == muter) if (p == muter)
{ {

View File

@ -30,19 +30,21 @@ namespace MCGalaxy.Commands {
if (message == "") { Help(p); return; } if (message == "") { Help(p); return; }
string[] args = message.Split(' '); string[] args = message.Split(' ');
string scope = args[0].ToLower(); string scope = args[0].ToLower();
if (scope == "local") scope = "level";
if (scope == "localzip") scope = "levelzip";
if (args.Length == 1) { if (args.Length == 1) {
if (scope == "level") if (scope == "level")
Player.SendMessage(p, "Level terrain: " + GetPath(p.level.terrainUrl)); Player.SendMessage(p, "Level terrain: " + GetPath(p.level.terrainUrl));
else if (scope == "levelzip") else if (scope == "levelzip")
Player.SendMessage(p, "Level tex pack: " + GetPath(p.level.texturePackUrl)); Player.SendMessage(p, "Level tex pack: " + GetPath(p.level.texturePackUrl));
else if (scope == "global") else if (scope == "global")
Player.SendMessage(p, "Global terrain: " + GetPath(Server.defaultTerrainUrl)); Player.SendMessage(p, "Global terrain: " + GetPath(Server.defaultTerrainUrl));
else if (scope == "globalzip") else if (scope == "globalzip")
Player.SendMessage(p, "Global tex pack: " + GetPath(Server.defaultTexturePackUrl)); Player.SendMessage(p, "Global tex pack: " + GetPath(Server.defaultTexturePackUrl));
else else
Help(p); Help(p);
return; return;
} }
string url = args[1]; string url = args[1];
@ -58,6 +60,7 @@ namespace MCGalaxy.Commands {
if ((scope == "globalzip" || scope == "levelzip") && !(url == "" || url.EndsWith(".zip"))) { if ((scope == "globalzip" || scope == "levelzip") && !(url == "" || url.EndsWith(".zip"))) {
p.SendMessage("The texture pack URL must end in a .zip"); return; p.SendMessage("The texture pack URL must end in a .zip"); return;
} }
if (url.Length > 64) { p.SendMessage("The URL must be 64 characters or less."); return; }
if (scope == "global") { if (scope == "global") {
Server.defaultTerrainUrl = url; Server.defaultTerrainUrl = url;
@ -75,15 +78,15 @@ namespace MCGalaxy.Commands {
p.level.texturePackUrl = url; p.level.texturePackUrl = url;
p.SendMessage("Set level's texture pack to " + args[1]); p.SendMessage("Set level's texture pack to " + args[1]);
UpdateLevel(p, true); UpdateLevel(p, true);
} else {
Help(p);
} }
} }
static string GetPath(string url) { static string GetPath(string url) { return url == "" ? "(none)" : url; }
return url == "" ? "(none)" : url;
}
void UpdateGlobally(Player p, bool zip) { void UpdateGlobally(Player p, bool zip) {
Player[] players = PlayerInfo.Online.Items; Player[] players = PlayerInfo.Online.Items;
foreach (Player pl in players) { foreach (Player pl in players) {
bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2); bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2);
string url = zip ? pl.level.texturePackUrl : pl.level.terrainUrl; string url = zip ? pl.level.texturePackUrl : pl.level.terrainUrl;
@ -94,7 +97,7 @@ namespace MCGalaxy.Commands {
} }
void UpdateLevel(Player p, bool zip) { void UpdateLevel(Player p, bool zip) {
Player[] players = PlayerInfo.Online.Items; Player[] players = PlayerInfo.Online.Items;
foreach (Player pl in players) { foreach (Player pl in players) {
bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2); bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2);
if (hasExt && pl.level == p.level) if (hasExt && pl.level == p.level)

View File

@ -87,7 +87,7 @@ namespace MCGalaxy.Commands
void UndoOnlinePlayer(Player p, long seconds, Player who) { void UndoOnlinePlayer(Player p, long seconds, Player who) {
if (p != null && p != who) { if (p != null && p != who) {
if (who.group.Permission > p.group.Permission) { if (who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "Cannot undo a user of higher or equal rank"); return; MessageTooHighRank(p, "undo", true); return;
} }
if (!CheckAdditionalPerm(p)) { MessageNeedPerms(p, "can undo other players."); return; } if (!CheckAdditionalPerm(p)) { MessageNeedPerms(p, "can undo other players."); return; }
} }

View File

@ -34,7 +34,7 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, args[0]); Player who = PlayerInfo.FindOrShowMatches(p, args[0]);
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "Cannot change the color of someone of greater rank"); return; MessageTooHighRank(p, "change the color of", true); return;
} }
ParameterisedQuery query = ParameterisedQuery.Create(); ParameterisedQuery query = ParameterisedQuery.Create();

View File

@ -35,7 +35,7 @@ namespace MCGalaxy.Commands {
if (p == null || p == who || p.group.Permission > who.group.Permission) { if (p == null || p == who || p.group.Permission > who.group.Permission) {
Player.SendChatFrom(who, args[1]); Player.SendChatFrom(who, args[1]);
} else { } else {
Player.SendMessage(p, "You cannot impersonate a player of equal or greater rank."); MessageTooHighRank(p, "impersonate", false); return;
} }
} }

View File

@ -33,7 +33,7 @@ namespace MCGalaxy.Commands
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "Cannot toggle invincibility for someone of higher rank");return; MessageTooHighRank(p, "toggle invinciblity", true); return;
} }
if (who.invincible) if (who.invincible)

View File

@ -54,7 +54,7 @@ namespace MCGalaxy.Commands
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
p.HandleDeath(Block.rock, " was killed by " + who.color + who.DisplayName); p.HandleDeath(Block.rock, " was killed by " + who.color + who.DisplayName);
Player.SendMessage(p, "Cannot kill someone of higher rank"); return; MessageTooHighRank(p, "kill", true); return;
} }
who.HandleDeath(Block.rock, deathMessage, explode); who.HandleDeath(Block.rock, deathMessage, explode);
} }

View File

@ -51,7 +51,9 @@ namespace MCGalaxy.Commands
Level where = LevelInfo.Find(param[1]); Level where = LevelInfo.Find(param[1]);
if (who == null) return; if (who == null) return;
if (where == null) { Player.SendMessage(p, "Could not find level specified"); return; } if (where == null) { Player.SendMessage(p, "Could not find level specified"); return; }
if (p != null && who.group.Permission > p.group.Permission) { Player.SendMessage(p, "Cannot move someone of greater rank"); return; } if (p != null && who.group.Permission > p.group.Permission) {
MessageTooHighRank(p, "move", true); return;
}
Command.all.Find("goto").Use(who, where.name); Command.all.Find("goto").Use(who, where.name);
if (who.level == where) if (who.level == where)
@ -70,7 +72,9 @@ namespace MCGalaxy.Commands
{ {
who = PlayerInfo.FindOrShowMatches(p, param[0]); who = PlayerInfo.FindOrShowMatches(p, param[0]);
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { Player.SendMessage(p, "Cannot move someone of greater rank"); return; } if (p != null && who.group.Permission > p.group.Permission) {
MessageTooHighRank(p, "move", true); return;
}
message = message.Substring(message.IndexOf(' ') + 1); message = message.Substring(message.IndexOf(' ') + 1);
} }
else else

View File

@ -37,7 +37,7 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, parts[0]); Player who = PlayerInfo.FindOrShowMatches(p, parts[0]);
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "Cannot change the nick of someone of greater rank"); return; MessageTooHighRank(p, "change the nick of", true); return;
} }
string newName = parts.Length > 1 ? parts[1] : ""; string newName = parts.Length > 1 ? parts[1] : "";

View File

@ -33,7 +33,7 @@ namespace MCGalaxy.Commands {
Player target = PlayerInfo.FindOrShowMatches(p, parts[0]); Player target = PlayerInfo.FindOrShowMatches(p, parts[0]);
if (target == null) return; if (target == null) return;
if (p != null && p.group.Permission < target.group.Permission) { if (p != null && p.group.Permission < target.group.Permission) {
Player.SendMessage(p, "Cannot use this on someone of equal or greater rank."); return; MessageTooHighRank(p, "send commands for", true); return;
} }
if (parts.Length == 1) { if (parts.Length == 1) {
Player.SendMessage(p, "No command name given."); return; Player.SendMessage(p, "No command name given."); return;

View File

@ -48,7 +48,7 @@ namespace MCGalaxy.Commands
Player who = PlayerInfo.FindOrShowMatches(p, message); Player who = PlayerInfo.FindOrShowMatches(p, message);
if (who == null) return; if (who == null) return;
if (p.group.Permission < who.group.Permission) { if (p.group.Permission < who.group.Permission) {
Player.SendMessage(p, "You cannot summon someone ranked higher than you!"); return; MessageTooHighRank(p, "summon", true); return;
} }
if (p.level != who.level) if (p.level != who.level)

View File

@ -35,7 +35,7 @@ namespace MCGalaxy.Commands {
Player who = PlayerInfo.FindOrShowMatches(p, parts[0]); Player who = PlayerInfo.FindOrShowMatches(p, parts[0]);
if (who == null) return; if (who == null) return;
if (p != null && who.group.Permission > p.group.Permission) { if (p != null && who.group.Permission > p.group.Permission) {
Player.SendMessage(p, "Cannot change the title of someone of greater rank"); return; MessageTooHighRank(p, "change the title of", true); return;
} }
string newTitle = parts.Length > 1 ? parts[1] : ""; string newTitle = parts.Length > 1 ? parts[1] : "";

View File

@ -36,7 +36,7 @@ namespace MCGalaxy.Commands {
} }
if (!Server.higherranktp && p.group.Permission < target.group.Permission) { if (!Server.higherranktp && p.group.Permission < target.group.Permission) {
Player.SendMessage(p, "You cannot teleport to a player of higher rank!"); return; MessageTooHighRank(p, "teleport to", true); return;
} }
p.beforeTeleportMap = p.level.name; p.beforeTeleportMap = p.level.name;
p.beforeTeleportPos = p.pos; p.beforeTeleportPos = p.pos;

View File

@ -34,7 +34,7 @@ namespace MCGalaxy.Commands {
Player.SendMessage(p, "Use /spawn to respawn yourself."); return; Player.SendMessage(p, "Use /spawn to respawn yourself."); return;
} }
if (p != null && pl.group.Permission >= p.group.Permission) { if (p != null && pl.group.Permission >= p.group.Permission) {
Player.SendMessage(p, "Cannot respawn someone of greater or same rank"); return; MessageTooHighRank(p, "respawn", false); return;
} }
Command.all.Find("spawn").Use(pl, ""); Command.all.Find("spawn").Use(pl, "");

View File

@ -27,6 +27,21 @@ namespace MCGalaxy.Games {
public sealed partial class ZombieGame { public sealed partial class ZombieGame {
void MainLoop() { void MainLoop() {
// Make sure that in the worst case, we do not crash the entire server.
try {
MainLoopCore();
} catch (Exception ex) {
Server.ErrorLog(ex);
Player.GlobalMessage("&cZombie survival disabled due to an error.");
try {
ResetState();
} catch (Exception ex2) {
Server.ErrorLog(ex2);
}
}
}
void MainLoopCore() {
if (Status == ZombieGameStatus.NotStarted) return; if (Status == ZombieGameStatus.NotStarted) return;
if (!initialChangeLevel) { if (!initialChangeLevel) {
ChooseNextLevel(); ChooseNextLevel();
@ -110,19 +125,19 @@ namespace MCGalaxy.Games {
List<Player> DoRoundCountdown() { List<Player> DoRoundCountdown() {
while (true) { while (true) {
RoundStart = DateTime.UtcNow.AddSeconds(30); RoundStart = DateTime.UtcNow.AddSeconds(30);
CurLevel.ChatLevel("%4Round Start:%f 30..."); CurLevel.ChatLevel("&4Round Start:&f 30...");
Thread.Sleep(20000); if (!Running) return null; Thread.Sleep(20000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 10..."); CurLevel.ChatLevel("&4Round Start:&f 10...");
Thread.Sleep(10000); if (!Running) return null; Thread.Sleep(10000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 5..."); CurLevel.ChatLevel("&4Round Start:&f 5...");
Thread.Sleep(1000); if (!Running) return null; Thread.Sleep(1000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 4..."); CurLevel.ChatLevel("&4Round Start:&f 4...");
Thread.Sleep(1000); if (!Running) return null; Thread.Sleep(1000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 3..."); CurLevel.ChatLevel("&4Round Start:&f 3...");
Thread.Sleep(1000); if (!Running) return null; Thread.Sleep(1000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 2..."); CurLevel.ChatLevel("&4Round Start:&f 2...");
Thread.Sleep(1000); if (!Running) return null; Thread.Sleep(1000); if (!Running) return null;
CurLevel.ChatLevel("%4Round Start:%f 1..."); CurLevel.ChatLevel("&4Round Start:&f 1...");
Thread.Sleep(1000); if (!Running) return null; Thread.Sleep(1000); if (!Running) return null;
int nonRefPlayers = 0; int nonRefPlayers = 0;
List<Player> players = new List<Player>(); List<Player> players = new List<Player>();
@ -136,7 +151,7 @@ namespace MCGalaxy.Games {
} }
if (nonRefPlayers >= 2) return players; if (nonRefPlayers >= 2) return players;
CurLevel.ChatLevel(Colors.red + "ERROR: Need 2 or more players to play"); CurLevel.ChatLevel("&cNeed 2 or more players to start a round.");
} }
} }

View File

@ -87,7 +87,7 @@ namespace MCGalaxy.Games {
Player[] players = p.Game.Infected ? Infected.Items : Alive.Items; Player[] players = p.Game.Infected ? Infected.Items : Alive.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) foreach (Player pl in players)
pl.SendMessage(p.color + p.DisplayName + type + message.Substring(1)); pl.SendMessage(p.color + p.DisplayName + 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) {
@ -122,7 +122,7 @@ namespace MCGalaxy.Games {
} }
public override void PlayerJoinedLevel(Player p, Level lvl, Level oldLvl) { public override void PlayerJoinedLevel(Player p, Level lvl, Level oldLvl) {
p.SendCpeMessage(CpeMessageType.BottomRight2, ""); p.SendCpeMessage(CpeMessageType.BottomRight2, "");
p.SendCpeMessage(CpeMessageType.BottomRight1, ""); p.SendCpeMessage(CpeMessageType.BottomRight1, "");
if (RoundInProgress && lvl.name.CaselessEq(CurLevelName)) { if (RoundInProgress && lvl.name.CaselessEq(CurLevelName)) {
if (Running && p != null) { if (Running && p != null) {
@ -152,30 +152,36 @@ namespace MCGalaxy.Games {
return; return;
} }
p.SendCpeMessage(CpeMessageType.Status1, ""); ResetCpeMessages(p);
p.SendCpeMessage(CpeMessageType.Status2, "");
p.SendCpeMessage(CpeMessageType.Status3, "");
Alive.Remove(p); Alive.Remove(p);
Infected.Remove(p); Infected.Remove(p);
if (oldLvl != null && oldLvl.name.CaselessEq(CurLevelName)) if (oldLvl != null && oldLvl.name.CaselessEq(CurLevelName))
UpdateAllPlayerStatus(); UpdateAllPlayerStatus();
} }
void ResetCpeMessages(Player p) {
p.SendCpeMessage(CpeMessageType.Status1, "");
p.SendCpeMessage(CpeMessageType.Status2, "");
p.SendCpeMessage(CpeMessageType.Status3, "");
p.SendCpeMessage(CpeMessageType.BottomRight1, "");
p.SendCpeMessage(CpeMessageType.BottomRight2, "");
}
public override bool PlayerCanJoinLevel(Player p, Level lvl, Level oldLvl) { public override bool PlayerCanJoinLevel(Player p, Level lvl, Level oldLvl) {
if (!oldLvl.name.CaselessEq(CurLevelName)) return true; if (!oldLvl.name.CaselessEq(CurLevelName)) return true;
if (lvl.name.CaselessEq(CurLevelName)) return true; if (lvl.name.CaselessEq(CurLevelName)) return true;
if (RoundInProgress && !p.Game.Referee) { if (RoundInProgress && !p.Game.Referee) {
p.SendMessage("Sorry, you cannot leave a zombie survival map until the current round has ended."); p.SendMessage("Sorry, you cannot leave a zombie survival map until the current round has ended.");
return false; return false;
} }
return true; return true;
} }
public override void PlayerMoneyChanged(Player p) { public override void PlayerMoneyChanged(Player p) {
if (!Running || !p.level.name.CaselessEq(CurLevelName)) return; if (!Running || !p.level.name.CaselessEq(CurLevelName)) return;
string moneyMsg = "&a" + p.money + " %S" + Server.moneys; string moneyMsg = "&a" + p.money + " %S" + Server.moneys;
string stateMsg = " and you are " + (p.Game.Infected ? "&cdead" : "&aalive"); string stateMsg = " and you are " + (p.Game.Infected ? "&cdead" : "&aalive");
p.SendCpeMessage(CpeMessageType.Status3, moneyMsg + stateMsg); p.SendCpeMessage(CpeMessageType.Status3, moneyMsg + stateMsg);
} }
} }

View File

@ -203,15 +203,18 @@ namespace MCGalaxy.Games {
RoundInProgress = false; RoundInProgress = false;
RoundStart = DateTime.MinValue; RoundStart = DateTime.MinValue;
RoundEnd = DateTime.MinValue; RoundEnd = DateTime.MinValue;
Player[] online = PlayerInfo.Online.Items;
foreach (Player pl in online) {
pl.Game.RatedMap = false;
pl.Game.PledgeSurvive = false;
if (pl.level == null || !pl.level.name.CaselessEq(CurLevelName))
continue;
ResetCpeMessages(pl);
}
LastLevelName = ""; LastLevelName = "";
CurLevelName = ""; CurLevelName = "";
CurLevel = null; CurLevel = null;
Player[] online = PlayerInfo.Online.Items;
foreach (Player pl in online) {
pl.Game.RatedMap = false;
pl.Game.PledgeSurvive = false;
}
} }
void UpdatePlayerStatus(Player p) { void UpdatePlayerStatus(Player p) {

View File

@ -83,8 +83,8 @@ namespace MCGalaxy {
AddExtension(enc.GetString(message, 0, 64).Trim(), NetUtils.ReadI32(message, 64)); AddExtension(enc.GetString(message, 0, 64).Trim(), NetUtils.ReadI32(message, 64));
extensionCount--; extensionCount--;
if (extensionCount <= 0 && !finishedCpeLogin) { if (extensionCount <= 0 && !finishedCpeLogin) {
CompleteLoginProcess(); CompleteLoginProcess();
finishedCpeLogin = true; finishedCpeLogin = true;
} }
} }
@ -105,13 +105,13 @@ namespace MCGalaxy {
} }
public void SendRaw(int id) { public void SendRaw(int id) {
byte[] buffer = new [] { (byte)id }; byte[] buffer = new [] { (byte)id };
SendRaw(buffer); SendRaw(buffer);
} }
public void SendRaw(int id, byte data) { public void SendRaw(int id, byte data) {
byte[] buffer = new [] { (byte)id, data }; byte[] buffer = new [] { (byte)id, data };
SendRaw(buffer); SendRaw(buffer);
} }
[Obsolete("Include the opcode in the array to avoid an extra temp allocation.")] [Obsolete("Include the opcode in the array to avoid an extra temp allocation.")]
@ -135,7 +135,7 @@ namespace MCGalaxy {
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, delegate(IAsyncResult result) { }, null); socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, delegate(IAsyncResult result) { }, null);
buffer = null; buffer = null;
} catch (SocketException e) { } catch (SocketException e) {
buffer = null; buffer = null;
Disconnect(); Disconnect();
#if DEBUG #if DEBUG
Server.ErrorLog(e); Server.ErrorLog(e);
@ -147,7 +147,7 @@ namespace MCGalaxy {
} }
public void SendBlankMessage() { public void SendBlankMessage() {
byte[] buffer = new byte[66]; byte[] buffer = new byte[66];
buffer[0] = Opcode.Message; buffer[0] = Opcode.Message;
NetUtils.WriteAscii("", buffer, 2); NetUtils.WriteAscii("", buffer, 2);
SendRaw(buffer); SendRaw(buffer);
@ -174,14 +174,14 @@ namespace MCGalaxy {
} }
public void SendMessage(string message) { public void SendMessage(string message) {
SendMessage(0, Server.DefaultColor + message, true); SendMessage(0, Server.DefaultColor + message, true);
} }
public void SendMessage(string message, bool colorParse) { public void SendMessage(string message, bool colorParse) {
SendMessage(0, Server.DefaultColor + message, colorParse); SendMessage(0, Server.DefaultColor + message, colorParse);
} }
public void SendMessage(byte id, string message, bool colorParse = true) { public void SendMessage(byte id, string message, bool colorParse = true) {
message = ConvertMessage(message, colorParse); message = ConvertMessage(message, colorParse);
int totalTries = 0; int totalTries = 0;
if ( MessageRecieve != null ) if ( MessageRecieve != null )
@ -225,7 +225,7 @@ namespace MCGalaxy {
else return; else return;
} }
message = ConvertMessage(message, colorParse); message = ConvertMessage(message, colorParse);
byte[] buffer = new byte[66]; byte[] buffer = new byte[66];
buffer[0] = Opcode.Message; buffer[0] = Opcode.Message;
buffer[1] = (byte)id; buffer[1] = (byte)id;
@ -240,7 +240,7 @@ namespace MCGalaxy {
if (colorParse) if (colorParse)
message = Colors.EscapeColors(message); message = Colors.EscapeColors(message);
StringBuilder sb = new StringBuilder(message); StringBuilder sb = new StringBuilder(message);
if (colorParse) if (colorParse)
ParseColors(sb); ParseColors(sb);
Chat.ApplyTokens(sb, this, colorParse); Chat.ApplyTokens(sb, this, colorParse);
@ -297,14 +297,14 @@ namespace MCGalaxy {
if (level.motd == "ignore") { if (level.motd == "ignore") {
NetUtils.WriteAscii(Server.name, buffer, 2); NetUtils.WriteAscii(Server.name, buffer, 2);
if (!String.IsNullOrEmpty(group.MOTD) ) if (!String.IsNullOrEmpty(group.MOTD) )
NetUtils.WriteAscii(group.MOTD, buffer, 66); NetUtils.WriteAscii(group.MOTD, buffer, 66);
else else
NetUtils.WriteAscii(Server.motd, buffer, 66); NetUtils.WriteAscii(Server.motd, buffer, 66);
} else { } else {
NetUtils.WriteAscii(level.motd, buffer, 2); NetUtils.WriteAscii(level.motd, buffer, 2);
if (level.motd.Length > 64) if (level.motd.Length > 64)
NetUtils.WriteAscii(level.motd.Substring(64), buffer, 66); NetUtils.WriteAscii(level.motd.Substring(64), buffer, 66);
} }
bool canPlace = Block.canPlace(this, Block.blackrock); bool canPlace = Block.canPlace(this, Block.blackrock);
@ -331,8 +331,8 @@ namespace MCGalaxy {
} }
SendRaw(Opcode.LevelInitialise); SendRaw(Opcode.LevelInitialise);
int totalRead = 0; int totalRead = 0;
while (totalRead < usedLength) { while (totalRead < usedLength) {
byte[] packet = new byte[1028]; // need each packet separate for Mono byte[] packet = new byte[1028]; // need each packet separate for Mono
packet[0] = Opcode.LevelDataChunk; packet[0] = Opcode.LevelDataChunk;
short length = (short)Math.Min(buffer.Length - totalRead, 1024); short length = (short)Math.Min(buffer.Length - totalRead, 1024);
@ -340,7 +340,7 @@ namespace MCGalaxy {
Buffer.BlockCopy(buffer, totalRead, packet, 3, length); Buffer.BlockCopy(buffer, totalRead, packet, 3, length);
packet[1027] = (byte)(100 * (float)totalRead / buffer.Length); packet[1027] = (byte)(100 * (float)totalRead / buffer.Length);
SendRaw(packet); SendRaw(packet);
if (ip != "127.0.0.1") if (ip != "127.0.0.1")
Thread.Sleep(Server.updateTimer.Interval > 1000 ? 100 : 10); Thread.Sleep(Server.updateTimer.Interval > 1000 ? 100 : 10);
totalRead += length; totalRead += length;
@ -380,12 +380,22 @@ namespace MCGalaxy {
return success; return success;
} }
byte[] CompressRawMap(out int usedLength) { unsafe byte[] CompressRawMap(out int usedLength) {
const int bufferSize = 64 * 1024; const int bufferSize = 64 * 1024;
byte[] buffer = new byte[bufferSize]; byte[] buffer = new byte[bufferSize];
MemoryStream temp = new MemoryStream(); MemoryStream temp = new MemoryStream();
int bIndex = 0; int bIndex = 0;
// Store locally instead of performing func call for every block in map
byte* conv = stackalloc byte[256];
byte* convCPE = stackalloc byte[256];
for (int i = 0; i < 256; i++)
conv[i] = Block.Convert((byte)i);
if (!hasCustomBlocks) {
for (int i = 0; i < 256; i++)
convCPE[i] = Block.ConvertCPE((byte)i);
}
using (GZipStream compressor = new GZipStream(temp, CompressionMode.Compress, true)) { using (GZipStream compressor = new GZipStream(temp, CompressionMode.Compress, true)) {
NetUtils.WriteI32(level.blocks.Length, buffer, 0); NetUtils.WriteI32(level.blocks.Length, buffer, 0);
compressor.Write(buffer, 0, sizeof(int)); compressor.Write(buffer, 0, sizeof(int));
@ -398,7 +408,7 @@ namespace MCGalaxy {
if (hasBlockDefs) buffer[bIndex] = level.GetExtTile(i); if (hasBlockDefs) buffer[bIndex] = level.GetExtTile(i);
else buffer[bIndex] = level.GetFallbackExtTile(i); else buffer[bIndex] = level.GetFallbackExtTile(i);
} else { } else {
buffer[bIndex] = Block.Convert(block); buffer[bIndex] = conv[block];
} }
bIndex++; bIndex++;
@ -410,10 +420,10 @@ namespace MCGalaxy {
for (int i = 0; i < level.blocks.Length; ++i) { for (int i = 0; i < level.blocks.Length; ++i) {
byte block = level.blocks[i]; byte block = level.blocks[i];
if (block == Block.custom_block) { if (block == Block.custom_block) {
if (hasBlockDefs) buffer[bIndex] = Block.ConvertCPE(level.GetExtTile(i)); if (hasBlockDefs) buffer[bIndex] = convCPE[level.GetExtTile(i)];
else buffer[bIndex] = Block.ConvertCPE(level.GetFallbackExtTile(i)); else buffer[bIndex] = convCPE[level.GetFallbackExtTile(i)];
} else { } else {
buffer[bIndex] = Block.Convert(Block.ConvertCPE(level.blocks[i])); buffer[bIndex] = convCPE[conv[block]];
} }
bIndex++; bIndex++;
@ -421,7 +431,7 @@ namespace MCGalaxy {
compressor.Write(buffer, 0, bufferSize); bIndex = 0; compressor.Write(buffer, 0, bufferSize); bIndex = 0;
} }
} }
} }
if (bIndex > 0) compressor.Write(buffer, 0, bIndex); if (bIndex > 0) compressor.Write(buffer, 0, bIndex);
} }
usedLength = (int)temp.Length; usedLength = (int)temp.Length;
@ -429,12 +439,12 @@ namespace MCGalaxy {
} }
void RemoveOldLevelCustomBlocks(Level oldLevel) { void RemoveOldLevelCustomBlocks(Level oldLevel) {
BlockDefinition[] defs = oldLevel.CustomBlockDefs; BlockDefinition[] defs = oldLevel.CustomBlockDefs;
for (int i = Block.CpeCount; i < 256; i++) { for (int i = Block.CpeCount; i < 256; i++) {
BlockDefinition def = defs[i]; BlockDefinition def = defs[i];
if (def == null || def == BlockDefinition.GlobalDefs[i]) continue; if (def == null || def == BlockDefinition.GlobalDefs[i]) continue;
SendRaw(Opcode.CpeRemoveBlockDefinition, (byte)i); SendRaw(Opcode.CpeRemoveBlockDefinition, (byte)i);
} }
} }
public void SendSpawn(byte id, string name, ushort x, ushort y, ushort z, byte rotx, byte roty) { public void SendSpawn(byte id, string name, ushort x, ushort y, ushort z, byte rotx, byte roty) {
@ -445,12 +455,12 @@ namespace MCGalaxy {
NetUtils.WriteU16(x, buffer, 66); NetUtils.WriteU16(x, buffer, 66);
NetUtils.WriteU16(y, buffer, 68); NetUtils.WriteU16(y, buffer, 68);
NetUtils.WriteU16(z, buffer, 70); NetUtils.WriteU16(z, buffer, 70);
buffer[72] = rotx; buffer[72] = rotx;
buffer[73] = roty; buffer[73] = roty;
SendRaw(buffer); SendRaw(buffer);
if (HasCpeExt(CpeExt.ChangeModel)) if (HasCpeExt(CpeExt.ChangeModel))
UpdateModels(); UpdateModels();
} }
public void SendPos(byte id, ushort x, ushort y, ushort z, byte rotx, byte roty) { public void SendPos(byte id, ushort x, ushort y, ushort z, byte rotx, byte roty) {
@ -466,13 +476,13 @@ namespace MCGalaxy {
pos[0] = x; pos[1] = y; pos[2] = z; pos[0] = x; pos[1] = y; pos[2] = z;
rot[0] = rotx; rot[1] = roty; rot[0] = rotx; rot[1] = roty;
byte[] buffer = new byte[10]; byte[] buffer = new byte[10];
buffer[0] = Opcode.EntityTeleport; buffer[0] = Opcode.EntityTeleport;
buffer[1] = id; buffer[1] = id;
NetUtils.WriteU16(x, buffer, 2); NetUtils.WriteU16(x, buffer, 2);
NetUtils.WriteU16(y, buffer, 4); NetUtils.WriteU16(y, buffer, 4);
NetUtils.WriteU16(z, buffer, 6); NetUtils.WriteU16(z, buffer, 6);
buffer[8] = rotx; buffer[8] = rotx;
buffer[9] = roty; buffer[9] = roty;
SendRaw(buffer); SendRaw(buffer);
} }
@ -482,8 +492,8 @@ namespace MCGalaxy {
} }
//TODO: Figure a way to SendPos without changing rotation //TODO: Figure a way to SendPos without changing rotation
public void SendDespawn(byte id) { public void SendDespawn(byte id) {
SendRaw(Opcode.RemoveEntity, id); SendRaw(Opcode.RemoveEntity, id);
} }
public void SendBlockchange(ushort x, ushort y, ushort z, byte type) { public void SendBlockchange(ushort x, ushort y, ushort z, byte type) {
@ -497,14 +507,14 @@ namespace MCGalaxy {
NetUtils.WriteU16(z, buffer, 5); NetUtils.WriteU16(z, buffer, 5);
if (type == Block.custom_block) { if (type == Block.custom_block) {
if (hasBlockDefs) if (hasBlockDefs)
buffer[7] = level.GetExtTile(x, y, z); buffer[7] = level.GetExtTile(x, y, z);
else else
buffer[7] = level.GetFallbackExtTile(x, y, z); buffer[7] = level.GetFallbackExtTile(x, y, z);
} else if (hasCustomBlocks) { } else if (hasCustomBlocks) {
buffer[7] = Block.Convert(type); buffer[7] = Block.Convert(type);
} else { } else {
buffer[7] = Block.Convert(Block.ConvertCPE(type)); buffer[7] = Block.Convert(Block.ConvertCPE(type));
} }
SendRaw(buffer); SendRaw(buffer);
} }
@ -521,27 +531,27 @@ namespace MCGalaxy {
NetUtils.WriteU16(z, buffer, 5); NetUtils.WriteU16(z, buffer, 5);
if (type == Block.custom_block) { if (type == Block.custom_block) {
if (hasBlockDefs) if (hasBlockDefs)
buffer[7] = extType; buffer[7] = extType;
else else
buffer[7] = level.GetFallback(extType); buffer[7] = level.GetFallback(extType);
} else if (hasCustomBlocks) { } else if (hasCustomBlocks) {
buffer[7] = Block.Convert(type); buffer[7] = Block.Convert(type);
} else { } else {
buffer[7] = Block.Convert(Block.ConvertCPE(type)); buffer[7] = Block.Convert(Block.ConvertCPE(type));
} }
SendRaw(buffer); SendRaw(buffer);
} }
void SendKick(string message, bool sync) { void SendKick(string message, bool sync) {
byte[] buffer = new byte[65]; byte[] buffer = new byte[65];
buffer[0] = Opcode.Kick; buffer[0] = Opcode.Kick;
NetUtils.WriteAscii(message, buffer, 1); NetUtils.WriteAscii(message, buffer, 1);
SendRaw(buffer, sync); SendRaw(buffer, sync);
} }
void SendPing() { void SendPing() {
SendRaw(Opcode.Ping); SendRaw(Opcode.Ping);
} }
void SendExtInfo( byte count ) { void SendExtInfo( byte count ) {
@ -553,14 +563,14 @@ namespace MCGalaxy {
} }
void SendExtEntry( string name, int version ) { void SendExtEntry( string name, int version ) {
byte[] buffer = new byte[69]; byte[] buffer = new byte[69];
buffer[0] = Opcode.CpeExtEntry; buffer[0] = Opcode.CpeExtEntry;
NetUtils.WriteAscii(name, buffer, 1); NetUtils.WriteAscii(name, buffer, 1);
NetUtils.WriteI32(version, buffer, 65); NetUtils.WriteI32(version, buffer, 65);
SendRaw(buffer, true); SendRaw(buffer, true);
} }
public void SendClickDistance( short distance ) { public void SendClickDistance( short distance ) {
byte[] buffer = new byte[3]; byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeSetClickDistance; buffer[0] = Opcode.CpeSetClickDistance;
NetUtils.WriteI16(distance, buffer, 1); NetUtils.WriteI16(distance, buffer, 1);
@ -668,8 +678,8 @@ namespace MCGalaxy {
} }
public void SendSetMapAppearance( string url, byte sideblock, byte edgeblock, short sidelevel ) { public void SendSetMapAppearance( string url, byte sideblock, byte edgeblock, short sidelevel ) {
byte[] buffer = new byte[69]; byte[] buffer = new byte[69];
buffer[0] = Opcode.CpeEnvSetMapApperance; buffer[0] = Opcode.CpeEnvSetMapApperance;
NetUtils.WriteAscii(url, buffer, 1); NetUtils.WriteAscii(url, buffer, 1);
buffer[65] = sideblock; buffer[65] = sideblock;
buffer[66] = edgeblock; buffer[66] = edgeblock;
@ -677,10 +687,10 @@ namespace MCGalaxy {
SendRaw(buffer); SendRaw(buffer);
} }
public void SendSetMapAppearanceV2( string url, byte sideblock, byte edgeblock, short sidelevel, public void SendSetMapAppearanceV2( string url, byte sideblock, byte edgeblock, short sidelevel,
short cloudHeight, short maxFog ) { short cloudHeight, short maxFog ) {
byte[] buffer = new byte[73]; byte[] buffer = new byte[73];
buffer[0] = Opcode.CpeEnvSetMapApperance; buffer[0] = Opcode.CpeEnvSetMapApperance;
NetUtils.WriteAscii(url, buffer, 1); NetUtils.WriteAscii(url, buffer, 1);
buffer[65] = sideblock; buffer[65] = sideblock;
buffer[66] = edgeblock; buffer[66] = edgeblock;
@ -694,7 +704,7 @@ namespace MCGalaxy {
SendRaw(Opcode.CpeEnvWeatherType, weather); SendRaw(Opcode.CpeEnvWeatherType, weather);
} }
void SendHackControl( byte allowflying, byte allownoclip, byte allowspeeding, byte allowrespawning, void SendHackControl( byte allowflying, byte allownoclip, byte allowspeeding, byte allowrespawning,
byte allowthirdperson, short maxjumpheight ) { byte allowthirdperson, short maxjumpheight ) {
byte[] buffer = new byte[8]; byte[] buffer = new byte[8];
buffer[0] = Opcode.CpeHackControl; buffer[0] = Opcode.CpeHackControl;
@ -708,11 +718,11 @@ namespace MCGalaxy {
} }
void UpdatePosition() { void UpdatePosition() {
//pingDelayTimer.Stop(); //pingDelayTimer.Stop();
byte[] packet = NetUtils.GetPositionPacket(id, pos, oldpos, rot, oldrot, MakePitch(), false); byte[] packet = NetUtils.GetPositionPacket(id, pos, oldpos, rot, oldrot, MakePitch(), false);
oldpos = pos; oldrot = rot; oldpos = pos; oldrot = rot;
if (packet == null) return; if (packet == null) return;
Player[] players = PlayerInfo.Online.Items; Player[] players = PlayerInfo.Online.Items;
foreach (Player p in players) { foreach (Player p in players) {
if (p != this && p.level == level) p.SendRaw(packet); if (p != this && p.level == level) p.SendRaw(packet);
@ -720,12 +730,12 @@ namespace MCGalaxy {
} }
byte MakePitch() { byte MakePitch() {
if (Server.flipHead || flipHead) if (Server.flipHead || flipHead)
if (rot[1] > 64 && rot[1] < 192) if (rot[1] > 64 && rot[1] < 192)
return rot[1]; return rot[1];
else else
return 128; return 128;
return rot[1]; return rot[1];
} }
internal void CloseSocket() { internal void CloseSocket() {