mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-18 11:48:33 -04:00
Allow using .zips for texture packs, also allow changing cloud height for clients that support EnvMapAppearance v2.
This commit is contained in:
parent
bea624ac48
commit
eb8b8a37cc
@ -54,10 +54,10 @@ namespace MCGalaxy.Commands {
|
||||
Player.SendMessage(p, "No backups for this map exist yet.");
|
||||
}
|
||||
|
||||
if (lvl.textureUrl != "") {
|
||||
Player.SendMessage(p, "TexturePack: %b" + lvl.textureUrl);
|
||||
} else if (lvl == Server.mainLevel && Server.defaultTextureUrl != "") {
|
||||
Player.SendMessage(p, "TexturePack: " + Server.defaultTextureUrl);
|
||||
if (lvl.terrainUrl != "") {
|
||||
Player.SendMessage(p, "TexturePack: %b" + lvl.terrainUrl);
|
||||
} else if (lvl == Server.mainLevel && Server.defaultTerrainUrl != "") {
|
||||
Player.SendMessage(p, "TexturePack: " + Server.defaultTerrainUrl);
|
||||
} else {
|
||||
Player.SendMessage(p, "No textures for this map exist yet.");
|
||||
}
|
||||
|
@ -29,11 +29,11 @@ namespace MCGalaxy.Commands {
|
||||
public CmdEnvironment() { }
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
message = message.ToLower();
|
||||
if (message == "l preset" || message == "level preset") {
|
||||
SendPresetsMessage(p);
|
||||
return;
|
||||
}
|
||||
message = message.ToLower();
|
||||
if (message == "l preset" || message == "level preset") {
|
||||
SendPresetsMessage(p);
|
||||
return;
|
||||
}
|
||||
string[] args = null;
|
||||
if (message == "" || (args = message.Split(' ')).Length < 3) {
|
||||
Help(p); return;
|
||||
@ -55,61 +55,57 @@ namespace MCGalaxy.Commands {
|
||||
|
||||
void Handle(Player p, string group, string variable, string value) {
|
||||
bool level = group == "l";
|
||||
Level lvl = p.level;
|
||||
|
||||
switch (variable) {
|
||||
case "fog":
|
||||
SetEnvColour(p, value, 2, "fog", ref p.level.FogColor, level);
|
||||
break;
|
||||
SetEnvColour(p, value, 2, "fog", ref lvl.FogColor, level); break;
|
||||
case "cloud":
|
||||
case "clouds":
|
||||
SetEnvColour(p, value, 1, "cloud", ref p.level.CloudColor, level);
|
||||
break;
|
||||
SetEnvColour(p, value, 1, "cloud", ref lvl.CloudColor, level); break;
|
||||
case "sky":
|
||||
SetEnvColour(p, value, 0, "sky", ref p.level.SkyColor, level);
|
||||
break;
|
||||
SetEnvColour(p, value, 0, "sky", ref lvl.SkyColor, level); break;
|
||||
case "dark":
|
||||
case "shadow":
|
||||
SetEnvColour(p, value, 3, "shadow", ref p.level.ShadowColor, level);
|
||||
break;
|
||||
SetEnvColour(p, value, 3, "shadow", ref lvl.ShadowColor, level); break;
|
||||
case "sun":
|
||||
case "light":
|
||||
case "sunlight":
|
||||
SetEnvColour(p, value, 4, "sunlight", ref p.level.LightColor, level);
|
||||
break;
|
||||
SetEnvColour(p, value, 4, "sunlight", ref lvl.LightColor, level); break;
|
||||
case "weather":
|
||||
SetEnvWeather(p, value, ref p.level.weather, level);
|
||||
break;
|
||||
|
||||
SetEnvWeather(p, value, ref lvl.weather, level); break;
|
||||
case "cloudsheight":
|
||||
case "cloudheight":
|
||||
if (!level) {
|
||||
p.SendMessage("This feature is not available for 'player' target"); return;
|
||||
}
|
||||
SetEnvMapAppearanceS(p, value, "clouds height", (short)(lvl.height + 2), ref lvl.CloudsHeight); break;
|
||||
case "waterlevel":
|
||||
case "edgelevel":
|
||||
case "level":
|
||||
if (!level) {
|
||||
p.SendMessage("This feature is not available for 'player' target");
|
||||
return;
|
||||
p.SendMessage("This feature is not available for 'player' target"); return;
|
||||
}
|
||||
byte ignored = 0;
|
||||
SetEnvMapAppearance(p, value, "water level", false, 0, ref ignored );
|
||||
break;
|
||||
SetEnvMapAppearanceS(p, value, "water level", (short)(lvl.height / 2), ref lvl.EdgeLevel); break;
|
||||
case "horizon":
|
||||
case "edge":
|
||||
case "water":
|
||||
if (!level) {
|
||||
p.SendMessage("This feature is not available for 'player' target"); return;
|
||||
}
|
||||
SetEnvMapAppearance(p, value, "edge block", true, Block.waterstill, ref p.level.HorizonBlock);
|
||||
break;
|
||||
SetEnvMapAppearance(p, value, "edge block", Block.waterstill, ref lvl.HorizonBlock); break;
|
||||
case "side":
|
||||
case "border":
|
||||
case "bedrock":
|
||||
if (!level) {
|
||||
p.SendMessage("This feature is not available for 'player' target"); return;
|
||||
}
|
||||
SetEnvMapAppearance(p, value, "sides block", true, Block.blackrock, ref p.level.EdgeBlock);
|
||||
break;
|
||||
SetEnvMapAppearance(p, value, "sides block", Block.blackrock, ref lvl.EdgeBlock); break;
|
||||
case "preset":
|
||||
if (!SetPreset(p, value, level))
|
||||
return;
|
||||
if (!SetPreset(p, value, level)) return;
|
||||
break;
|
||||
default:
|
||||
Help(p);
|
||||
return;
|
||||
Help(p); return;
|
||||
}
|
||||
|
||||
if (level)
|
||||
@ -178,12 +174,11 @@ namespace MCGalaxy.Commands {
|
||||
}
|
||||
|
||||
if (weather > 2) {
|
||||
p.SendMessage("Please use a valid integer (0,1,2) or string (sun,rain,snow)");
|
||||
return;
|
||||
p.SendMessage("Please use a valid integer (0,1,2) or string (sun,rain,snow)"); return;
|
||||
}
|
||||
}
|
||||
|
||||
if( level )
|
||||
if (level)
|
||||
p.level.weather = weather;
|
||||
string weatherType = weather == 0 ? "&sSun" : (weather == 1 ? "&1Rain" : "&fSnow");
|
||||
p.SendMessage(string.Format("&aSet weather for {0}&a to {1} ({2}&a)", target, weather, weatherType));
|
||||
@ -191,33 +186,39 @@ namespace MCGalaxy.Commands {
|
||||
// Send the changed colour to all players affected by the command.
|
||||
if (level) {
|
||||
foreach (Player pl in Player.players) {
|
||||
if (pl.level == p.level && pl.HasCpeExt(CpeExt.EnvWeatherType)) {
|
||||
if (pl.level == p.level && pl.HasCpeExt(CpeExt.EnvWeatherType))
|
||||
pl.SendSetMapWeather(weather);
|
||||
}
|
||||
}
|
||||
} else if (p.HasCpeExt(CpeExt.EnvWeatherType)) {
|
||||
p.SendSetMapWeather(weather);
|
||||
}
|
||||
}
|
||||
|
||||
void SetEnvMapAppearance(Player p, string value, string variable,
|
||||
bool block, byte defValue, ref byte modifyBlock) {
|
||||
void SetEnvMapAppearance(Player p, string value, string variable, byte defValue, ref byte target) {
|
||||
if (IsResetString(value)) {
|
||||
p.SendMessage(string.Format("Reset {0} for {0}&S to normal", variable, p.level.name));
|
||||
if( block )
|
||||
modifyBlock = defValue;
|
||||
else
|
||||
p.level.EdgeLevel = (short)(p.level.Height / 2);
|
||||
target = defValue;
|
||||
} else {
|
||||
if (block && !CheckBlock(p, value, variable, ref modifyBlock))
|
||||
return;
|
||||
if( !block && !CheckShort(p, value, variable, ref p.level.EdgeLevel))
|
||||
return;
|
||||
if (!CheckBlock(p, value, variable, ref target)) return;
|
||||
}
|
||||
|
||||
SendCurrentMapAppearance(p.level);
|
||||
}
|
||||
|
||||
void SetEnvMapAppearanceS(Player p, string value, string variable, short defValue, ref short target) {
|
||||
if (IsResetString(value)) {
|
||||
p.SendMessage(string.Format("Reset {0} for {0}&S to normal", variable, p.level.name));
|
||||
target = defValue;
|
||||
} else {
|
||||
if (!CheckShort(p, value, variable, ref target)) return;
|
||||
}
|
||||
SendCurrentMapAppearance(p.level);
|
||||
}
|
||||
|
||||
void SendCurrentMapAppearance(Level lvl) {
|
||||
foreach (Player pl in Player.players) {
|
||||
if (pl.HasCpeExt(CpeExt.EnvMapAppearance) && pl.level == p.level)
|
||||
pl.SendCurrentMapAppearance();
|
||||
bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2);
|
||||
if (hasExt && pl.level == lvl)
|
||||
pl.SendCurrentMapAppearance();
|
||||
}
|
||||
}
|
||||
|
||||
@ -292,7 +293,7 @@ namespace MCGalaxy.Commands {
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
SendPresetsMessage(p);
|
||||
SendPresetsMessage(p);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -328,16 +329,16 @@ namespace MCGalaxy.Commands {
|
||||
}
|
||||
|
||||
static void SendPresetsMessage(Player p) {
|
||||
p.SendMessage("/env l preset [type] -- Uses an env preset on your map");
|
||||
p.SendMessage("/env l preset [type] -- Uses an env preset on your map");
|
||||
p.SendMessage("Valid types: Cartoon/Midnight/Midnight2/Noir/Normal/Trippy/Watery/Sunset/Gloomy/Cloudy");
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
p.SendMessage("%T/env [target] [variable] [value]");
|
||||
p.SendMessage("%H Valid targets: player or p, level or l");
|
||||
p.SendMessage("%H Valid variables: fog, cloud, sky, sun, shadow, weather");
|
||||
p.SendMessage("%H level only variables: level, horizon, border, preset");
|
||||
p.SendMessage("%HUsing 'normal' as a value will reset the variable");
|
||||
Player.SendMessage(p, "%T/env [target] [variable] [value]");
|
||||
Player.SendMessage(p, "%H Valid targets: player or p, level or l");
|
||||
Player.SendMessage(p, "%H Valid variables: fog, cloud, sky, sun, shadow, weather");
|
||||
Player.SendMessage(p, "%H level only: level, cloudsheight, horizon, border, preset");
|
||||
Player.SendMessage(p, "%HUsing 'normal' as a value will reset the variable");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
97
Commands/World/CmdTexture.cs
Normal file
97
Commands/World/CmdTexture.cs
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
Copyright 2011 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.
|
||||
*/
|
||||
|
||||
namespace MCGalaxy.Commands {
|
||||
|
||||
public sealed class CmdTexture : Command {
|
||||
|
||||
public override string name { get { return "texture"; } }
|
||||
public override string shortcut { get { return ""; } }
|
||||
public override string type { get { return CommandTypes.Other; } }
|
||||
public override bool museumUsable { get { return true; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
||||
public CmdTexture() { }
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
if (message == "") { Help(p); return; }
|
||||
string[] args = message.Split(' ');
|
||||
if (args.Length != 2) { Help(p); return; }
|
||||
string scope = args[0].ToLower();
|
||||
string url = args[1];
|
||||
|
||||
if (url.ToLower() == "normal" || url.ToLower() == "reset") {
|
||||
url = "";
|
||||
} else if (!(url.StartsWith("http://") || url.StartsWith("https://"))) {
|
||||
p.SendMessage("Please use http:// or https:// in front of your URL"); return;
|
||||
}
|
||||
|
||||
if ((scope == "global" || scope == "level") && !url.EndsWith(".png")) {
|
||||
p.SendMessage("The terrain URL must end in a .png"); return;
|
||||
}
|
||||
if ((scope == "globalzip" || scope == "levelzip") && !url.EndsWith(".zip")) {
|
||||
p.SendMessage("The texture pack URL must end in a .zip"); return;
|
||||
}
|
||||
|
||||
if (scope == "global") {
|
||||
Server.defaultTerrainUrl = url;
|
||||
p.SendMessage("Set server's default terrain to " + args[1]);
|
||||
UpdateGlobally(p, false);
|
||||
} else if (scope == "level") {
|
||||
p.level.terrainUrl = url;
|
||||
p.SendMessage("Set level's terrain to " + args[1]);
|
||||
UpdateLevel(p, false);
|
||||
} else if (scope == "globalzip") {
|
||||
Server.defaultTexturePackUrl = url;
|
||||
p.SendMessage("Set server's default texture pack to " + args[1]);
|
||||
UpdateGlobally(p, true);
|
||||
} else if (scope == "levelzip") {
|
||||
p.level.texturePackUrl = url;
|
||||
p.SendMessage("Set level's texture pack to " + args[1]);
|
||||
UpdateLevel(p, true);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateGlobally(Player p, bool zip) {
|
||||
foreach (Player pl in Player.players) {
|
||||
bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2);
|
||||
string url = zip ? pl.level.texturePackUrl : pl.level.terrainUrl;
|
||||
if (hasExt && url == "")
|
||||
pl.SendCurrentMapAppearance();
|
||||
}
|
||||
SrvProperties.Save("properties/server.properties");
|
||||
}
|
||||
|
||||
void UpdateLevel(Player p, bool zip) {
|
||||
foreach (Player pl in Player.players) {
|
||||
bool hasExt = pl.HasCpeExt(CpeExt.EnvMapAppearance) || pl.HasCpeExt(CpeExt.EnvMapAppearance, 2);
|
||||
if (hasExt && pl.level == p.level)
|
||||
pl.SendCurrentMapAppearance();
|
||||
}
|
||||
p.level.Save();
|
||||
Level.SaveSettings(p.level);
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.SendMessage(p, "%T/texture [scope] [url]");
|
||||
Player.SendMessage(p, "%H global/globalzip scope: Changes server's default texture.");
|
||||
Player.SendMessage(p, "%H level/levelzip scope: Changes current level's texture.");
|
||||
Player.SendMessage(p, "%HUsing 'reset' as a url will reset the texture to default.");
|
||||
Player.SendMessage(p, "%HNote: zip texture packs are not supported by all clients.");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
/*
|
||||
Copyright 2011 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.
|
||||
*/
|
||||
|
||||
namespace MCGalaxy.Commands {
|
||||
|
||||
public sealed class CmdTexture : Command {
|
||||
|
||||
public override string name { get { return "texture"; } }
|
||||
public override string shortcut { get { return ""; } }
|
||||
public override string type { get { return CommandTypes.Other; } }
|
||||
public override bool museumUsable { get { return true; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
||||
public CmdTexture() { }
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
if (message == "") { Help(p); return; }
|
||||
string[] args = message.Split(' ');
|
||||
if (args.Length != 2) { Help(p); return; }
|
||||
string scope = args[0].ToLower();
|
||||
string url = args[1];
|
||||
|
||||
if (url.ToLower() == "normal" || url.ToLower() == "reset") {
|
||||
url = "";
|
||||
} else {
|
||||
if (!url.StartsWith("http://") && !args[1].StartsWith("https://")) {
|
||||
p.SendMessage("Please use http:// or https:// in front of your URL"); return;
|
||||
}
|
||||
if (!url.EndsWith(".png")) {
|
||||
p.SendMessage("Please make sure your URL ends in .png"); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (scope == "global") {
|
||||
Server.defaultTextureUrl = url;
|
||||
p.SendMessage("Set server's default texture to " + args[1]);
|
||||
foreach (Player pl in Player.players) {
|
||||
if (pl.HasCpeExt(CpeExt.EnvMapAppearance) && pl.level.textureUrl == "") {
|
||||
pl.SendSetMapAppearance(Server.defaultTextureUrl, p.level.EdgeBlock, p.level.HorizonBlock, p.level.EdgeLevel);
|
||||
}
|
||||
}
|
||||
SrvProperties.Save("properties/server.properties");
|
||||
} else if (scope == "level") {
|
||||
p.level.textureUrl = url;
|
||||
p.SendMessage("Set level's texture to " + args[1]);
|
||||
|
||||
foreach (Player pl in Player.players) {
|
||||
if (pl.HasCpeExt(CpeExt.EnvMapAppearance) && pl.level == p.level) {
|
||||
pl.SendSetMapAppearance(p.level.textureUrl, p.level.EdgeBlock, p.level.HorizonBlock, p.level.EdgeLevel);
|
||||
}
|
||||
}
|
||||
p.level.Save();
|
||||
Level.SaveSettings(p.level);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
p.SendMessage("/texture global [texture url] - Changes the server default texture");
|
||||
p.SendMessage("/texture level [texture url] - Changes current level's texture");
|
||||
p.SendMessage("Using 'reset' for the texture url will reset the texture to default.");
|
||||
}
|
||||
}
|
||||
}
|
@ -74,7 +74,8 @@ namespace MCGalaxy.Levels.IO {
|
||||
writer.WriteLine("RandomFlow = " + level.randomFlow);
|
||||
writer.WriteLine("GrowTrees = " + level.growTrees);
|
||||
writer.WriteLine("Weather = " + level.weather);
|
||||
writer.WriteLine("Texture = " + level.textureUrl);
|
||||
writer.WriteLine("Texture = " + level.terrainUrl);
|
||||
writer.WriteLine("TexturePack = " + level.texturePackUrl);
|
||||
}
|
||||
|
||||
static string GetName(LevelPermission perm) {
|
||||
@ -96,6 +97,7 @@ namespace MCGalaxy.Levels.IO {
|
||||
writer.WriteLine("FogColor = " + level.FogColor);
|
||||
|
||||
writer.WriteLine("EdgeLevel = " + level.EdgeLevel);
|
||||
writer.WriteLine("CloudsHeight = " + level.CloudsHeight);
|
||||
writer.WriteLine("EdgeBlock = " + level.EdgeBlock);
|
||||
writer.WriteLine("HorizonBlock = " + level.HorizonBlock);
|
||||
}
|
||||
@ -137,6 +139,7 @@ namespace MCGalaxy.Levels.IO {
|
||||
case "lightcolor": level.LightColor = value; break;
|
||||
case "edgeblock": level.EdgeBlock = byte.Parse(value); break;
|
||||
case "edgelevel": level.EdgeLevel = short.Parse(value); break;
|
||||
case "cloudsheight": level.CloudsHeight = short.Parse(value); break;
|
||||
case "horizonblock": level.HorizonBlock = byte.Parse(value); break;
|
||||
}
|
||||
} catch {
|
||||
@ -200,7 +203,9 @@ namespace MCGalaxy.Levels.IO {
|
||||
case "weather":
|
||||
level.weather = byte.Parse(value); break;
|
||||
case "texture":
|
||||
level.textureUrl = value; break;
|
||||
level.terrainUrl = value; break;
|
||||
case "texturepack":
|
||||
level.texturePackUrl = value; break;
|
||||
case "buildable":
|
||||
level.Buildable = bool.Parse(value); break;
|
||||
case "deletable":
|
||||
|
@ -96,7 +96,7 @@ namespace MCGalaxy
|
||||
public bool Buildable = true, Deletable = true;
|
||||
|
||||
public byte weather;
|
||||
public string textureUrl = "";
|
||||
public string terrainUrl = "", texturePackUrl = "";
|
||||
|
||||
public bool cancelsave1;
|
||||
public bool cancelunload;
|
||||
@ -141,6 +141,8 @@ namespace MCGalaxy
|
||||
|
||||
/// <summary> Elevation of the "ocean" that surrounds maps. Set to -1 to use client default (halfway up the map). </summary>
|
||||
public short EdgeLevel = -1;
|
||||
|
||||
public short CloudsHeight = -1;
|
||||
|
||||
/// <summary> The block which will be displayed on the horizon. </summary>
|
||||
public byte HorizonBlock = Block.water;
|
||||
@ -213,6 +215,7 @@ namespace MCGalaxy
|
||||
Length = 16;
|
||||
|
||||
name = n;
|
||||
CloudsHeight = (short)(y + 2);
|
||||
blocks = new byte[Width * Height * Length];
|
||||
ChunksX = (Width + 15) >> 4;
|
||||
ChunksY = (Height + 15) >> 4;
|
||||
|
@ -375,7 +375,6 @@
|
||||
<Compile Include="Commands\Other\CmdTake.cs" />
|
||||
<Compile Include="Commands\Other\CmdTColor.cs" />
|
||||
<Compile Include="Commands\Other\CmdText.cs" />
|
||||
<Compile Include="Commands\Other\CmdTexture.cs" />
|
||||
<Compile Include="Commands\Other\CmdTimer.cs" />
|
||||
<Compile Include="Commands\Other\CmdTitle.cs" />
|
||||
<Compile Include="Commands\Other\CmdTnt.cs" />
|
||||
@ -413,6 +412,7 @@
|
||||
<Compile Include="Commands\World\CmdRestore.cs" />
|
||||
<Compile Include="Commands\World\CmdSave.cs" />
|
||||
<Compile Include="Commands\World\CmdSetspawn.cs" />
|
||||
<Compile Include="Commands\World\CmdTexture.cs" />
|
||||
<Compile Include="Commands\World\CmdUnflood.cs" />
|
||||
<Compile Include="Commands\World\CmdUnload.cs" />
|
||||
<Compile Include="Commands\World\CmdUnlock.cs" />
|
||||
|
@ -82,6 +82,11 @@ namespace MCGalaxy {
|
||||
void HandleExtInfo( byte[] message ) {
|
||||
appName = enc.GetString( message, 0, 64 ).Trim();
|
||||
extensionCount = message[65];
|
||||
// NOTE: Workaround as ClassiCube violates the CPE specification here.
|
||||
// If server sends version 2, the client should reply with version 1.
|
||||
// Except ClassiCube just doesn't reply at all if server sends version 2.
|
||||
if (appName == "ClassiCube Client")
|
||||
EnvMapAppearance = 1;
|
||||
}
|
||||
|
||||
void HandleExtEntry( byte[] message ) {
|
||||
@ -384,7 +389,7 @@ namespace MCGalaxy {
|
||||
SendSetMapWeather(level.weather);
|
||||
if (HasCpeExt(CpeExt.EnvColors))
|
||||
SendCurrentEnvColors();
|
||||
if (HasCpeExt(CpeExt.EnvMapAppearance))
|
||||
if (HasCpeExt(CpeExt.EnvMapAppearance) || HasCpeExt(CpeExt.EnvMapAppearance, 2))
|
||||
SendCurrentMapAppearance();
|
||||
if ( OnSendMap != null )
|
||||
OnSendMap(this, buffer);
|
||||
@ -636,12 +641,25 @@ namespace MCGalaxy {
|
||||
byte[] buffer = new byte[69];
|
||||
buffer[0] = Opcode.CpeEnvSetMapApperance;
|
||||
NetUtils.WriteAscii(url, buffer, 1);
|
||||
Server.s.Log(url + "," + ((char)buffer[1]));
|
||||
buffer[65] = sideblock;
|
||||
buffer[66] = edgeblock;
|
||||
NetUtils.WriteI16(sidelevel, buffer, 67);
|
||||
SendRaw(buffer);
|
||||
}
|
||||
|
||||
public void SendSetMapAppearanceV2( string url, byte sideblock, byte edgeblock, short sidelevel, short cloudHeight) {
|
||||
byte[] buffer = new byte[73];
|
||||
buffer[0] = Opcode.CpeEnvSetMapApperance;
|
||||
NetUtils.WriteAscii(url, buffer, 1);
|
||||
buffer[65] = sideblock;
|
||||
buffer[66] = edgeblock;
|
||||
NetUtils.WriteI16(sidelevel, buffer, 67);
|
||||
NetUtils.WriteI16(cloudHeight, buffer, 69);
|
||||
// TODO: allow changing max view distance
|
||||
SendRaw(buffer);
|
||||
}
|
||||
|
||||
public void SendSetMapWeather( byte weather ) { // 0 - sunny; 1 - raining; 2 - snowing
|
||||
SendRaw(Opcode.CpeEnvWeatherType, weather);
|
||||
}
|
||||
|
@ -106,7 +106,6 @@ namespace MCGalaxy
|
||||
}
|
||||
break;*/
|
||||
case CpeExt.EnvColors:
|
||||
SendCurrentEnvColors();
|
||||
EnvColors = version; break;
|
||||
case CpeExt.SelectionCuboid:
|
||||
SelectionCuboid = version; break;
|
||||
@ -116,10 +115,8 @@ namespace MCGalaxy
|
||||
UpdateModels();
|
||||
ChangeModel = version; break;
|
||||
case CpeExt.EnvMapAppearance:
|
||||
SendCurrentMapAppearance();
|
||||
EnvMapAppearance = version; break;
|
||||
case CpeExt.EnvWeatherType:
|
||||
SendSetMapWeather(level.weather);
|
||||
EnvWeatherType = version; break;
|
||||
case CpeExt.HackControl:
|
||||
HackControl = version; break;
|
||||
@ -180,8 +177,15 @@ namespace MCGalaxy
|
||||
}
|
||||
|
||||
public void SendCurrentMapAppearance() {
|
||||
string url = level.textureUrl == "" ? Server.defaultTextureUrl : level.textureUrl;
|
||||
SendSetMapAppearance(url, level.EdgeBlock, level.HorizonBlock, level.EdgeLevel);
|
||||
if (EnvMapAppearance == 2) {
|
||||
string url = level.texturePackUrl == "" ? level.terrainUrl : level.texturePackUrl;
|
||||
if (url == "")
|
||||
url = Server.defaultTexturePackUrl == "" ? Server.defaultTerrainUrl : Server.defaultTexturePackUrl;
|
||||
SendSetMapAppearanceV2(url, level.EdgeBlock, level.HorizonBlock, level.EdgeLevel, level.CloudsHeight);
|
||||
} else {
|
||||
string url = level.terrainUrl == "" ? Server.defaultTerrainUrl : level.terrainUrl;
|
||||
SendSetMapAppearance(url, level.EdgeBlock, level.HorizonBlock, level.EdgeLevel);
|
||||
}
|
||||
}
|
||||
|
||||
public void SendCurrentEnvColors() {
|
||||
@ -202,21 +206,21 @@ namespace MCGalaxy
|
||||
}
|
||||
|
||||
public void SendCurrentBlockPermissions() {
|
||||
byte count = hasCustomBlocks ? Block.CpeCount : Block.OriginalCount;
|
||||
for (byte i = 0; i < count; i++) {
|
||||
bool canPlace = Block.canPlace(this, i);
|
||||
bool canDelete = canPlace;
|
||||
|
||||
if (!level.Buildable) canPlace = false;
|
||||
if (!level.Deletable) canDelete = false;
|
||||
SendSetBlockPermission(i, canPlace, canDelete);
|
||||
}
|
||||
|
||||
if (!HasCpeExt(CpeExt.BlockDefinitions)) return;
|
||||
for (int i = count; i < 256; i++) {
|
||||
if (BlockDefinition.GlobalDefinitions[i] == null) continue;
|
||||
SendSetBlockPermission((byte)i, level.Buildable, level.Deletable);
|
||||
}
|
||||
byte count = hasCustomBlocks ? Block.CpeCount : Block.OriginalCount;
|
||||
for (byte i = 0; i < count; i++) {
|
||||
bool canPlace = Block.canPlace(this, i);
|
||||
bool canDelete = canPlace;
|
||||
|
||||
if (!level.Buildable) canPlace = false;
|
||||
if (!level.Deletable) canDelete = false;
|
||||
SendSetBlockPermission(i, canPlace, canDelete);
|
||||
}
|
||||
|
||||
if (!HasCpeExt(CpeExt.BlockDefinitions)) return;
|
||||
for (int i = count; i < 256; i++) {
|
||||
if (BlockDefinition.GlobalDefinitions[i] == null) continue;
|
||||
SendSetBlockPermission((byte)i, level.Buildable, level.Deletable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -680,7 +680,7 @@ namespace MCGalaxy {
|
||||
|
||||
SendExtEntry(CpeExt.BlockPermissions, 1);
|
||||
SendExtEntry(CpeExt.ChangeModel, 1);
|
||||
SendExtEntry(CpeExt.EnvMapAppearance, 1);
|
||||
SendExtEntry(CpeExt.EnvMapAppearance, 2);
|
||||
|
||||
SendExtEntry(CpeExt.EnvWeatherType, 1);
|
||||
SendExtEntry(CpeExt.HackControl, 1);
|
||||
|
@ -88,16 +88,16 @@ namespace MCGalaxy {
|
||||
catch { Server.s.Log("port invalid! setting to default."); }
|
||||
break;
|
||||
case "verify-names":
|
||||
Server.verify = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.verify = value.ToLower() == "true";
|
||||
break;
|
||||
case "public":
|
||||
Server.pub = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.pub = value.ToLower() == "true";
|
||||
break;
|
||||
case "world-chat":
|
||||
Server.worldChat = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.worldChat = value.ToLower() == "true";
|
||||
break;
|
||||
//case "guest-goto":
|
||||
// Server.guestGoto = (value.ToLower() == "true") ? true : false;
|
||||
// Server.guestGoto = value.ToLower() == "true";
|
||||
// break;
|
||||
case "max-players":
|
||||
try {
|
||||
@ -140,10 +140,10 @@ namespace MCGalaxy {
|
||||
}
|
||||
break;
|
||||
case "irc":
|
||||
Server.irc = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.irc = value.ToLower() == "true";
|
||||
break;
|
||||
case "irc-colorsenable":
|
||||
Server.ircColorsEnable = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.ircColorsEnable = value.ToLower() == "true";
|
||||
break;
|
||||
case "irc-server":
|
||||
Server.ircServer = value;
|
||||
@ -188,7 +188,7 @@ namespace MCGalaxy {
|
||||
|
||||
|
||||
case "report-back":
|
||||
Server.reportBack = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.reportBack = value.ToLower() == "true";
|
||||
break;
|
||||
case "backup-time":
|
||||
if ( Convert.ToInt32(value) > 1 ) { Server.backupInterval = Convert.ToInt32(value); }
|
||||
@ -197,20 +197,14 @@ namespace MCGalaxy {
|
||||
if ( !value.Contains("System.Windows.Forms.TextBox, Text:") )
|
||||
Server.backupLocation = value;
|
||||
break;
|
||||
|
||||
//case "console-only": // Never used
|
||||
// Server.console = (value.ToLower() == "true") ? true : false;
|
||||
// break;
|
||||
|
||||
case "physicsrestart":
|
||||
Server.physicsRestart = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.physicsRestart = value.ToLower() == "true";
|
||||
break;
|
||||
case "deathcount":
|
||||
Server.deathcount = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.deathcount = value.ToLower() == "true";
|
||||
break;
|
||||
|
||||
case "usemysql":
|
||||
Server.useMySQL = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.useMySQL = value.ToLower() == "true";
|
||||
break;
|
||||
case "host":
|
||||
Server.MySQLHost = value;
|
||||
@ -354,13 +348,13 @@ namespace MCGalaxy {
|
||||
catch { Server.s.Log("Invalid " + key + ". Using default."); break; }
|
||||
break;
|
||||
case "auto-update":
|
||||
Server.autoupdate = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.autoupdate = value.ToLower() == "true";
|
||||
break;
|
||||
case "use-beta-version":
|
||||
Server.DownloadBeta = (value.ToLower() == "true") ? true : false;
|
||||
Server.DownloadBeta = value.ToLower() == "true";
|
||||
break;
|
||||
case "in-game-update-notify":
|
||||
Server.notifyPlayers = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.notifyPlayers = value.ToLower() == "true";
|
||||
break;
|
||||
case "update-countdown":
|
||||
try { Server.restartcountdown = Convert.ToInt32(value).ToString(); }
|
||||
@ -383,13 +377,13 @@ namespace MCGalaxy {
|
||||
catch { Server.s.Log("Invalid " + key + ". Using default."); break; }
|
||||
break;
|
||||
case "use-whitelist":
|
||||
Server.useWhitelist = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.useWhitelist = value.ToLower() == "true";
|
||||
break;
|
||||
case "premium-only":
|
||||
Server.PremiumPlayersOnly = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.PremiumPlayersOnly = value.ToLower() == "true";
|
||||
break;
|
||||
case "allow-tp-to-higher-ranks":
|
||||
Server.higherranktp = ( value.ToLower() == "true" ) ? true : false;
|
||||
Server.higherranktp = value.ToLower() == "true";
|
||||
break;
|
||||
case "agree-to-rules-on-entry":
|
||||
try { Server.agreetorulesonentry = bool.Parse(value); }
|
||||
@ -405,13 +399,15 @@ namespace MCGalaxy {
|
||||
break;
|
||||
case "default-texture-url":
|
||||
if (!value.StartsWith("http://") && !value.StartsWith("https://"))
|
||||
{
|
||||
Server.defaultTextureUrl = "";
|
||||
}
|
||||
Server.defaultTerrainUrl = "";
|
||||
else
|
||||
{
|
||||
Server.defaultTextureUrl = value;
|
||||
}
|
||||
Server.defaultTerrainUrl = value;
|
||||
break;
|
||||
case "default-texture-pack-url":
|
||||
if (!value.StartsWith("http://") && !value.StartsWith("https://"))
|
||||
Server.defaultTexturePackUrl = "";
|
||||
else
|
||||
Server.defaultTexturePackUrl = value;
|
||||
break;
|
||||
case "dollar-before-dollar":
|
||||
try { Server.dollardollardollar = bool.Parse(value); }
|
||||
@ -772,7 +768,8 @@ namespace MCGalaxy {
|
||||
w.WriteLine("restart-on-error = " + Server.restartOnError);
|
||||
w.WriteLine("menu-style = " + Server.menustyle.ToString());
|
||||
w.WriteLine("main-name = " + Server.level);
|
||||
w.WriteLine("default-texture-url = " + Server.defaultTextureUrl);
|
||||
w.WriteLine("default-texture-url = " + Server.defaultTerrainUrl);
|
||||
w.WriteLine("default-texture-pack-url = " + Server.defaultTexturePackUrl);
|
||||
//w.WriteLine("guest-goto = " + Server.guestGoto);
|
||||
w.WriteLine();
|
||||
w.WriteLine("# irc bot options");
|
||||
|
@ -353,7 +353,7 @@ namespace MCGalaxy
|
||||
public static bool guestLimitNotify = false;
|
||||
public static bool guestJoinNotify = true;
|
||||
public static bool guestLeaveNotify = true;
|
||||
public static string defaultTextureUrl = "";
|
||||
public static string defaultTerrainUrl = "", defaultTexturePackUrl = "";
|
||||
|
||||
public static bool flipHead = false;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user