Keep track of current game mode (#1053)

* GetGamemode()

* GetGamemode()

* ChangeGamemode()

* GetGamemode()

* Update ChatBot.cs

code refractor

* Update Inventory.cs

Gamemode check added

* Update Protocol18.cs

* Update Protocol18.cs

* Update Protocol18.cs

code refractor

* Update IMinecraftComHandler.cs

code refractor

* Update IMinecraftComHandler.cs

* Update McTcpClient.cs

fix

* Update McTcpClient.cs

fix

* Fix duplicate gamemode event

Co-authored-by: ORelio <oreliogitantispam.l0gin@spamgourmet.com>
This commit is contained in:
Рома Данилов 2020-06-13 18:00:30 +05:00 committed by GitHub
parent 27f35ee7a9
commit 87302bafab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 13 deletions

View file

@ -838,6 +838,15 @@ namespace MinecraftClient
return Handler.GetUsername();
}
/// <summary>
/// Return the Gamemode of the current account
/// </summary>
/// <returns>Username of the current account</returns>
protected int GetGamemode()
{
return Handler.GetGamemode();
}
/// <summary>
/// Return the UserUUID of the current account
/// </summary>

View file

@ -41,12 +41,16 @@ namespace MinecraftClient.Commands
int slot = int.Parse(args[1]);
ItemType itemType = ItemType.Stone;
if (Enum.TryParse(args[2], out itemType))
{
if (handler.GetGamemode() == 1)
{
int count = int.Parse(args[3]);
if (handler.DoCreativeGive(slot, itemType, count))
return "Requested " + itemType + " x" + count + " in slot #" + slot;
else return "Failed to request Creative Give";
}
else return "You need Gamemode Creative";
}
else
{
return CMDDesc;

View file

@ -57,6 +57,7 @@ namespace MinecraftClient
private DateTime lastKeepAlive;
private object lastKeepAliveLock = new object();
private int respawnTicks = 0;
private int gamemode = 0;
private int playerEntityID;
@ -88,6 +89,7 @@ namespace MinecraftClient
public int GetLevel() { return playerLevel; }
public int GetTotalExperience() { return playerTotalExperience; }
public byte GetCurrentSlot() { return CurrentSlot; }
public int GetGamemode() { return gamemode; }
// get bots list for unloading them by commands
public List<ChatBot> GetLoadedChatBots()
@ -1269,14 +1271,20 @@ namespace MinecraftClient
/// Called when the Game Mode has been updated for a player
/// </summary>
/// <param name="playername">Player Name</param>
/// <param name="uuid">Player UUID</param>
/// <param name="uuid">Player UUID (Empty for initial gamemode on login)</param>
/// <param name="gamemode">New Game Mode (0: Survival, 1: Creative, 2: Adventure, 3: Spectator).</param>
public void OnGamemodeUpdate(Guid uuid, int gamemode)
{
string playerName = null;
// Initial gamemode on login
if (uuid == Guid.Empty)
this.gamemode = gamemode;
// Further regular gamemode change events
if (onlinePlayers.ContainsKey(uuid))
{
playerName = onlinePlayers[uuid];
string playerName = onlinePlayers[uuid];
if (playerName == this.username)
this.gamemode = gamemode;
foreach (ChatBot bot in bots.ToArray())
bot.OnGamemodeUpdate(playerName, uuid, gamemode);
}

View file

@ -217,7 +217,7 @@ namespace MinecraftClient.Protocol.Handlers
handler.OnGameJoined();
int playerEntityID = dataTypes.ReadNextInt(packetData);
handler.SetPlayerEntityID(playerEntityID);
dataTypes.ReadNextByte(packetData);
handler.OnGamemodeUpdate(Guid.Empty, dataTypes.ReadNextByte(packetData));
if (protocolversion >= MC191Version)
this.currentDimension = dataTypes.ReadNextInt(packetData);
else
@ -437,15 +437,14 @@ namespace MinecraftClient.Protocol.Handlers
if (dataTypes.ReadNextBool(packetData))
dataTypes.ReadNextString(packetData);
}
dataTypes.ReadNextVarInt(packetData);
handler.OnGamemodeUpdate(uuid, dataTypes.ReadNextVarInt(packetData));
dataTypes.ReadNextVarInt(packetData);
if (dataTypes.ReadNextBool(packetData))
dataTypes.ReadNextString(packetData);
handler.OnPlayerJoin(uuid, name);
break;
case 0x01: //Update gamemode
int gamemode = dataTypes.ReadNextVarInt(packetData);
handler.OnGamemodeUpdate(uuid, gamemode);
handler.OnGamemodeUpdate(uuid, dataTypes.ReadNextVarInt(packetData));
break;
case 0x02: //Update latency
int latency = dataTypes.ReadNextVarInt(packetData);
@ -1366,7 +1365,6 @@ namespace MinecraftClient.Protocol.Handlers
catch (System.IO.IOException) { return false; }
catch (ObjectDisposedException) { return false; }
}
public bool SendWindowAction(int windowId, int slotId, WindowActionType action, Item item)
{
try