Combine Packet source files into one file

This commit is contained in:
UnknownShadow200 2017-11-21 16:23:12 +11:00
parent 43c816e267
commit 19e07406eb
4 changed files with 316 additions and 369 deletions

View File

@ -582,8 +582,6 @@
<Compile Include="Network\IRCPlugin\IRCHandlers.cs" />
<Compile Include="Network\IRCPlugin\IRCPlugin.cs" />
<Compile Include="Network\Packets\Opcode.cs" />
<Compile Include="Network\Packets\Packet.BlockDefs.cs" />
<Compile Include="Network\Packets\Packet.CPE.cs" />
<Compile Include="Network\Packets\Packet.cs" />
<Compile Include="Network\Socket\Interfaces.cs" />
<Compile Include="Network\Socket\TcpListen.cs" />

View File

@ -1,80 +0,0 @@
/*
Copyright 2015 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;
namespace MCGalaxy.Network {
public static partial class Packet {
public static byte[] DefineBlock(BlockDefinition def, bool hasCP437) {
byte[] buffer = new byte[80];
int i = 0;
buffer[i++] = Opcode.CpeDefineBlock;
MakeDefineBlockStart(def, buffer, ref i, false, hasCP437);
buffer[i++] = def.Shape;
MakeDefineBlockEnd(def, ref i, buffer);
return buffer;
}
public static byte[] UndefineBlock(byte block) {
return new byte[] { Opcode.CpeRemoveBlockDefinition, block };
}
public static byte[] DefineBlockExt(BlockDefinition def, bool uniqueSideTexs, bool hasCP437) {
byte[] buffer = new byte[uniqueSideTexs ? 88 : 85];
int i = 0;
buffer[i++] = Opcode.CpeDefineBlockExt;
MakeDefineBlockStart(def, buffer, ref i, uniqueSideTexs, hasCP437);
buffer[i++] = def.MinX; buffer[i++] = def.MinZ; buffer[i++] = def.MinY;
buffer[i++] = def.MaxX; buffer[i++] = def.MaxZ; buffer[i++] = def.MaxY;
MakeDefineBlockEnd(def, ref i, buffer);
return buffer;
}
static void MakeDefineBlockStart(BlockDefinition def, byte[] buffer, ref int i,
bool uniqueSideTexs, bool hasCP437) {
// speed = 2^((raw - 128) / 64);
// therefore raw = 64log2(speed) + 128
byte rawSpeed = (byte)(64 * Math.Log(def.Speed, 2) + 128);
buffer[i++] = def.BlockID;
NetUtils.Write(def.Name, buffer, i, hasCP437);
i += NetUtils.StringSize;
buffer[i++] = def.CollideType;
buffer[i++] = rawSpeed;
buffer[i++] = def.TopTex;
if (uniqueSideTexs) {
buffer[i++] = def.LeftTex; buffer[i++] = def.RightTex;
buffer[i++] = def.FrontTex; buffer[i++] = def.BackTex;
} else {
buffer[i++] = def.SideTex;
}
buffer[i++] = def.BottomTex;
buffer[i++] = (byte)(def.BlocksLight ? 0 : 1);
buffer[i++] = def.WalkSound;
buffer[i++] = (byte)(def.FullBright ? 1 : 0);
}
static void MakeDefineBlockEnd(BlockDefinition def, ref int i, byte[] buffer) {
buffer[i++] = def.BlockDraw;
buffer[i++] = def.FogDensity;
buffer[i++] = def.FogR; buffer[i++] = def.FogG; buffer[i++] = def.FogB;
}
}
}

View File

@ -1,263 +0,0 @@
/*
Copyright 2015 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 MCGalaxy.Maths;
namespace MCGalaxy.Network {
public static partial class Packet {
public static byte[] ExtInfo(byte extsCount) {
byte[] buffer = new byte[67];
buffer[0] = Opcode.CpeExtInfo;
NetUtils.Write(Server.SoftwareNameVersioned, buffer, 1, false);
NetUtils.WriteI16((short)extsCount, buffer, 65);
return buffer;
}
public static byte[] ExtEntry(string name, int version) {
byte[] buffer = new byte[69];
buffer[0] = Opcode.CpeExtEntry;
NetUtils.Write(name, buffer, 1, false);
NetUtils.WriteI32(version, buffer, 65);
return buffer;
}
public static byte[] ClickDistance(short distance) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeSetClickDistance;
NetUtils.WriteI16(distance, buffer, 1);
return buffer;
}
public static byte[] CustomBlockSupportLevel(byte level) {
return new byte[] { Opcode.CpeCustomBlockSupportLevel, level };
}
public static byte[] HoldThis(byte block, bool locked) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeHoldThis;
buffer[1] = block;
buffer[2] = (byte)(locked ? 1 : 0);
return buffer;
}
public static byte[] TextHotKey(string label, string input, int keycode,
byte mods, bool hasCP437) {
byte[] buffer = new byte[134];
buffer[0] = Opcode.CpeSetTextHotkey;
NetUtils.Write(label, buffer, 1, hasCP437);
NetUtils.Write(input, buffer, 65, hasCP437);
NetUtils.WriteI32(keycode, buffer, 129);
buffer[133] = mods;
return buffer;
}
public static byte[] ExtAddEntity(byte entityID, string name, string displayname, bool hasCP437) {
byte[] buffer = new byte[130];
buffer[0] = Opcode.CpeExtAddEntity;
buffer[1] = entityID;
NetUtils.Write(name, buffer, 2, hasCP437);
NetUtils.Write(displayname, buffer, 66, hasCP437);
return buffer;
}
public static byte[] ExtAddPlayerName(byte nameID, string listName, string displayName,
string grp, byte grpRank, bool hasCP437) {
byte[] buffer = new byte[196];
buffer[0] = Opcode.CpeExtAddPlayerName;
NetUtils.WriteI16(nameID, buffer, 1);
NetUtils.Write(listName, buffer, 3, hasCP437);
NetUtils.Write(displayName, buffer, 67, hasCP437);
NetUtils.Write(grp, buffer, 131, hasCP437);
buffer[195] = grpRank;
return buffer;
}
public static byte[] ExtRemovePlayerName(byte nameID) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeExtRemovePlayerName;
NetUtils.WriteI16(nameID, buffer, 1);
return buffer;
}
public static byte[] EnvColor(byte type, short r, short g, short b) {
byte[] buffer = new byte[8];
buffer[0] = Opcode.CpeEnvColors;
buffer[1] = type;
NetUtils.WriteI16(r, buffer, 2);
NetUtils.WriteI16(g, buffer, 4);
NetUtils.WriteI16(b, buffer, 6);
return buffer;
}
public static byte[] MakeSelection(byte selID, string label, Vec3U16 p1, Vec3U16 p2,
short r, short g, short b, short opacity, bool hasCP437) {
byte[] buffer = new byte[86];
buffer[0] = Opcode.CpeMakeSelection;
buffer[1] = selID;
NetUtils.Write(label, buffer, 2, hasCP437);
NetUtils.WriteU16(p1.X, buffer, 66);
NetUtils.WriteU16(p1.Y, buffer, 68);
NetUtils.WriteU16(p1.Z, buffer, 70);
NetUtils.WriteU16(p2.X, buffer, 72);
NetUtils.WriteU16(p2.Y, buffer, 74);
NetUtils.WriteU16(p2.Z, buffer, 76);
NetUtils.WriteI16(r, buffer, 78);
NetUtils.WriteI16(g, buffer, 80);
NetUtils.WriteI16(b, buffer, 82);
NetUtils.WriteI16(opacity, buffer, 84);
return buffer;
}
public static byte[] DeleteSelection(byte selID) {
byte[] buffer = new byte[2];
buffer[0] = Opcode.CpeRemoveSelection;
buffer[1] = selID;
return buffer;
}
public static byte[] BlockPermission(byte block, bool place, bool delete) {
byte[] buffer = new byte[4];
WriteBlockPermission(block, place, delete, buffer, 0);
return buffer;
}
public static void WriteBlockPermission(byte block, bool place, bool delete, byte[] buffer, int index) {
buffer[index + 0] = Opcode.CpeSetBlockPermission;
buffer[index + 1] = block;
buffer[index + 2] = place ? (byte)1 : (byte)0;
buffer[index + 3] = delete ? (byte)1 : (byte)0;
}
public static byte[] ChangeModel(byte entityID, string model, bool hasCP437) {
byte[] buffer = new byte[66];
buffer[0] = Opcode.CpeChangeModel;
buffer[1] = entityID;
NetUtils.Write(model, buffer, 2, hasCP437);
return buffer;
}
public static byte[] MapAppearance(string url, byte side, byte edge, int sideLevel,
bool hasCP437) {
byte[] buffer = new byte[69];
WriteMapAppearance(buffer, url, side, edge, sideLevel, hasCP437);
return buffer;
}
public static byte[] MapAppearanceV2(string url, byte side, byte edge, int sideLevel,
int cloudHeight, int maxFog, bool hasCP437) {
byte[] buffer = new byte[73];
WriteMapAppearance(buffer, url, side, edge, sideLevel, hasCP437);
NetUtils.WriteI16((short)cloudHeight, buffer, 69);
NetUtils.WriteI16((short)maxFog, buffer, 71);
return buffer;
}
static void WriteMapAppearance(byte[] buffer, string url, byte side, byte edge,
int sideLevel, bool hasCP437) {
buffer[0] = Opcode.CpeEnvSetMapApperance;
NetUtils.Write(url, buffer, 1, hasCP437);
buffer[65] = side;
buffer[66] = edge;
NetUtils.WriteI16((short)sideLevel, buffer, 67);
}
public static byte[] EnvWeatherType(byte type) { // 0 - sunny; 1 - raining; 2 - snowing
byte[] buffer = new byte[2];
buffer[0] = Opcode.CpeEnvWeatherType;
buffer[1] = type;
return buffer;
}
public static byte[] HackControl(bool canFly, bool canNoclip,
bool canSpeed, bool canRespawn,
bool can3rdPerson, short maxJumpHeight) {
byte[] buffer = new byte[8];
buffer[0] = Opcode.CpeHackControl;
buffer[1] = (byte)(canFly ? 1 : 0);
buffer[2] = (byte)(canNoclip ? 1 : 0);
buffer[3] = (byte)(canSpeed ? 1 : 0);
buffer[4] = (byte)(canRespawn ? 1 : 0);
buffer[5] = (byte)(can3rdPerson ? 1 : 0);
NetUtils.WriteI16(maxJumpHeight, buffer, 6);
return buffer;
}
public static byte[] ExtAddEntity2(byte entityID, string skinName, string displayName,
Position pos, Orientation rot, bool hasCP437, bool extPos) {
byte[] buffer = new byte[138 + (extPos ? 6 : 0)];
buffer[0] = Opcode.CpeExtAddEntity2;
buffer[1] = entityID;
NetUtils.Write(displayName.RemoveLastPlus(), buffer, 2, hasCP437);
NetUtils.Write(skinName.RemoveLastPlus(), buffer, 66, hasCP437);
int offset = NetUtils.WritePos(pos, buffer, 130, extPos);
buffer[130 + offset] = rot.RotY;
buffer[131 + offset] = rot.HeadX;
return buffer;
}
public static byte[] SetTextColor(ColorDesc col) {
byte[] buffer = new byte[6];
buffer[0] = Opcode.CpeSetTextColor;
buffer[1] = col.R; buffer[2] = col.G; buffer[3] = col.B; buffer[4] = col.A;
buffer[5] = (byte)col.Code;
return buffer;
}
public static byte[] EnvMapUrl(string url, bool hasCP437) {
byte[] buffer = new byte[65];
buffer[0] = Opcode.CpeSetMapEnvUrl;
NetUtils.Write(url, buffer, 1, hasCP437);
return buffer;
}
public static byte[] EnvMapProperty(EnvProp prop, int value) {
byte[] buffer = new byte[6];
buffer[0] = Opcode.CpeSetMapEnvProperty;
buffer[1] = (byte)prop;
NetUtils.WriteI32(value, buffer, 2);
return buffer;
}
public static byte[] EntityProperty(byte entityID, EntityProp prop, int value) {
byte[] buffer = new byte[7];
buffer[0] = Opcode.CpeSetEntityProperty;
buffer[1] = entityID;
buffer[2] = (byte)prop;
NetUtils.WriteI32(value, buffer, 3);
return buffer;
}
public static byte[] TwoWayPing(bool serverToClient, ushort data) {
byte[] buffer = new byte[4];
buffer[0] = Opcode.CpeTwoWayPing;
buffer[1] = (byte)(serverToClient ? 1 : 0);
NetUtils.WriteU16(data, buffer, 2);
return buffer;
}
public static byte[] SetInventoryOrder(byte block, byte position) {
return new byte[] { Opcode.CpeSetInventoryOrder, block, position };
}
}
}

View File

@ -17,13 +17,15 @@
*/
using System;
using MCGalaxy.Blocks;
using MCGalaxy.Maths;
namespace MCGalaxy.Network {
public static partial class Packet {
/// <summary> Constructors for all classic and CPE packets. </summary>
public static class Packet {
#region Classic
/// <summary> Constructs a handshake/motd packet. The text is shown to clients during map loading. </summary>
/// <remarks> Some clients recognise special modifiers such as -hax +fly in this packet. </remarks>
public static byte[] Motd(Player p, string motd) {
byte[] buffer = new byte[131];
buffer[0] = Opcode.Handshake;
@ -41,17 +43,10 @@ namespace MCGalaxy.Network {
return buffer;
}
/// <summary> Constructs a ping packet. </summary>
public static byte[] Ping() {
return new byte[] { Opcode.Ping };
}
public static byte[] Ping() { return new byte[] { Opcode.Ping }; }
/// <summary> Constructs a packet that specified map data is about to be sent. </summary>
public static byte[] LevelInitalise() {
return new byte[] { Opcode.LevelInitialise };
}
public static byte[] LevelInitalise() { return new byte[] { Opcode.LevelInitialise }; }
/// <summary> Constructs a packet describing the dimensions of a level. </summary>
public static byte[] LevelFinalise(ushort width, ushort height, ushort length) {
byte[] buffer = new byte[7];
buffer[0] = Opcode.LevelFinalise;
@ -61,8 +56,7 @@ namespace MCGalaxy.Network {
return buffer;
}
/// <summary> Constructs a packet that adds/spawns an entity. </summary>
public static byte[] AddEntity(byte entityID, string name, Position pos,
public static byte[] AddEntity(byte entityID, string name, Position pos,
Orientation rot, bool hasCP437, bool extPos) {
byte[] buffer = new byte[74 + (extPos ? 6 : 0)];
buffer[0] = Opcode.AddEntity;
@ -75,7 +69,6 @@ namespace MCGalaxy.Network {
return buffer;
}
/// <summary> Constructs an absolute position/teleport and rotation movement packet. </summary>
public static byte[] Teleport(byte entityID, Position pos, Orientation rot, bool extPos) {
byte[] buffer = new byte[10 + (extPos ? 6 : 0)];
buffer[0] = Opcode.EntityTeleport;
@ -86,16 +79,13 @@ namespace MCGalaxy.Network {
buffer[3 + offset] = rot.HeadX;
return buffer;
}
/// <summary> Constructs a packet that removes/despawns an entity. </summary>
public static byte[] RemoveEntity(byte entityID) {
return new byte[] { Opcode.RemoveEntity, entityID };
}
/// <summary> Constructs a chat message packet with an empty message. </summary>
public static byte[] BlankMessage() { return Message("", 0, false); }
/// <summary> Constructs a chat message packet. </summary>
public static byte[] Message(string message, CpeMessageType type, bool hasCp437) {
byte[] buffer = new byte[66];
buffer[0] = Opcode.Message;
@ -104,21 +94,323 @@ namespace MCGalaxy.Network {
return buffer;
}
/// <summary> Constructs a kick / disconnect packet with the given reason / message. </summary>
public static byte[] Kick(string message, bool cp437) {
byte[] buffer = new byte[65];
buffer[0] = Opcode.Kick;
NetUtils.Write(message, buffer, 1, cp437);
return buffer;
}
/// <summary> Constructs a set user type/permission packet. </summary>
/// <remarks> For certain clients, sets whether they are allowed to place bedrock, use ophax, place liquids. </remarks>
}
public static byte[] UserType(Player p) {
byte[] buffer = new byte[2];
buffer[0] = Opcode.SetPermission;
buffer[1] = BlockPerms.UsableBy(p, Block.Bedrock) ? (byte)100 : (byte)0;
return buffer;
}
#endregion
#region CPE
public static byte[] ExtInfo(byte extsCount) {
byte[] buffer = new byte[67];
buffer[0] = Opcode.CpeExtInfo;
NetUtils.Write(Server.SoftwareNameVersioned, buffer, 1, false);
NetUtils.WriteI16((short)extsCount, buffer, 65);
return buffer;
}
public static byte[] ExtEntry(string name, int version) {
byte[] buffer = new byte[69];
buffer[0] = Opcode.CpeExtEntry;
NetUtils.Write(name, buffer, 1, false);
NetUtils.WriteI32(version, buffer, 65);
return buffer;
}
public static byte[] ClickDistance(short distance) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeSetClickDistance;
NetUtils.WriteI16(distance, buffer, 1);
return buffer;
}
public static byte[] CustomBlockSupportLevel(byte level) {
return new byte[] { Opcode.CpeCustomBlockSupportLevel, level };
}
public static byte[] HoldThis(byte block, bool locked) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeHoldThis;
buffer[1] = block;
buffer[2] = (byte)(locked ? 1 : 0);
return buffer;
}
public static byte[] TextHotKey(string label, string input, int keycode,
byte mods, bool hasCP437) {
byte[] buffer = new byte[134];
buffer[0] = Opcode.CpeSetTextHotkey;
NetUtils.Write(label, buffer, 1, hasCP437);
NetUtils.Write(input, buffer, 65, hasCP437);
NetUtils.WriteI32(keycode, buffer, 129);
buffer[133] = mods;
return buffer;
}
public static byte[] ExtAddEntity(byte entityID, string name, string displayname, bool hasCP437) {
byte[] buffer = new byte[130];
buffer[0] = Opcode.CpeExtAddEntity;
buffer[1] = entityID;
NetUtils.Write(name, buffer, 2, hasCP437);
NetUtils.Write(displayname, buffer, 66, hasCP437);
return buffer;
}
public static byte[] ExtAddPlayerName(byte nameID, string listName, string displayName,
string grp, byte grpRank, bool hasCP437) {
byte[] buffer = new byte[196];
buffer[0] = Opcode.CpeExtAddPlayerName;
NetUtils.WriteI16(nameID, buffer, 1);
NetUtils.Write(listName, buffer, 3, hasCP437);
NetUtils.Write(displayName, buffer, 67, hasCP437);
NetUtils.Write(grp, buffer, 131, hasCP437);
buffer[195] = grpRank;
return buffer;
}
public static byte[] ExtRemovePlayerName(byte nameID) {
byte[] buffer = new byte[3];
buffer[0] = Opcode.CpeExtRemovePlayerName;
NetUtils.WriteI16(nameID, buffer, 1);
return buffer;
}
public static byte[] EnvColor(byte type, short r, short g, short b) {
byte[] buffer = new byte[8];
buffer[0] = Opcode.CpeEnvColors;
buffer[1] = type;
NetUtils.WriteI16(r, buffer, 2);
NetUtils.WriteI16(g, buffer, 4);
NetUtils.WriteI16(b, buffer, 6);
return buffer;
}
public static byte[] MakeSelection(byte selID, string label, Vec3U16 p1, Vec3U16 p2,
short r, short g, short b, short opacity, bool hasCP437) {
byte[] buffer = new byte[86];
buffer[0] = Opcode.CpeMakeSelection;
buffer[1] = selID;
NetUtils.Write(label, buffer, 2, hasCP437);
NetUtils.WriteU16(p1.X, buffer, 66);
NetUtils.WriteU16(p1.Y, buffer, 68);
NetUtils.WriteU16(p1.Z, buffer, 70);
NetUtils.WriteU16(p2.X, buffer, 72);
NetUtils.WriteU16(p2.Y, buffer, 74);
NetUtils.WriteU16(p2.Z, buffer, 76);
NetUtils.WriteI16(r, buffer, 78);
NetUtils.WriteI16(g, buffer, 80);
NetUtils.WriteI16(b, buffer, 82);
NetUtils.WriteI16(opacity, buffer, 84);
return buffer;
}
public static byte[] DeleteSelection(byte selID) {
byte[] buffer = new byte[2];
buffer[0] = Opcode.CpeRemoveSelection;
buffer[1] = selID;
return buffer;
}
public static byte[] BlockPermission(byte block, bool place, bool delete) {
byte[] buffer = new byte[4];
WriteBlockPermission(block, place, delete, buffer, 0);
return buffer;
}
public static void WriteBlockPermission(byte block, bool place, bool delete, byte[] buffer, int index) {
buffer[index + 0] = Opcode.CpeSetBlockPermission;
buffer[index + 1] = block;
buffer[index + 2] = place ? (byte)1 : (byte)0;
buffer[index + 3] = delete ? (byte)1 : (byte)0;
}
public static byte[] ChangeModel(byte entityID, string model, bool hasCP437) {
byte[] buffer = new byte[66];
buffer[0] = Opcode.CpeChangeModel;
buffer[1] = entityID;
NetUtils.Write(model, buffer, 2, hasCP437);
return buffer;
}
public static byte[] MapAppearance(string url, byte side, byte edge, int sideLevel,
bool hasCP437) {
byte[] buffer = new byte[69];
WriteMapAppearance(buffer, url, side, edge, sideLevel, hasCP437);
return buffer;
}
public static byte[] MapAppearanceV2(string url, byte side, byte edge, int sideLevel,
int cloudHeight, int maxFog, bool hasCP437) {
byte[] buffer = new byte[73];
WriteMapAppearance(buffer, url, side, edge, sideLevel, hasCP437);
NetUtils.WriteI16((short)cloudHeight, buffer, 69);
NetUtils.WriteI16((short)maxFog, buffer, 71);
return buffer;
}
static void WriteMapAppearance(byte[] buffer, string url, byte side, byte edge,
int sideLevel, bool hasCP437) {
buffer[0] = Opcode.CpeEnvSetMapApperance;
NetUtils.Write(url, buffer, 1, hasCP437);
buffer[65] = side;
buffer[66] = edge;
NetUtils.WriteI16((short)sideLevel, buffer, 67);
}
public static byte[] EnvWeatherType(byte type) { // 0 - sunny; 1 - raining; 2 - snowing
byte[] buffer = new byte[2];
buffer[0] = Opcode.CpeEnvWeatherType;
buffer[1] = type;
return buffer;
}
public static byte[] HackControl(bool canFly, bool canNoclip,
bool canSpeed, bool canRespawn,
bool can3rdPerson, short maxJumpHeight) {
byte[] buffer = new byte[8];
buffer[0] = Opcode.CpeHackControl;
buffer[1] = (byte)(canFly ? 1 : 0);
buffer[2] = (byte)(canNoclip ? 1 : 0);
buffer[3] = (byte)(canSpeed ? 1 : 0);
buffer[4] = (byte)(canRespawn ? 1 : 0);
buffer[5] = (byte)(can3rdPerson ? 1 : 0);
NetUtils.WriteI16(maxJumpHeight, buffer, 6);
return buffer;
}
public static byte[] ExtAddEntity2(byte entityID, string skinName, string displayName,
Position pos, Orientation rot, bool hasCP437, bool extPos) {
byte[] buffer = new byte[138 + (extPos ? 6 : 0)];
buffer[0] = Opcode.CpeExtAddEntity2;
buffer[1] = entityID;
NetUtils.Write(displayName.RemoveLastPlus(), buffer, 2, hasCP437);
NetUtils.Write(skinName.RemoveLastPlus(), buffer, 66, hasCP437);
int offset = NetUtils.WritePos(pos, buffer, 130, extPos);
buffer[130 + offset] = rot.RotY;
buffer[131 + offset] = rot.HeadX;
return buffer;
}
public static byte[] SetTextColor(ColorDesc col) {
byte[] buffer = new byte[6];
buffer[0] = Opcode.CpeSetTextColor;
buffer[1] = col.R; buffer[2] = col.G; buffer[3] = col.B; buffer[4] = col.A;
buffer[5] = (byte)col.Code;
return buffer;
}
public static byte[] EnvMapUrl(string url, bool hasCP437) {
byte[] buffer = new byte[65];
buffer[0] = Opcode.CpeSetMapEnvUrl;
NetUtils.Write(url, buffer, 1, hasCP437);
return buffer;
}
public static byte[] EnvMapProperty(EnvProp prop, int value) {
byte[] buffer = new byte[6];
buffer[0] = Opcode.CpeSetMapEnvProperty;
buffer[1] = (byte)prop;
NetUtils.WriteI32(value, buffer, 2);
return buffer;
}
public static byte[] EntityProperty(byte entityID, EntityProp prop, int value) {
byte[] buffer = new byte[7];
buffer[0] = Opcode.CpeSetEntityProperty;
buffer[1] = entityID;
buffer[2] = (byte)prop;
NetUtils.WriteI32(value, buffer, 3);
return buffer;
}
public static byte[] TwoWayPing(bool serverToClient, ushort data) {
byte[] buffer = new byte[4];
buffer[0] = Opcode.CpeTwoWayPing;
buffer[1] = (byte)(serverToClient ? 1 : 0);
NetUtils.WriteU16(data, buffer, 2);
return buffer;
}
public static byte[] SetInventoryOrder(byte block, byte position) {
return new byte[] { Opcode.CpeSetInventoryOrder, block, position };
}
#endregion
#region Block definitions
public static byte[] DefineBlock(BlockDefinition def, bool hasCP437) {
byte[] buffer = new byte[80];
int i = 0;
buffer[i++] = Opcode.CpeDefineBlock;
MakeDefineBlockStart(def, buffer, ref i, false, hasCP437);
buffer[i++] = def.Shape;
MakeDefineBlockEnd(def, ref i, buffer);
return buffer;
}
public static byte[] UndefineBlock(byte block) {
return new byte[] { Opcode.CpeRemoveBlockDefinition, block };
}
public static byte[] DefineBlockExt(BlockDefinition def, bool uniqueSideTexs, bool hasCP437) {
byte[] buffer = new byte[uniqueSideTexs ? 88 : 85];
int i = 0;
buffer[i++] = Opcode.CpeDefineBlockExt;
MakeDefineBlockStart(def, buffer, ref i, uniqueSideTexs, hasCP437);
buffer[i++] = def.MinX; buffer[i++] = def.MinZ; buffer[i++] = def.MinY;
buffer[i++] = def.MaxX; buffer[i++] = def.MaxZ; buffer[i++] = def.MaxY;
MakeDefineBlockEnd(def, ref i, buffer);
return buffer;
}
static void MakeDefineBlockStart(BlockDefinition def, byte[] buffer, ref int i,
bool uniqueSideTexs, bool hasCP437) {
// speed = 2^((raw - 128) / 64);
// therefore raw = 64log2(speed) + 128
byte rawSpeed = (byte)(64 * Math.Log(def.Speed, 2) + 128);
buffer[i++] = def.BlockID;
NetUtils.Write(def.Name, buffer, i, hasCP437);
i += NetUtils.StringSize;
buffer[i++] = def.CollideType;
buffer[i++] = rawSpeed;
buffer[i++] = def.TopTex;
if (uniqueSideTexs) {
buffer[i++] = def.LeftTex; buffer[i++] = def.RightTex;
buffer[i++] = def.FrontTex; buffer[i++] = def.BackTex;
} else {
buffer[i++] = def.SideTex;
}
buffer[i++] = def.BottomTex;
buffer[i++] = (byte)(def.BlocksLight ? 0 : 1);
buffer[i++] = def.WalkSound;
buffer[i++] = (byte)(def.FullBright ? 1 : 0);
}
static void MakeDefineBlockEnd(BlockDefinition def, ref int i, byte[] buffer) {
buffer[i++] = def.BlockDraw;
buffer[i++] = def.FogDensity;
buffer[i++] = def.FogR; buffer[i++] = def.FogG; buffer[i++] = def.FogB;
}
#endregion
}
}