Modularise /goto, and also load unloaded levels that exactly match the message before resolving to partially match currently loaded levels. (Thanks FabTheZen)

This commit is contained in:
UnknownShadow200 2016-01-29 16:20:55 +11:00
parent b598359545
commit 063c8794f5
2 changed files with 141 additions and 144 deletions

View File

@ -1,26 +1,26 @@
/*
Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy)
Dual-licensed under the Educational Community License, Version 2.0 and
the GNU General Public License, Version 3 (the "Licenses"); you may
not use this file except in compliance with the Licenses. You may
obtain a copy of the Licenses at
http://www.opensource.org/licenses/ecl2.php
http://www.gnu.org/licenses/gpl-3.0.html
Unless required by applicable law or agreed to in writing,
software distributed under the Licenses are distributed on an "AS IS"
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
or implied. See the Licenses for the specific language governing
permissions and limitations under the Licenses.
*/
Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy)
Dual-licensed under the Educational Community License, Version 2.0 and
the GNU General Public License, Version 3 (the "Licenses"); you may
not use this file except in compliance with the Licenses. You may
obtain a copy of the Licenses at
http://www.opensource.org/licenses/ecl2.php
http://www.gnu.org/licenses/gpl-3.0.html
Unless required by applicable law or agreed to in writing,
software distributed under the Licenses are distributed on an "AS IS"
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
or implied. See the Licenses for the specific language governing
permissions and limitations under the Licenses.
*/
using System;
using System.IO;
namespace MCGalaxy.Commands
{
public sealed class CmdGoto : Command
{
namespace MCGalaxy.Commands {
public sealed class CmdGoto : Command {
public override string name { get { return "goto"; } }
public override string shortcut { get { return "g"; } }
public override string type { get { return CommandTypes.World; } }
@ -28,143 +28,139 @@ namespace MCGalaxy.Commands
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public CmdGoto() { }
public override void Use(Player p, string message)
{
public override void Use(Player p, string message) {
if (p == null) { MessageInGameOnly(p); return; }
if (message == "") { Help(p); return; }
try
{
Level foundLevel = Level.Find(message);
if (foundLevel != null)
{
Level startLevel = p.level;
GC.Collect();
if (p.level == foundLevel) { Player.SendMessage(p, "You are already in \"" + foundLevel.name + "\"."); return; }
bool blacklisted = Player.BlacklistCheck(p.name, message);
if (blacklisted) { Player.SendMessage(p, "You are blacklisted from " + foundLevel.name + "."); return; }
if (!p.ignorePermission)
if (p.group.Permission < foundLevel.permissionvisit) { Player.SendMessage(p, "You're not allowed to go to " + foundLevel.name + "."); return; }
if (!p.ignorePermission)
if (p.group.Permission > foundLevel.pervisitmax) { if (!p.group.CanExecute(Command.all.Find("pervisitmax"))) { Player.SendMessage(p, "Your rank must be " + foundLevel.pervisitmax + " or lower to go there!"); return; } }
{
if (!File.Exists("text/lockdown/map/" + message + ""))
{
p.Loading = true;
foreach (Player pl in Player.players) if (p.level == pl.level && p != pl) p.SendDespawn(pl.id);
foreach (PlayerBot b in PlayerBot.playerbots) if (p.level == b.level) p.SendDespawn(b.id);
Player.GlobalDespawn(p, true);
Level oldLevel = p.level;
p.level = foundLevel; p.SendUserMOTD(); p.SendMap(oldLevel);
GC.Collect();
ushort x = (ushort)((0.5 + foundLevel.spawnx) * 32);
ushort y = (ushort)((1 + foundLevel.spawny) * 32);
ushort z = (ushort)((0.5 + foundLevel.spawnz) * 32);
if (!p.hidden) Player.GlobalSpawn(p, x, y, z, foundLevel.rotx, foundLevel.roty, true, "");
else p.SendPos(0xFF, x, y, z, foundLevel.rotx, foundLevel.roty);
foreach (Player pl in Player.players)
if (pl.level == p.level && p != pl && !pl.hidden)
p.SendSpawn(pl.id, pl.color + pl.name, pl.pos[0], pl.pos[1], pl.pos[2], pl.rot[0], pl.rot[1]);
foreach (PlayerBot b in PlayerBot.playerbots)
if (b.level == p.level)
p.SendSpawn(b.id, b.color + b.name, b.pos[0], b.pos[1], b.pos[2], b.rot[0], b.rot[1]);
if (!p.hidden) Player.GlobalChat(p, p.color + "*" + p.DisplayName + Server.DefaultColor + " went to &b" + foundLevel.name, false);
p.Loading = false;
bool skipUnload = false;
if (startLevel.unload && !startLevel.name.Contains("&cMuseum "))
{
foreach (Player pl in Player.players) if (pl.level == startLevel) { skipUnload = true; break; }
if (!skipUnload && Server.AutoLoad) startLevel.Unload(true);
}
if (Server.lava.active && !Server.lava.sendingPlayers && Server.lava.map == foundLevel)
{
if (Server.lava.roundActive)
{
Server.lava.AnnounceRoundInfo(p);
Server.lava.AnnounceTimeLeft(!Server.lava.flooded, true, p);
}
else
{
Player.SendMessage(p, "Vote for the next map!");
Player.SendMessage(p, "Choices: " + Server.lava.VoteString);
}
}
if (Server.zombie.GameInProgess())
{
if (p.level.name == Server.zombie.currentLevelName)
Server.zombie.InfectedPlayerLogin(p);
}
if (p.level.name != Server.zombie.currentLevelName)
{
if(ZombieGame.alive.Contains(p))
ZombieGame.alive.Remove(p);
if (ZombieGame.infectd.Contains(p))
ZombieGame.infectd.Remove(p);
}
if (p.inTNTwarsMap)
{
p.canBuild = true;
}
if (TntWarsGame.Find(p.level) != null)
{
if (TntWarsGame.Find(p.level).GameStatus != TntWarsGame.TntWarsGameStatus.Finished && TntWarsGame.Find(p.level).GameStatus != TntWarsGame.TntWarsGameStatus.WaitingForPlayers)
{
p.canBuild = false;
Player.SendMessage(p, "TNT Wars: Disabled your building because you are in a TNT Wars map!");
}
p.inTNTwarsMap = true;
}
if (!p.hidden) { Server.IRC.Say(p.color + p.DisplayName + " %rwent to &8" + foundLevel.name, false, true); }
}
else Player.SendMessage(p, "The level " + message + " is locked.");
}
}
else if (Server.AutoLoad)
{
if (!File.Exists("levels/" + message + ".lvl"))
{
Level lvl = Level.FindExact(message);
if (lvl != null) {
GoToLevel(p, lvl, message);
} else if (Server.AutoLoad) {
if (!File.Exists("levels/" + message + ".lvl")) {
lvl = Level.Find(message);
if (lvl == null) {
Player.SendMessage(p, "Level \"" + message + "\" doesn't exist! Did you mean...");
Command.all.Find("search").Use(p, "levels " + message);
} else {
GoToLevel(p, lvl, message);
}
else if (Level.Find(message) != null || Level.CheckLoadOnGoto(message))
{
Command.all.Find("load").Use(p, message);
foundLevel = Level.Find(message);
if (foundLevel != null) Use(p, message);
} else if (Level.CheckLoadOnGoto(message)) {
Command.all.Find("load").Use(p, message);
lvl = Level.Find(message);
if (lvl != null) {
GoToLevel(p, lvl, message);
}
else
Player.SendMessage(p, "Level \"" + message + "\" cannot be loaded using /goto!");
} else {
if (lvl == null) {
Player.SendMessage(p, "Level \"" + message + "\" cannot be loaded using /goto!");
} else {
GoToLevel(p, lvl, message);
}
}
else
{
} else {
lvl = Level.Find(message);
if (lvl == null) {
Player.SendMessage(p, "There is no level \"" + message + "\" loaded. Did you mean..");
Command.all.Find("search").Use(p, "levels " + message);
} else {
GoToLevel(p, lvl, message);
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
catch (Exception e) { Server.ErrorLog(e); }
GC.Collect();
GC.WaitForPendingFinalizers();
}
public override void Help(Player p)
{
void GoToLevel(Player p, Level lvl, string message) {
if (p.level == lvl) { Player.SendMessage(p, "You are already in \"" + lvl.name + "\"."); return; }
if (Player.BlacklistCheck(p.name, message)) {
Player.SendMessage(p, "You are blacklisted from " + lvl.name + "."); return;
}
if (!p.ignorePermission && p.group.Permission < lvl.permissionvisit) {
Player.SendMessage(p, "You're not allowed to go to " + lvl.name + "."); return;
}
if (!p.ignorePermission && p.group.Permission > lvl.pervisitmax && !p.group.CanExecute(Command.all.Find("pervisitmax"))) {
Player.SendMessage(p, "Your rank must be " + lvl.pervisitmax + " or lower to go there!"); return;
}
if (File.Exists("text/lockdown/map/" + message.ToLower())) {
Player.SendMessage(p, "The level " + message + " is locked."); return;
}
p.Loading = true;
foreach (Player pl in Player.players) if (p.level == pl.level && p != pl) p.SendDespawn(pl.id);
foreach (PlayerBot b in PlayerBot.playerbots) if (p.level == b.level) p.SendDespawn(b.id);
Player.GlobalDespawn(p, true);
Level oldLevel = p.level;
p.level = lvl; p.SendUserMOTD(); p.SendMap(oldLevel);
GC.Collect();
ushort x = (ushort)((0.5 + lvl.spawnx) * 32);
ushort y = (ushort)((1 + lvl.spawny) * 32);
ushort z = (ushort)((0.5 + lvl.spawnz) * 32);
if (!p.hidden)
Player.GlobalSpawn(p, x, y, z, lvl.rotx, lvl.roty, true, "");
else
p.SendPos(0xFF, x, y, z, lvl.rotx, lvl.roty);
foreach (Player pl in Player.players)
if (pl.level == p.level && p != pl && !pl.hidden)
p.SendSpawn(pl.id, pl.color + pl.name, pl.pos[0], pl.pos[1], pl.pos[2], pl.rot[0], pl.rot[1]);
foreach (PlayerBot b in PlayerBot.playerbots)
if (b.level == p.level)
p.SendSpawn(b.id, b.color + b.name, b.pos[0], b.pos[1], b.pos[2], b.rot[0], b.rot[1]);
p.Loading = false;
bool unloadOld = true;
if (oldLevel.unload && !oldLevel.name.Contains("&cMuseum ")) {
foreach (Player pl in Player.players) if (pl.level == oldLevel) { unloadOld = false; break; }
if (unloadOld && Server.AutoLoad) oldLevel.Unload(true);
}
if (!p.hidden) {
Player.GlobalChat(p, p.color + "*" + p.DisplayName + Server.DefaultColor + " went to &b" + lvl.name, false);
Server.IRC.Say(p.color + p.DisplayName + " %rwent to &8" + lvl.name, false, true);
}
}
void CheckGamesJoin(Player p, Level lvl) {
if (Server.lava.active && !Server.lava.sendingPlayers && Server.lava.map == p.level) {
if (Server.lava.roundActive) {
Server.lava.AnnounceRoundInfo(p);
Server.lava.AnnounceTimeLeft(!Server.lava.flooded, true, p);
} else {
Player.SendMessage(p, "Vote for the next map!");
Player.SendMessage(p, "Choices: " + Server.lava.VoteString);
}
}
if (Server.zombie.GameInProgess()) {
if (p.level.name == Server.zombie.currentLevelName)
Server.zombie.InfectedPlayerLogin(p);
}
if (p.level.name != Server.zombie.currentLevelName) {
if(ZombieGame.alive.Contains(p))
ZombieGame.alive.Remove(p);
if (ZombieGame.infectd.Contains(p))
ZombieGame.infectd.Remove(p);
}
if (p.inTNTwarsMap)
p.canBuild = true;
TntWarsGame game = TntWarsGame.Find(p.level);
if (game != null) {
if (game.GameStatus != TntWarsGame.TntWarsGameStatus.Finished &&
game.GameStatus != TntWarsGame.TntWarsGameStatus.WaitingForPlayers) {
p.canBuild = false;
Player.SendMessage(p, "TNT Wars: Disabled your building because you are in a TNT Wars map!");
}
p.inTNTwarsMap = true;
}
}
public override void Help(Player p) {
Player.SendMessage(p, "/goto <mapname> - Teleports yourself to a different level.");
}
}

View File

@ -51,6 +51,7 @@ namespace MCGalaxy.Commands
p.SendMessage("Added the map settings Directory within 'text/lockdown'!");
}
param[1] = param[1].ToLower();
string filepath = "text/lockdown/map/" + param[1] + "";
bool mapIsLockedDown = File.Exists(filepath);