mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 11:35:08 -04:00
If server supports BlockPermissions, disable block perm behaviour of map MOTD
This commit is contained in:
parent
8ba0d4203f
commit
59b2f22687
@ -1,114 +1,114 @@
|
|||||||
// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
using System;
|
using System;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using ClassicalSharp;
|
using ClassicalSharp;
|
||||||
using BlockID = System.UInt16;
|
using BlockID = System.UInt16;
|
||||||
|
|
||||||
namespace ClassicalSharp {
|
namespace ClassicalSharp {
|
||||||
|
|
||||||
/// <summary> Stores various properties about the blocks in Minecraft Classic. </summary>
|
/// <summary> Stores various properties about the blocks in Minecraft Classic. </summary>
|
||||||
public static partial class BlockInfo {
|
public static partial class BlockInfo {
|
||||||
|
|
||||||
internal static void CalcRenderBounds(BlockID block) {
|
internal static void CalcRenderBounds(BlockID block) {
|
||||||
Vector3 min = MinBB[block], max = MaxBB[block];
|
Vector3 min = MinBB[block], max = MaxBB[block];
|
||||||
|
|
||||||
if (IsLiquid[block]) {
|
if (IsLiquid[block]) {
|
||||||
min.X -= 0.1f/16f; max.X -= 0.1f/16f;
|
min.X -= 0.1f/16f; max.X -= 0.1f/16f;
|
||||||
min.Z -= 0.1f/16f; max.Z -= 0.1f/16f;
|
min.Z -= 0.1f/16f; max.Z -= 0.1f/16f;
|
||||||
min.Y -= 1.5f/16f; max.Y -= 1.5f/16f;
|
min.Y -= 1.5f/16f; max.Y -= 1.5f/16f;
|
||||||
} else if (Draw[block] == DrawType.Translucent && Collide[block] != CollideType.Solid) {
|
} else if (Draw[block] == DrawType.Translucent && Collide[block] != CollideType.Solid) {
|
||||||
min.X += 0.1f/16f; max.X += 0.1f/16f;
|
min.X += 0.1f/16f; max.X += 0.1f/16f;
|
||||||
min.Z += 0.1f/16f; max.Z += 0.1f/16f;
|
min.Z += 0.1f/16f; max.Z += 0.1f/16f;
|
||||||
min.Y -= 0.1f/16f; max.Y -= 0.1f/16f;
|
min.Y -= 0.1f/16f; max.Y -= 0.1f/16f;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderMinBB[block] = min; RenderMaxBB[block] = max;
|
RenderMinBB[block] = min; RenderMaxBB[block] = max;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static byte CalcLightOffset(BlockID block) {
|
internal static byte CalcLightOffset(BlockID block) {
|
||||||
int flags = 0xFF;
|
int flags = 0xFF;
|
||||||
Vector3 min = MinBB[block], max = MaxBB[block];
|
Vector3 min = MinBB[block], max = MaxBB[block];
|
||||||
|
|
||||||
if (min.X != 0) flags &= ~(1 << Side.Left);
|
if (min.X != 0) flags &= ~(1 << Side.Left);
|
||||||
if (max.X != 1) flags &= ~(1 << Side.Right);
|
if (max.X != 1) flags &= ~(1 << Side.Right);
|
||||||
if (min.Z != 0) flags &= ~(1 << Side.Front);
|
if (min.Z != 0) flags &= ~(1 << Side.Front);
|
||||||
if (max.Z != 1) flags &= ~(1 << Side.Back);
|
if (max.Z != 1) flags &= ~(1 << Side.Back);
|
||||||
|
|
||||||
if ((min.Y != 0 && max.Y == 1) && Draw[block] != DrawType.Gas) {
|
if ((min.Y != 0 && max.Y == 1) && Draw[block] != DrawType.Gas) {
|
||||||
flags &= ~(1 << Side.Top);
|
flags &= ~(1 << Side.Top);
|
||||||
flags &= ~(1 << Side.Bottom);
|
flags &= ~(1 << Side.Bottom);
|
||||||
}
|
}
|
||||||
return (byte)flags;
|
return (byte)flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void RecalculateSpriteBB() {
|
internal static void RecalculateSpriteBB() {
|
||||||
using (FastBitmap fastBmp = new FastBitmap(TerrainAtlas2D.Atlas, true, true)) {
|
using (FastBitmap fastBmp = new FastBitmap(TerrainAtlas2D.Atlas, true, true)) {
|
||||||
for (int i = 0; i < Count; i++) {
|
for (int i = 0; i < Count; i++) {
|
||||||
if (Draw[i] != DrawType.Sprite) continue;
|
if (Draw[i] != DrawType.Sprite) continue;
|
||||||
RecalculateBB((BlockID)i, fastBmp);
|
RecalculateBB((BlockID)i, fastBmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float angle = 45f * Utils.Deg2Rad;
|
const float angle = 45f * Utils.Deg2Rad;
|
||||||
static readonly Vector3 centre = new Vector3(0.5f, 0, 0.5f);
|
static readonly Vector3 centre = new Vector3(0.5f, 0, 0.5f);
|
||||||
internal static void RecalculateBB(BlockID block, FastBitmap fastBmp) {
|
internal static void RecalculateBB(BlockID block, FastBitmap fastBmp) {
|
||||||
int elemSize = fastBmp.Width / 16;
|
int elemSize = fastBmp.Width / 16;
|
||||||
int texId = GetTextureLoc(block, Side.Right);
|
int texId = GetTextureLoc(block, Side.Right);
|
||||||
int texX = texId & 0x0F, texY = texId >> 4;
|
int texX = texId & 0x0F, texY = texId >> 4;
|
||||||
|
|
||||||
float topY = GetSpriteBB_TopY(elemSize, texX, texY, fastBmp);
|
float topY = GetSpriteBB_TopY(elemSize, texX, texY, fastBmp);
|
||||||
float bottomY = GetSpriteBB_BottomY(elemSize, texX, texY, fastBmp);
|
float bottomY = GetSpriteBB_BottomY(elemSize, texX, texY, fastBmp);
|
||||||
float leftX = GetSpriteBB_LeftX(elemSize, texX, texY, fastBmp);
|
float leftX = GetSpriteBB_LeftX(elemSize, texX, texY, fastBmp);
|
||||||
float rightX = GetSpriteBB_RightX(elemSize, texX, texY, fastBmp);
|
float rightX = GetSpriteBB_RightX(elemSize, texX, texY, fastBmp);
|
||||||
|
|
||||||
MinBB[block] = Utils.RotateY(leftX - 0.5f, bottomY, 0, angle) + centre;
|
MinBB[block] = Utils.RotateY(leftX - 0.5f, bottomY, 0, angle) + centre;
|
||||||
MaxBB[block] = Utils.RotateY(rightX - 0.5f, topY, 0, angle) + centre;
|
MaxBB[block] = Utils.RotateY(rightX - 0.5f, topY, 0, angle) + centre;
|
||||||
CalcRenderBounds(block);
|
CalcRenderBounds(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe static float GetSpriteBB_TopY(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
unsafe static float GetSpriteBB_TopY(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
||||||
for (int y = 0; y < size; y++) {
|
for (int y = 0; y < size; y++) {
|
||||||
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
||||||
for (int x = 0; x < size; x++) {
|
for (int x = 0; x < size; x++) {
|
||||||
if ((byte)(row[x] >> 24) != 0)
|
if ((byte)(row[x] >> 24) != 0)
|
||||||
return 1 - (float)y / size;
|
return 1 - (float)y / size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe static float GetSpriteBB_BottomY(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
unsafe static float GetSpriteBB_BottomY(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
||||||
for (int y = size - 1; y >= 0; y--) {
|
for (int y = size - 1; y >= 0; y--) {
|
||||||
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
||||||
for (int x = 0; x < size; x++) {
|
for (int x = 0; x < size; x++) {
|
||||||
if ((byte)(row[x] >> 24) != 0)
|
if ((byte)(row[x] >> 24) != 0)
|
||||||
return 1 - (float)(y + 1) / size;
|
return 1 - (float)(y + 1) / size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe static float GetSpriteBB_LeftX(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
unsafe static float GetSpriteBB_LeftX(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
||||||
for (int x = 0; x < size; x++) {
|
for (int x = 0; x < size; x++) {
|
||||||
for (int y = 0; y < size; y++) {
|
for (int y = 0; y < size; y++) {
|
||||||
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
||||||
if ((byte)(row[x] >> 24) != 0)
|
if ((byte)(row[x] >> 24) != 0)
|
||||||
return (float)x / size;
|
return (float)x / size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe static float GetSpriteBB_RightX(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
unsafe static float GetSpriteBB_RightX(int size, int tileX, int tileY, FastBitmap fastBmp) {
|
||||||
for (int x = size - 1; x >= 0; x--) {
|
for (int x = size - 1; x >= 0; x--) {
|
||||||
for (int y = 0; y < size; y++) {
|
for (int y = 0; y < size; y++) {
|
||||||
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
int* row = fastBmp.GetRowPtr(tileY * size + y) + (tileX * size);
|
||||||
if ((byte)(row[x] >> 24) != 0)
|
if ((byte)(row[x] >> 24) != 0)
|
||||||
return (float)(x + 1) / size;
|
return (float)(x + 1) / size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -127,17 +127,18 @@ namespace ClassicalSharp.Entities {
|
|||||||
|
|
||||||
/// <summary> Sets the user type of this user. This is used to control permissions for grass,
|
/// <summary> Sets the user type of this user. This is used to control permissions for grass,
|
||||||
/// bedrock, water and lava blocks on servers that don't support CPE block permissions. </summary>
|
/// bedrock, water and lava blocks on servers that don't support CPE block permissions. </summary>
|
||||||
public void SetUserType(byte value) {
|
public void SetUserType(byte value, bool setBlockPerms) {
|
||||||
bool isOp = value >= 100 && value <= 127;
|
bool isOp = value >= 100 && value <= 127;
|
||||||
UserType = value;
|
UserType = value;
|
||||||
BlockInfo.CanPlace[Block.Bedrock] = isOp;
|
|
||||||
BlockInfo.CanDelete[Block.Bedrock] = isOp;
|
|
||||||
|
|
||||||
BlockInfo.CanPlace[Block.Water] = isOp;
|
|
||||||
BlockInfo.CanPlace[Block.StillWater] = isOp;
|
|
||||||
BlockInfo.CanPlace[Block.Lava] = isOp;
|
|
||||||
BlockInfo.CanPlace[Block.StillLava] = isOp;
|
|
||||||
CanSeeAllNames = isOp;
|
CanSeeAllNames = isOp;
|
||||||
|
if (!setBlockPerms) return;
|
||||||
|
|
||||||
|
BlockInfo.CanPlace[Block.Bedrock] = isOp;
|
||||||
|
BlockInfo.CanDelete[Block.Bedrock] = isOp;
|
||||||
|
BlockInfo.CanPlace[Block.Water] = isOp;
|
||||||
|
BlockInfo.CanPlace[Block.StillWater] = isOp;
|
||||||
|
BlockInfo.CanPlace[Block.Lava] = isOp;
|
||||||
|
BlockInfo.CanPlace[Block.StillLava] = isOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Disables any hacks if their respective CanHackX value is set to false. </summary>
|
/// <summary> Disables any hacks if their respective CanHackX value is set to false. </summary>
|
||||||
|
@ -14,7 +14,7 @@ namespace ClassicalSharp.Network {
|
|||||||
internal int ServerExtensionsCount;
|
internal int ServerExtensionsCount;
|
||||||
internal bool sendHeldBlock, useMessageTypes;
|
internal bool sendHeldBlock, useMessageTypes;
|
||||||
internal int envMapVer = 2, blockDefsExtVer = 2;
|
internal int envMapVer = 2, blockDefsExtVer = 2;
|
||||||
internal bool needD3Fix, extEntityPos, twoWayPing;
|
internal bool needD3Fix, extEntityPos, twoWayPing, blockPerms;
|
||||||
|
|
||||||
public void Reset(Game game) {
|
public void Reset(Game game) {
|
||||||
ServerExtensionsCount = 0;
|
ServerExtensionsCount = 0;
|
||||||
@ -38,6 +38,8 @@ namespace ClassicalSharp.Network {
|
|||||||
useMessageTypes = true;
|
useMessageTypes = true;
|
||||||
} else if (ext == "ExtPlayerList") {
|
} else if (ext == "ExtPlayerList") {
|
||||||
net.UsingExtPlayerList = true;
|
net.UsingExtPlayerList = true;
|
||||||
|
} else if (ext == "BlockPermissions") {
|
||||||
|
blockPerms = true;
|
||||||
} else if (ext == "PlayerClick") {
|
} else if (ext == "PlayerClick") {
|
||||||
net.UsingPlayerClick = true;
|
net.UsingPlayerClick = true;
|
||||||
} else if (ext == "EnvMapAppearance") {
|
} else if (ext == "EnvMapAppearance") {
|
||||||
|
@ -59,7 +59,7 @@ namespace ClassicalSharp.Network.Protocols {
|
|||||||
net.ServerMotd = reader.ReadString();
|
net.ServerMotd = reader.ReadString();
|
||||||
game.Chat.SetLogName(net.ServerName);
|
game.Chat.SetLogName(net.ServerName);
|
||||||
|
|
||||||
game.LocalPlayer.Hacks.SetUserType(reader.ReadUInt8());
|
game.LocalPlayer.Hacks.SetUserType(reader.ReadUInt8(), !net.cpeData.blockPerms);
|
||||||
game.LocalPlayer.Hacks.HacksFlags = net.ServerName + net.ServerMotd;
|
game.LocalPlayer.Hacks.HacksFlags = net.ServerName + net.ServerMotd;
|
||||||
game.LocalPlayer.Hacks.UpdateHacksState();
|
game.LocalPlayer.Hacks.UpdateHacksState();
|
||||||
}
|
}
|
||||||
@ -264,7 +264,7 @@ namespace ClassicalSharp.Network.Protocols {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HandleSetPermission() {
|
void HandleSetPermission() {
|
||||||
game.LocalPlayer.Hacks.SetUserType(reader.ReadUInt8());
|
game.LocalPlayer.Hacks.SetUserType(reader.ReadUInt8(), !net.cpeData.blockPerms);
|
||||||
game.LocalPlayer.Hacks.UpdateHacksState();
|
game.LocalPlayer.Hacks.UpdateHacksState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,10 +221,11 @@ void HacksComp_ParseAllFlag(HacksComp* hacks, const UInt8* incFlag, const UInt8*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HacksComp_SetUserType(HacksComp* hacks, UInt8 value) {
|
void HacksComp_SetUserType(HacksComp* hacks, UInt8 value, bool setBlockPerms) {
|
||||||
bool isOp = value >= 100 && value <= 127;
|
bool isOp = value >= 100 && value <= 127;
|
||||||
hacks->UserType = value;
|
hacks->UserType = value;
|
||||||
hacks->CanSeeAllNames = isOp;
|
hacks->CanSeeAllNames = isOp;
|
||||||
|
if (!setBlockPerms) return;
|
||||||
|
|
||||||
Block_CanPlace[BLOCK_BEDROCK] = isOp;
|
Block_CanPlace[BLOCK_BEDROCK] = isOp;
|
||||||
Block_CanDelete[BLOCK_BEDROCK] = isOp;
|
Block_CanDelete[BLOCK_BEDROCK] = isOp;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user