mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-25 14:17:29 -04:00
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:
parent
b598359545
commit
063c8794f5
@ -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.");
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user