private void SteelSkin(Entity sourceEntity) { if (Network is BedrockClient bc) { MiNET.Utils.Skins.Skin skin = null; if (sourceEntity is RemotePlayer player) { if (player.Skin != null) { skin = player.Skin; } } else { if (sourceEntity?.ModelRenderer?.Model == null) { return; } var model = sourceEntity.ModelRenderer.Model; skin = model.ToSkin(); } if (skin == null) { return; } var texture = sourceEntity.ModelRenderer.Texture; if (skin.Data == null || skin.Data.Length == 0) { skin = skin.UpdateTexture(texture); } var packet = McpePlayerSkin.CreateObject(); packet.skin = skin; packet.uuid = UUID; packet.isVerified = true; packet.skinName = skin.SkinId; packet.oldSkinName = ""; bc.SendPacket(packet); Skin = skin; Log.Info($"Stole skin from {sourceEntity.NameTag}"); /* File.WriteAllText(Path.Combine("skins", skin.SkinId + ".json"), skin.GeometryData); * * if (skin.TryGetBitmap(out var bmp)) * { * bmp.SaveAsPng(Path.Combine("skins", skin.SkinId + ".png")); * }*/ } }
private void PlayerOnTicking(object sender, PlayerEventArgs playerEventArgs) { { var player = (PlayerMob)sender; if (player.Level.TickTime % 4 != 0) { return; } } using var bmpScreenCapture = new Bitmap(2150, 1519); using (var g = Graphics.FromImage(bmpScreenCapture)) { g.CopyFromScreen(1669, 90, 0, 0, bmpScreenCapture.Size, CopyPixelOperation.SourceCopy); } using var srcBitmap = new Bitmap(bmpScreenCapture, new Size((_width) * 62, (_height) * 62)); foreach (var mobCoord in mobs) { PlayerMob mob = mobCoord.Value; mob.AddToPlayerList(); int offsetx = (mobCoord.Key.Item1) * 62; int offsety = (_height - mobCoord.Key.Item2 - 1) * 62; using Bitmap croppedImage = NiceLobbyPlugin.CropImage(srcBitmap, new Rectangle(offsetx, offsety, 62, 62)); using Bitmap textureImage = new Bitmap(64, 64); var gfx = Graphics.FromImage(textureImage); gfx.FillRectangle(Brushes.Black, new Rectangle(0, 0, 64, 64)); gfx.DrawImageUnscaled(croppedImage, new Point(1, 1)); //var bytes = NiceLobbyPlugin.BitmapToBytes(textureImage, true); var stream = new MemoryStream(); textureImage.Save(stream, ImageFormat.MemoryBmp); var bytes = stream.ToArray(); string oldSkinId = mob.Skin.SkinId; var skin = (Skin)mob.Skin.Clone(); skin.Data = bytes; skin.SkinId = "testing" + new Guid(); mob.Skin = skin; var updateSkin = McpePlayerSkin.CreateObject(); updateSkin.uuid = mob.ClientUuid; updateSkin.oldSkinName = oldSkinId; updateSkin.skinName = mob.Skin.SkinId; updateSkin.skin = mob.Skin; mob.Level.RelayBroadcast(updateSkin); mob.RemoveFromPlayerList(); } }
private void PlayerOnTicking(object sender, PlayerEventArgs playerEventArgs) { { var player = (PlayerMob)sender; if (player.Level.TickTime % 4 != 0) { return; } } using (Bitmap bmpScreenCapture = new Bitmap(1118, 801)) { using (Graphics g = Graphics.FromImage(bmpScreenCapture)) { g.CopyFromScreen(620, 101, 0, 0, bmpScreenCapture.Size, CopyPixelOperation.SourceCopy); } using (Bitmap srcBitmap = new Bitmap(bmpScreenCapture, new Size((_width) * 64, (_height) * 64))) { foreach (var mobCoord in mobs) { PlayerMob mob = mobCoord.Value; mob.AddToPlayerList(); int offsetx = (mobCoord.Key.Item1) * 64; int offsety = (_height - mobCoord.Key.Item2 - 1) * 64; using (Bitmap bitmap = NiceLobbyPlugin.CropImage(srcBitmap, new Rectangle(offsetx, offsety, 64, 64))) { var bytes = NiceLobbyPlugin.BitmapToBytes(bitmap, true); var skin = mob.Skin; skin.SkinData = bytes; McpePlayerSkin updateSkin = McpePlayerSkin.CreateObject(); updateSkin.uuid = mob.ClientUuid; updateSkin.skinId = skin.SkinId + new Guid(); updateSkin.skinData = skin.SkinData; updateSkin.capeData = skin.CapeData; updateSkin.geometryModel = skin.SkinGeometryName; updateSkin.geometryData = skin.SkinGeometry; mob.Level.RelayBroadcast(updateSkin); } mob.RemoveFromPlayerList(); } } } }
private void SkinTick(object state) { if (!Monitor.TryEnter(_skinSynk)) { return; } try { foreach (var player in _players.Values) { { if (!player.Username.Equals("gurunx")) { continue; } Log.Debug("Skin tick"); if (_image >= 9) { _image = 0; } _image++; _imageCape++; Skin skin = player.Skin; //skin.SkinGeometryName = ""; //skin.SkinGeometry = Encoding.UTF8.GetBytes(File.ReadAllText(@"D:\Temp\humanoid.json")); //{ // string file = Path.Combine(@"D:\Development\Other\Smash Heroes 3x6 (128)\Smash Heroes 3x6 (128)", $"Smash Heroes Trailer{_imageCape:D4}.bmp"); // //string file = @"D:\Temp\Smiley\big_smile0" + _image + ".png"; // if (!File.Exists(file)) // { // _imageCape = 0; // continue; // } // //Bitmap bitmap = new Bitmap((Bitmap)Image.FromFile(file), 12, 18); // Bitmap bitmap = new Bitmap((Bitmap) Image.FromFile(file), 64, 64); // int offsetx = 16, offsety = 16; // bitmap = CropImage(bitmap, new Rectangle(offsetx, offsety, 12, 18)); // byte[] bytes = new byte[32 * 64 * 4]; // int i = 0; // for (int y = 0; y < 32; y++) // { // for (int x = 0; x < 64; x++) // { // if (y >= bitmap.Height || x >= bitmap.Width) // { // Color color = Color.Yellow; // bytes[i++] = color.R; // bytes[i++] = color.G; // bytes[i++] = color.B; // bytes[i++] = color.A; // continue; // } // else // { // Color color = bitmap.GetPixel(x, y); // bytes[i++] = color.R; // bytes[i++] = color.G; // bytes[i++] = color.B; // bytes[i++] = color.A; // } // } // } // skin.Cape = new Cape() // { // ImageHeight = 32, // ImageWidth = 64, // Data = bytes, // }; //} Level level = player.Level; if (level.TickTime % 10 != 0) { continue; } //player.SetNameTag(player.Username + " " + level.TickTime + " testing"); //player.SetDisplayName(player.Username + " " + level.TickTime + " testing"); var texture = skin.Data; byte[] smiley = GetTextureFromFile(@"C:\Temp\Smiley\big_smile0" + _image + ".png"); if (smiley.Length != 8 * 8 * 4) { return; } int s = 0; int br = 8; int bc = 8; for (int r = 0; r < 8; r++) { for (int c = 0; c < 8; c++) { int i = ((c + bc) * 4) + ((r + br) * 64 * 4); int j = ((c) * 4) + ((r) * 8 * 4); texture[(i) + 0] = smiley[j + 0]; texture[(i) + 1] = smiley[j + 1]; texture[(i) + 2] = smiley[j + 2]; texture[(i) + 3] = smiley[j + 3]; } } { var updateSkin = McpePlayerSkin.CreateObject(); updateSkin.uuid = player.ClientUuid; updateSkin.oldSkinName = player.Skin.SkinId; updateSkin.skin = skin; updateSkin.skinName = skin.SkinId; level.RelayBroadcast(updateSkin); } { //player.SpawnPosition = player.KnownPosition; //level.DespawnFromAll(player); //level.SpawnToAll(player); //var players = level.GetSpawnedPlayers(); //McpePlayerList playerList = McpePlayerList.CreateObject(); //playerList.records = new PlayerAddRecords {player}; //level.RelayBroadcast(player, players, CreateMcpeBatch(playerList.Encode())); //playerList.records = null; //playerList.PutPool(); //player.IsInvisible = true; //player.HideNameTag = true; //player.BroadcastSetEntityData(); //player.SpawnToPlayers(players); //Thread.Sleep(100); //player.HideNameTag = false; //player.IsInvisible = false; //player.BroadcastSetEntityData(); } } } } catch (Exception e) { Log.Error("SkinTick", e); } finally { Monitor.Exit(_skinSynk); } }
public void HandleMcpePlayerSkin(McpePlayerSkin message) { }
public abstract void HandleMcpePlayerSkin(McpePlayerSkin message);
public void FakeMeltTicking(object sender, PlayerEventArgs playerEventArgs) { var mob = (PlayerMob)sender; //Log.Warn("Done. De-register tick."); //mob.Ticking -= FakeMeltTicking; //return; if (CurrentModel == null) { Log.Warn($"No current model set for mob."); return; } try { bool stillMoving = false; foreach (Geometry geometry in CurrentModel.Geometry) { foreach (Bone bone in geometry.Bones) { if (bone.NeverRender) { continue; } if (bone.Cubes == null || bone.Cubes.Count == 0) { continue; } foreach (var cube in bone.Cubes) { if (cube.Origin[1] <= 0.05f && cube.Velocity.Y <= 0.01) { cube.Origin[1] = 0f; cube.Velocity = Vector3.Zero; continue; } stillMoving = true; float x = cube.Origin[0]; float y = cube.Origin[1]; float z = cube.Origin[2]; cube.Origin = new[] { x + cube.Velocity.X, Math.Max(0f, y + cube.Velocity.Y), z + cube.Velocity.Z }; cube.Velocity -= new Vector3(0, Gravity, 0); cube.Velocity *= 1 - Drag; } } } if (!stillMoving) { Log.Warn("Done. De-register tick."); mob.Ticking -= FakeMeltTicking; // Reset? if (ResetOnEnd) { Skin skin = mob.Skin; var updateSkin = McpePlayerSkin.CreateObject(); updateSkin.NoBatch = true; updateSkin.uuid = mob.ClientUuid; updateSkin.oldSkinName = mob.Skin.SkinId; updateSkin.skinName = mob.Skin.SkinId; updateSkin.skin = skin; mob.Level.RelayBroadcast(updateSkin); } } else { Skin skin = mob.Skin; Geometry geometry = CurrentModel.FindGeometry(skin.GeometryName); geometry.Description.Identifier = $"geometry.{DateTime.UtcNow.Ticks}.{mob.ClientUuid}"; mob.Skin.SkinResourcePatch = new SkinResourcePatch() { Geometry = new GeometryIdentifier() { Default = geometry.Description.Identifier } }; CurrentModel.Geometry.Clear(); CurrentModel.Geometry.Add(geometry); skin.GeometryName = geometry.Description.Identifier; skin.GeometryData = Skin.ToJson(CurrentModel); var updateSkin = McpePlayerSkin.CreateObject(); updateSkin.NoBatch = true; updateSkin.uuid = mob.ClientUuid; updateSkin.oldSkinName = mob.Skin.SkinId; updateSkin.skinName = mob.Skin.SkinId; updateSkin.skin = skin; mob.Level.RelayBroadcast(updateSkin); } } catch (Exception e) { mob.Ticking -= FakeMeltTicking; Log.Error(e); } }
public override void HandleMcpePlayerSkin(McpePlayerSkin message) { }
public void FakeMeltTicking(object sender, PlayerEventArgs playerEventArgs) { Log.Debug("Ticking ... "); PlayerMob mob = (PlayerMob)sender; //Log.Warn("Done. De-register tick."); //mob.Ticking -= FakeMeltTicking; //return; if (CurrentModel == null) { return; } try { bool stillMoving = false; foreach (var geometry in CurrentModel.Values) { foreach (var bone in geometry.Bones) { if (bone.NeverRender) { continue; } if (bone.Cubes == null || bone.Cubes.Count == 0) { continue; } foreach (var cube in bone.Cubes) { if (cube.Origin[1] <= 0.05f && cube.Velocity.Y <= 0.01) { cube.Origin[1] = 0f; cube.Velocity = Vector3.Zero; continue; } stillMoving = true; float x = cube.Origin[0]; float y = cube.Origin[1]; float z = cube.Origin[2]; cube.Origin = new[] { x + cube.Velocity.X, Math.Max(0f, y + cube.Velocity.Y), z + cube.Velocity.Z }; cube.Velocity -= new Vector3(0, Gravity, 0); cube.Velocity *= 1 - Drag; } } } if (!stillMoving) { Log.Warn("Done. De-register tick."); mob.Ticking -= FakeMeltTicking; // Reset? if (ResetOnEnd) { Skin skin = mob.Skin; McpePlayerSkin updateSkin = McpePlayerSkin.CreateObject(); updateSkin.NoBatch = true; updateSkin.uuid = mob.ClientUuid; updateSkin.skin = skin; mob.Level.RelayBroadcast(updateSkin); } } else { Skin skin = mob.Skin; var geometry = CurrentModel.FindGeometry(skin.GeometryName); geometry.Name = $"geometry.{DateTime.UtcNow.Ticks}.{mob.ClientUuid}"; CurrentModel.Clear(); CurrentModel.Add(geometry.Name, geometry); skin.GeometryName = geometry.Name; McpePlayerSkin updateSkin = McpePlayerSkin.CreateObject(); updateSkin.NoBatch = true; updateSkin.uuid = mob.ClientUuid; updateSkin.skin = skin; mob.Level.RelayBroadcast(updateSkin); } } catch (Exception e) { mob.Ticking -= FakeMeltTicking; Log.Error(e); } }
public override void HandleMcpePlayerSkin(McpePlayerSkin message) { //TODO: Load skin UnhandledPackage(message); }