Beispiel #1
0
        /// <inheritdoc />
        public ChestBlockEntity(Block block, World level, PooledTexture2D texture) : base(level, block)
        {
            Width  = 16;
            Height = 16;

            ModelRenderer = new EntityModelRenderer(new ChestEntityModel(), texture);
        }
Beispiel #2
0
        /// <inheritdoc />
        public SkullBlockEntity(World level, Block block, PooledTexture2D texture) : base(level, block)
        {
            ModelRenderer = new EntityModelRenderer(new SkullBlockEntityModel(), texture);

            Width  = 8;
            Height = 8;
        }
Beispiel #3
0
        internal void UpdateSkin(PooledTexture2D skinTexture)
        {
            if (skinTexture == null)
            {
                skinTexture = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, Alex.PlayerTexture);
            }

            //if (skinSlim)
            {
                var gotModel = ModelFactory.TryGetModel(GeometryName,
                                                        out EntityModel m);

                ValidModel = gotModel;
                if (gotModel || ModelFactory.TryGetModel("geometry.humanoid.customSlim", out m))
                {
                    if (!gotModel)
                    {
                    }
                    _model        = m;
                    ModelRenderer = new EntityModelRenderer(_model, skinTexture);
                    //UpdateModelParts();
                }
            }

            /*else
             * {
             *      if (ModelFactory.TryGetModel("geometry.humanoid.custom",
             *              out EntityModel m))
             *      {
             *              _model = m;
             *              ModelRenderer = new EntityModelRenderer(_model, skinTexture);
             *              UpdateModelParts();
             *      }
             * }*/
        }
Beispiel #4
0
 private void Set(EntityModelRenderer renderer, string bone, bool value)
 {
     if (renderer.GetBone(bone, out var boneValue))
     {
         boneValue.Rendered = value;
     }
 }
Beispiel #5
0
        internal void UpdateSkin(PooledTexture2D skinTexture)
        {
            //if (skinSlim)
            {
                var gotModel = ModelFactory.TryGetModel(GeometryName,
                                                        out EntityModel m);
                ValidModel = gotModel;
                if (gotModel || ModelFactory.TryGetModel("geometry.humanoid.customSlim", out m))
                {
                    if (!gotModel)
                    {
                    }
                    _model        = m;
                    ModelRenderer = new EntityModelRenderer(_model, skinTexture);
                    UpdateModelParts();
                }
            }

            /*else
             * {
             *      if (ModelFactory.TryGetModel("geometry.humanoid.custom",
             *              out EntityModel m))
             *      {
             *              _model = m;
             *              ModelRenderer = new EntityModelRenderer(_model, skinTexture);
             *              UpdateModelParts();
             *      }
             * }*/
        }
Beispiel #6
0
        internal void UpdateSkin(PooledTexture2D skinTexture)
        {
            if (skinTexture != null && ModelRenderer != null)
            {
                ModelRenderer.Texture = skinTexture;
                return;
            }

            string geometry = "geometry.humanoid.customSlim";

            if (skinTexture == null)
            {
                string skinVariant = "entity/alex";
                var    uuid        = UUID.GetBytes();

                if ((uuid[3] ^ uuid[7] ^ uuid[11] ^ uuid[15]) % 2 == 0)
                {
                    skinVariant = "entity/steve";
                    geometry    = "geometry.humanoid.custom";
                }

                if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(skinVariant, out var rawTexture))
                {
                    skinTexture = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, rawTexture);
                    //skinBitmap = rawTexture;
                }
                else
                {
                    skinTexture = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, Alex.PlayerTexture);
                }
            }

            //if (skinSlim)
            {
                //var gotModel = ModelFactory.TryGetModel(GeometryName,
                //	out EntityModel m);

                //ValidModel = gotModel;
                if (ModelFactory.TryGetModel(geometry, out var m))
                {
                    _model        = m;
                    ValidModel    = true;
                    ModelRenderer = new EntityModelRenderer(_model, skinTexture);
                    //UpdateModelParts();
                }
            }

            /*else
             * {
             *      if (ModelFactory.TryGetModel("geometry.humanoid.custom",
             *              out EntityModel m))
             *      {
             *              _model = m;
             *              ModelRenderer = new EntityModelRenderer(_model, skinTexture);
             *              UpdateModelParts();
             *      }
             * }*/
        }
Beispiel #7
0
 public void ApplyTo(EntityModelRenderer renderer)
 {
     Set(renderer, "cape", CapeEnabled);
     Set(renderer, "jacket", JacketEnabled);
     Set(renderer, "leftSleeve", LeftSleeveEnabled);
     Set(renderer, "rightSleeve", RightSleeveEnabled);
     Set(renderer, "leftPants", LeftPantsEnabled);
     Set(renderer, "rightPants", RightPantsEnabled);
     Set(renderer, "hat", HatEnabled);
 }
Beispiel #8
0
        public static bool ModelByType(EntityType type, out EntityModelRenderer renderer, out EntityData data)
        {
            if (_typeToId.TryGetValue(type, out long id))
            {
                return(ModelByNetworkId(id, out renderer, out data));
            }

            renderer = null;
            data     = null;
            return(false);
        }
Beispiel #9
0
        /// <inheritdoc />
        public ChestBlockEntity(Block block, World level, PooledTexture2D texture) : base(level, block)
        {
            Width  = 16;
            Height = 16;

            ModelRenderer = new EntityModelRenderer(new ChestModel(), texture);

            if (ModelRenderer.GetBone("head", out var head))
            {
                HeadBone = head;
            }
        }
Beispiel #10
0
        public static bool ModelByNetworkId(long networkId, out EntityModelRenderer renderer, out EntityData data)
        {
            if (_idToData.TryGetValue(networkId, out data))
            {
                renderer = TryGetRendererer(data, null);
                if (renderer != null)
                {
                    return(true);
                }
                else
                {
                    Log.Warn($"No renderer found for {data.Name}");
                }
            }

            renderer = null;
            return(false);
        }
Beispiel #11
0
        public static bool ModelByNetworkId(long networkId, out EntityModelRenderer renderer, out EntityData data)
        {
            if (_idToData.TryGetValue(networkId, out data))
            {
                renderer = TryGetRendererer(data, null);
                if (renderer != null)
                {
                    return(true);
                }
                else
                {
                    //	if (data.OriginalName.Equals("armor_stand"))
                    //Log.Warn($"No entity model renderer found for {data.Name} - {data.OriginalName}");
                }
            }

            renderer = null;
            return(false);
        }
Beispiel #12
0
        private void SetVertices()
        {
            var def = _entityDefinitions[_index];

            EntityModelRenderer renderer = null;

            //if (def.Value != null)
            //{
            //	renderer = EntityFactory.GetEntityRenderer(def.Key, null);
            //}

            if (def.Value != null && def.Value.Geometry != null && def.Value.Geometry.ContainsKey("default") &&
                def.Value.Textures != null)
            {
                EntityModel model;
                if (ModelFactory.TryGetModel(def.Value.Geometry["default"],
                                             out model) && model != null)
                {
                    var    textures = def.Value.Textures;
                    string texture;
                    if (!textures.TryGetValue("default", out texture))
                    {
                        texture = textures.FirstOrDefault().Value;
                    }

                    if (Alex.Resources.BedrockResourcePack.Textures.TryGetValue(texture,
                                                                                out var bmp))
                    {
                        PooledTexture2D t = TextureUtils.BitmapToTexture2D(Alex.GraphicsDevice, bmp.Value);

                        renderer       = new EntityModelRenderer(model, t);
                        renderer.Scale = 1f / 16f;
                    }
                }
            }

            _currentRenderer = renderer;
        }
Beispiel #13
0
 internal void UpdateSkin(Texture2D skinTexture, bool skinSlim)
 {
     if (skinSlim)
     {
         if (ModelFactory.TryGetModel("geometry.humanoid.customSlim",
                                      out EntityModel m))
         {
             _model        = m;
             ModelRenderer = new EntityModelRenderer(_model, skinTexture);
             UpdateModelParts();
         }
     }
     else
     {
         if (ModelFactory.TryGetModel("geometry.humanoid.custom",
                                      out EntityModel m))
         {
             _model        = m;
             ModelRenderer = new EntityModelRenderer(_model, skinTexture);
             UpdateModelParts();
         }
     }
 }
Beispiel #14
0
        public void SpawnMob(long entityId, Guid uuid, EntityType type, PlayerLocation position, Microsoft.Xna.Framework.Vector3 velocity)
        {
            Entity entity = null;

            if (EntityFactory.ModelByType(type, out var renderer, out EntityData knownData))
            {
                //if (Enum.TryParse(knownData.Name, out type))
                //{
                //	entity = type.Create(null);
                //}
                entity = type.Create(null);

                if (entity == null)
                {
                    entity = new Entity((int)type, null, BaseClient);
                }

                //if (knownData.Height)
                {
                    entity.Height = knownData.Height;
                }

                //if (knownData.Width.HasValue)
                entity.Width = knownData.Width;

                if (string.IsNullOrWhiteSpace(entity.NameTag) && !string.IsNullOrWhiteSpace(knownData.Name))
                {
                    entity.NameTag = knownData.Name;
                }
            }

            if (entity == null)
            {
                Log.Warn($"Could not create entity of type: {(int) type}:{type.ToString()}");
                return;
            }

            if (renderer == null)
            {
                var def = AlexInstance.Resources.BedrockResourcePack.EntityDefinitions.FirstOrDefault(x =>
                                                                                                      x.Value.Filename.Replace("_", "").Equals(type.ToString().ToLowerInvariant()));
                if (!string.IsNullOrWhiteSpace(def.Key))
                {
                    EntityModel model;
                    if (ModelFactory.TryGetModel(def.Value.Geometry["default"],
                                                 out model) && model != null)
                    {
                        var    textures = def.Value.Textures;
                        string texture;
                        if (!textures.TryGetValue("default", out texture))
                        {
                            texture = textures.FirstOrDefault().Value;
                        }

                        if (AlexInstance.Resources.BedrockResourcePack.Textures.TryGetValue(texture,
                                                                                            out Bitmap bmp))
                        {
                            Texture2D t = TextureUtils.BitmapToTexture2D(AlexInstance.GraphicsDevice, bmp);

                            renderer = new EntityModelRenderer(model, t);
                        }
                    }
                }
            }

            if (renderer == null)
            {
                Log.Debug($"Missing renderer for entity: {type.ToString()} ({(int) type})");
                return;
            }

            if (renderer.Texture == null)
            {
                Log.Debug($"Missing texture for entity: {type.ToString()} ({(int) type})");
                return;
            }

            entity.ModelRenderer = renderer;

            entity.KnownPosition = position;
            entity.Velocity      = velocity;
            entity.EntityId      = entityId;
            entity.UUID          = new UUID(uuid.ToByteArray());


            BaseClient.WorldProvider.SpawnEntity(entityId, entity);
        }
Beispiel #15
0
 /// <inheritdoc />
 public EnderChestBlockEntity(Block block, World level) : base(block, level)
 {
     ModelRenderer = new EntityModelRenderer(new ChestEntityModel(), BlockEntityFactory.EnderChestTexture);
 }
Beispiel #16
0
        public World(IServiceProvider serviceProvider, GraphicsDevice graphics, AlexOptions options,
                     NetworkProvider networkProvider)
        {
            Graphics = graphics;
            Options  = options;

            PhysicsEngine = new PhysicsManager(this);
            ChunkManager  = new ChunkManager(serviceProvider, graphics, this);
            EntityManager = new EntityManager(graphics, this, networkProvider);
            Ticker        = new TickManager();
            PlayerList    = new PlayerList();

            ChunkManager.Start();
            //	var alex = serviceProvider.GetRequiredService<Alex>();
            var settings       = serviceProvider.GetRequiredService <IOptionsProvider>();
            var profileService = serviceProvider.GetRequiredService <IPlayerProfileService>();
            var resources      = serviceProvider.GetRequiredService <ResourceManager>();

            EventDispatcher = serviceProvider.GetRequiredService <IEventDispatcher>();

            string          username = string.Empty;
            PooledTexture2D texture;

            if (Alex.PlayerTexture != null)
            {
                texture = TextureUtils.BitmapToTexture2D(graphics, Alex.PlayerTexture);
            }
            else
            {
                resources.ResourcePack.TryGetBitmap("entity/alex", out var rawTexture);
                texture = TextureUtils.BitmapToTexture2D(graphics, rawTexture);
            }

            Skin skin = profileService?.CurrentProfile?.Skin;

            if (skin == null)
            {
                skin = new Skin()
                {
                    Texture = texture,
                    Slim    = true
                };
            }

            if (!string.IsNullOrWhiteSpace(profileService?.CurrentProfile?.Username))
            {
                username = profileService.CurrentProfile.Username;
            }

            Player = new Player(graphics, serviceProvider.GetRequiredService <Alex>().InputManager, username, this, skin, networkProvider, PlayerIndex.One);
            Camera = new EntityCamera(Player);

            if (Alex.PlayerModel != null)
            {
                EntityModelRenderer modelRenderer = new EntityModelRenderer(Alex.PlayerModel, texture);

                if (modelRenderer.Valid)
                {
                    Player.ModelRenderer = modelRenderer;
                }
            }

            Player.KnownPosition = new PlayerLocation(GetSpawnPoint());
            Camera.MoveTo(Player.KnownPosition, Vector3.Zero);

            Options.FieldOfVision.ValueChanged += FieldOfVisionOnValueChanged;
            Camera.FOV = Options.FieldOfVision.Value;

            PhysicsEngine.AddTickable(Player);

            /*if (networkProvider is BedrockClient)
             * {
             *      Player.SetInventory(new BedrockInventory(46));
             * }
             * else
             * {
             *      Player.SetInventory(new Utils.Inventory(46));
             * }*/
            //	Player.Inventory.IsPeInventory = true;

            /*if (ItemFactory.TryGetItem("minecraft:diamond_sword", out var sword))
             * {
             *      Player.Inventory[Player.Inventory.SelectedSlot] = sword;
             *      Player.Inventory.MainHand = sword;
             * }
             * else
             * {
             *      Log.Warn($"Could not get diamond sword!");
             * }*/

            EventDispatcher.RegisterEvents(this);

            var guiManager = serviceProvider.GetRequiredService <GuiManager>();

            InventoryManager = new InventoryManager(guiManager);

            SkyRenderer = new SkyBox(serviceProvider, graphics, this);
            //SkyLightCalculations = new SkyLightCalculations();

            UseDepthMap = options.VideoOptions.Depthmap;
            options.VideoOptions.Depthmap.Bind((old, newValue) => { UseDepthMap = newValue; });

            options.VideoOptions.RenderDistance.Bind(
                (old, newValue) =>
            {
                Camera.SetRenderDistance(newValue);
            });
            Camera.SetRenderDistance(options.VideoOptions.RenderDistance);
            //ServerType = (networkProvider is BedrockClient) ? ServerType.Bedrock : ServerType.Java;
        }
Beispiel #17
0
        public void LoadSkin(Skin skin)
        {
            //PooledTexture2D skinTexture = null;
            Image <Rgba32> skinBitmap = null;

            if (!skin.TryGetBitmap(out skinBitmap))
            {
                Log.Warn($"No custom skin data for player {Name}");

                if (Alex.Instance.Resources.ResourcePack.TryGetBitmap("entity/alex", out var rawTexture))
                {
                    skinBitmap = rawTexture;
                    //skinTexture = TextureUtils.BitmapToTexture2D(AlexInstance.GraphicsDevice, rawTexture);
                }
            }

            EntityModel model = null;

            if (!skin.IsPersonaSkin)
            {
                if (!string.IsNullOrWhiteSpace(skin.GeometryData) && skin.GeometryData != "null")
                {
                    try
                    {
                        if (string.IsNullOrWhiteSpace(skin.ResourcePatch) || skin.ResourcePatch == "null")
                        {
                            Log.Warn($"Resourcepatch null for player {Name}");
                        }
                        else
                        {
                            var resourcePatch = JsonConvert.DeserializeObject <SkinResourcePatch>(
                                skin.ResourcePatch, GeometrySerializationSettings);

                            GeometryModel geometryModel = null;
                            //	Dictionary<string, EntityModel> models = new Dictionary<string, EntityModel>();

                            if (!GeometryModel.TryParse(skin.GeometryData, resourcePatch, out geometryModel))
                            {
                                Log.Warn($"Failed to parse geometry for player {Name}");
                            }

                            /*try
                             * {
                             *      geometryModel = MCJsonConvert.DeserializeObject<GeometryModel>(skin.GeometryData);
                             * }
                             * catch (Exception ex)
                             * {
                             *      Log.Warn($"Failed to parse geometry for player {Name}: {ex.ToString()}");
                             * }*/

                            if (geometryModel == null || geometryModel.Geometry.Count == 0)
                            {
                                Log.Warn($"!! Model count was 0 for player {Name} !!");
                                //EntityModel.GetEntries(r.Skin.GeometryData, models);
                            }
                            else
                            {
                                if (resourcePatch?.Geometry != null)
                                {
                                    model = geometryModel.FindGeometry(resourcePatch.Geometry.Default);

                                    if (model == null)
                                    {
                                        Log.Warn(
                                            $"Invalid geometry: {resourcePatch.Geometry.Default} for player {Name}");
                                    }
                                    else
                                    {
                                        var modelTextureSize = model.Description != null ?
                                                               new Point((int)model.Description.TextureWidth, (int)model.Description.TextureHeight) :
                                                               new Point((int)model.Texturewidth, (int)model.Textureheight);

                                        var textureSize = new Point(skinBitmap.Width, skinBitmap.Height);

                                        if (modelTextureSize != textureSize)
                                        {
                                            int newHeight = modelTextureSize.Y > textureSize.Y ? textureSize.Y : modelTextureSize.Y;
                                            int newWidth  = modelTextureSize.X > textureSize.X ? textureSize.X: modelTextureSize.X;

                                            var bitmap = skinBitmap;
                                            //	bitmap.Mutate<Rgba32>(xx => xx.Resize(newWidth, newHeight));

                                            Image <Rgba32> skinTexture = new Image <Rgba32>(modelTextureSize.X, modelTextureSize.Y);

                                            skinTexture.Mutate <Rgba32>(
                                                c =>
                                            {
                                                c.DrawImage(bitmap, new SixLabors.ImageSharp.Point(0, 0), 1f);
                                            });

                                            skinBitmap = skinTexture;
                                        }
                                    }
                                }
                                else
                                {
                                    Log.Warn($"Resourcepatch geometry was null for player {Name}");
                                }
                            }

                            /*foreach (var mm in models.ToArray())
                             * {
                             *      if (ProcessEntityModel(models, mm.Value, false))
                             *      {
                             *              models.Remove(mm.Key);
                             *      }
                             * }
                             *
                             * foreach (var mm in models.ToArray())
                             * {
                             *      if (ProcessEntityModel(models, mm.Value, true))
                             *      {
                             *              models.Remove(mm.Key);
                             *      }
                             * }*/
                        }
                    }
                    catch (Exception ex)
                    {
                        string name = "N/A";

                        /*if (r.Skin.SkinResourcePatch != null)
                         * {
                         *      name = r.Skin.SkinResourcePatch.Geometry.Default;
                         * }*/
                        Log.Warn(ex, $"Could not create geometry ({name}): {ex.ToString()} for player {Name}");

                        //	File.WriteAllBytes(Path.Combine("/home/kenny/.config/Alex/skinDebug/failed", $"failed-{Environment.TickCount}.json"), Encoding.UTF8.GetBytes(skin.GeometryData));
                    }
                }
                else
                {
                    Log.Warn($"Geometry data null for player {Name}");
                }
            }

            if (model == null)
            {
                model = skin.Slim ? (EntityModel) new Models.HumanoidCustomslimModel() : (EntityModel) new Models.HumanoidCustomGeometryHumanoidModel();
            }

            if (model != null && ValidateModel(model, Name))
            {
                var modelRenderer = new EntityModelRenderer(model, TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, skinBitmap));

                if (modelRenderer.Valid)
                {
                    ModelRenderer = modelRenderer;
                }
                else
                {
                    modelRenderer.Dispose();
                    Log.Warn($"Invalid model: for player {Name} (Disposing)");
                }
            }
            else
            {
                Log.Warn($"Invalid model for player {Name}");
            }
        }
Beispiel #18
0
        public World(IServiceProvider serviceProvider, GraphicsDevice graphics, AlexOptions options,
                     NetworkProvider networkProvider)
        {
            Graphics = graphics;
            Options  = options;

            PhysicsEngine = new PhysicsManager(this);
            ChunkManager  = new ChunkManager(serviceProvider, graphics, this);
            EntityManager = new EntityManager(graphics, this, networkProvider);
            Ticker        = new TickManager();
            PlayerList    = new PlayerList();

            Ticker.RegisterTicked(this);
            Ticker.RegisterTicked(EntityManager);
            //Ticker.RegisterTicked(PhysicsEngine);
            Ticker.RegisterTicked(ChunkManager);

            ChunkManager.Start();
            var profileService = serviceProvider.GetRequiredService <IPlayerProfileService>();
            var resources      = serviceProvider.GetRequiredService <ResourceManager>();

            EventDispatcher = serviceProvider.GetRequiredService <IEventDispatcher>();

            string          username = string.Empty;
            PooledTexture2D texture;

            if (Alex.PlayerTexture != null)
            {
                texture = TextureUtils.BitmapToTexture2D(graphics, Alex.PlayerTexture);
            }
            else
            {
                resources.ResourcePack.TryGetBitmap("entity/alex", out var rawTexture);
                texture = TextureUtils.BitmapToTexture2D(graphics, rawTexture);
            }

            Skin skin = profileService?.CurrentProfile?.Skin;

            if (skin == null)
            {
                skin = new Skin()
                {
                    Texture = texture,
                    Slim    = true
                };
            }

            if (!string.IsNullOrWhiteSpace(profileService?.CurrentProfile?.Username))
            {
                username = profileService.CurrentProfile.Username;
            }

            Player = new Player(graphics, serviceProvider.GetRequiredService <Alex>().InputManager, username, this, skin, networkProvider, PlayerIndex.One);
            Camera = new EntityCamera(Player);

            if (Alex.PlayerModel != null)
            {
                EntityModelRenderer modelRenderer = new EntityModelRenderer(Alex.PlayerModel, texture);

                if (modelRenderer.Valid)
                {
                    Player.ModelRenderer = modelRenderer;
                }
            }

            Player.KnownPosition = new PlayerLocation(GetSpawnPoint());

            Options.FieldOfVision.ValueChanged += FieldOfVisionOnValueChanged;
            Camera.FOV = Options.FieldOfVision.Value;

            PhysicsEngine.AddTickable(Player);

            EventDispatcher.RegisterEvents(this);

            var guiManager = serviceProvider.GetRequiredService <GuiManager>();

            InventoryManager = new InventoryManager(guiManager);

            SkyRenderer = new SkyBox(serviceProvider, graphics, this);

            options.VideoOptions.RenderDistance.Bind(
                (old, newValue) =>
            {
                Camera.SetRenderDistance(newValue);
            });
            Camera.SetRenderDistance(options.VideoOptions.RenderDistance);
        }
Beispiel #19
0
        private void LoadSkin(Skin skin)
        {
            try
            {
                if (skin == null)
                {
                    return;
                }

                EntityModel model = null;

                if (!skin.IsPersonaSkin)
                {
                    if (!string.IsNullOrWhiteSpace(skin.GeometryData) && !skin.GeometryData.Equals(
                            "null", StringComparison.InvariantCultureIgnoreCase))
                    {
                        try
                        {
                            if (string.IsNullOrWhiteSpace(skin.ResourcePatch) || skin.ResourcePatch == "null")
                            {
                                Log.Debug($"Resourcepatch null for player {Name}");
                            }
                            else
                            {
                                var resourcePatch = JsonConvert.DeserializeObject <SkinResourcePatch>(
                                    skin.ResourcePatch, GeometrySerializationSettings);

                                Dictionary <string, EntityModel> models = new Dictionary <string, EntityModel>();
                                BedrockResourcePack.LoadEntityModel(skin.GeometryData, models);

                                var processedModels = BedrockResourcePack.ProcessEntityModels(models);

                                if (processedModels == null || processedModels.Count == 0)
                                {
                                    Log.Warn($"!! Model count was 0 for player {NameTag} !!");

                                    if (!Directory.Exists("failed"))
                                    {
                                        Directory.CreateDirectory("failed");
                                    }

                                    File.WriteAllText(
                                        Path.Combine(
                                            "failed",
                                            $"{Environment.TickCount64}-{resourcePatch.Geometry.Default}.json"),
                                        skin.GeometryData);
                                }
                                else
                                {
                                    if (resourcePatch?.Geometry != null)
                                    {
                                        if (!processedModels.TryGetValue(resourcePatch.Geometry.Default, out model))
                                        {
                                            Log.Debug(
                                                $"Invalid geometry: {resourcePatch.Geometry.Default} for player {Name}");
                                        }
                                        else
                                        {
                                        }
                                    }
                                    else
                                    {
                                        Log.Debug($"Resourcepatch geometry was null for player {Name}");
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            string name = "N/A";
                            Log.Debug(ex, $"Could not create geometry ({name}): {ex.ToString()} for player {Name}");
                        }
                    }
                    else
                    {
                        //Log.Debug($"Geometry data null for player {Name}");
                    }
                }

                if (model == null)
                {
                    ModelFactory.TryGetModel(
                        skin.Slim ? "geometry.humanoid.custom" : "geometry.humanoid.customSlim", out model);

                    /*model = skin.Slim ? (EntityModel) new Models.HumanoidCustomslimModel() :
                     *      (EntityModel) new HumanoidModel();*/// new Models.HumanoidCustomGeometryHumanoidModel();
                }

                if (model != null && ValidateModel(model, Name))
                {
                    Image <Rgba32> skinBitmap = null;

                    if (!skin.TryGetBitmap(model, out skinBitmap))
                    {
                        Log.Warn($"No custom skin data for player {Name}");

                        if (Alex.Instance.Resources.TryGetBitmap("entity/alex", out var rawTexture))
                        {
                            skinBitmap = rawTexture;
                        }
                    }

                    //if (!Directory.Exists("skins"))
                    //	Directory.CreateDirectory("skins");

                    //var path = Path.Combine("skins", $"{model.Description.Identifier}-{Environment.TickCount64}");
                    //File.WriteAllText($"{path}.json", skin.GeometryData);
                    //skinBitmap.SaveAsPng($"{path}.png");

                    var modelTextureSize = new Point(
                        (int)model.Description.TextureWidth, (int)model.Description.TextureHeight);

                    var textureSize = new Point(skinBitmap.Width, skinBitmap.Height);

                    if (modelTextureSize != textureSize)
                    {
                        if (modelTextureSize.Y > textureSize.Y)
                        {
                            skinBitmap = SkinUtils.ConvertSkin(skinBitmap, modelTextureSize.X, modelTextureSize.Y);
                        }

                        /*var bitmap = skinBitmap;
                         * bitmap.Mutate<Rgba32>(xx =>
                         * {
                         *      xx.Resize(modelTextureSize.X, modelTextureSize.Y);
                         * //	xx.Flip(FlipMode.Horizontal);
                         * });
                         *
                         * skinBitmap = bitmap;*/
                    }

                    GeometryName = model.Description.Identifier;

                    var modelRenderer = new EntityModelRenderer(
                        model, TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, skinBitmap));

                    if (modelRenderer.Valid)
                    {
                        ModelRenderer = modelRenderer;
                    }
                    else
                    {
                        modelRenderer.Dispose();
                        Log.Debug($"Invalid model: for player {Name} (Disposing)");
                    }
                }
                else
                {
                    Log.Debug($"Invalid model for player {Name}");
                }
            }
            catch (Exception ex)
            {
                Log.Warn(ex, $"Error while handling player skin.");
            }
        }
Beispiel #20
0
        internal void UpdateSkin(PooledTexture2D skinTexture)
        {
            if (skinTexture != null && ModelRenderer != null)
            {
                ModelRenderer.Texture = skinTexture;

                return;
            }

            string geometry = "geometry.humanoid.customSlim";

            if (skinTexture == null)
            {
                string skinVariant = "entity/alex";
                skinTexture = _alex;

                var uuid = UUID.GetBytes();

                bool isSteve = (uuid[3] ^ uuid[7] ^ uuid[11] ^ uuid[15]) % 2 == 0;

                if (isSteve)
                {
                    skinVariant = "entity/steve";
                    geometry    = "geometry.humanoid.custom";

                    skinTexture = _steve;
                }

                if (skinTexture == null)
                {
                    if (Alex.Instance.Resources.TryGetBitmap(skinVariant, out var rawTexture))
                    {
                        skinTexture = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, rawTexture);

                        if (isSteve)
                        {
                            _steve = skinTexture;
                        }
                        else
                        {
                            _alex = skinTexture;
                        }

                        //skinBitmap = rawTexture;
                    }
                }

                if (skinTexture == null)
                {
                    skinTexture = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, Alex.PlayerTexture);
                }
            }


            if (ModelFactory.TryGetModel(geometry, out var m))
            {
                _model        = m;
                ValidModel    = true;
                ModelRenderer = new EntityModelRenderer(_model, skinTexture);

                _texture = skinTexture;
                //UpdateModelParts();
            }
        }
Beispiel #21
0
        /// <inheritdoc />
        protected override void BlockChanged(Block oldBlock, Block newBlock)
        {
            if (newBlock is Skull s)
            {
                switch (s.SkullType)
                {
                case SkullType.Player:
                    break;

                case SkullType.Skeleton:
                    if (_skeleton == null)
                    {
                        if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(
                                "minecraft:entity/skeleton/skeleton", out var bmp))
                        {
                            _skeleton = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, bmp);
                        }
                    }

                    if (_skeleton != null)
                    {
                        ModelRenderer = new EntityModelRenderer(new SkullBlockEntityModel(), _skeleton);
                        //ModelRenderer.Texture = _skeleton;
                    }
                    break;

                case SkullType.WitherSkeleton:
                    if (_witherSkeleton == null)
                    {
                        if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(
                                "minecraft:entity/skeleton/wither_skeleton", out var bmp))
                        {
                            _witherSkeleton = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, bmp);
                        }
                    }

                    if (_witherSkeleton != null)
                    {
                        ModelRenderer = new EntityModelRenderer(new SkullBlockEntityModel(), _witherSkeleton);
                    }
                    break;

                case SkullType.Zombie:
                    if (_zombie == null)
                    {
                        if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(
                                "minecraft:entity/zombie/zombie", out var bmp))
                        {
                            _zombie = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, bmp);
                        }
                    }

                    if (_zombie != null)
                    {
                        ModelRenderer = new EntityModelRenderer(new SkullBlockEntityModel(), _zombie);
                    }
                    break;

                case SkullType.Creeper:
                    if (_creeper == null)
                    {
                        if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(
                                "minecraft:entity/creeper/creeper", out var bmp))
                        {
                            _creeper = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, bmp);
                        }
                    }

                    if (_creeper != null)
                    {
                        ModelRenderer = new EntityModelRenderer(new SkullBlockEntityModel(), _creeper);
                    }
                    break;

                case SkullType.Dragon:
                    if (_dragon == null)
                    {
                        if (Alex.Instance.Resources.ResourcePack.TryGetBitmap(
                                "minecraft:entity/enderdragon/dragon", out var bmp))
                        {
                            _dragon = TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, bmp);
                        }
                    }

                    if (_dragon != null)
                    {
                        if (ModelFactory.TryGetModel("geometry.dragon_head", out var dragonHead))
                        {
                            ModelRenderer = new EntityModelRenderer(dragonHead, _dragon);
                        }

                        //ModelRenderer.Texture = _dragon;
                    }
                    break;
                }
            }

            if (newBlock is WallSkull)
            {
                if (newBlock.BlockState.TryGetValue("facing", out var facing))
                {
                    if (Enum.TryParse <BlockFace>(facing, true, out var face))
                    {
                        Offset = (face.Opposite().GetVector3() * 0.5f);
                    }
                }
            }
            else if (newBlock is Skull)
            {
                if (newBlock.BlockState.TryGetValue("rotation", out var r))
                {
                    if (byte.TryParse(r, out var rot))
                    {
                        Rotation = rot;
                    }
                }
            }
        }
Beispiel #22
0
        public void LoadSkin(Skin skin)
        {
            Image <Rgba32> skinBitmap = null;

            if (!skin.TryGetBitmap(out skinBitmap))
            {
                Log.Warn($"No custom skin data for player {Name}");

                if (Alex.Instance.Resources.ResourcePack.TryGetBitmap("entity/alex", out var rawTexture))
                {
                    skinBitmap = rawTexture;
                }
            }

            EntityModel model = null;

            if (!skin.IsPersonaSkin)
            {
                if (!string.IsNullOrWhiteSpace(skin.GeometryData) && skin.GeometryData != "null")
                {
                    try
                    {
                        if (string.IsNullOrWhiteSpace(skin.ResourcePatch) || skin.ResourcePatch == "null")
                        {
                            Log.Debug($"Resourcepatch null for player {Name}");
                        }
                        else
                        {
                            var resourcePatch = JsonConvert.DeserializeObject <SkinResourcePatch>(
                                skin.ResourcePatch, GeometrySerializationSettings);

                            GeometryModel geometryModel = null;
                            if (!GeometryModel.TryParse(skin.GeometryData, resourcePatch, out geometryModel))
                            {
                                Log.Debug($"Failed to parse geometry for player {Name}");
                            }

                            if (geometryModel == null || geometryModel.Geometry.Count == 0)
                            {
                                //Log.Warn($"!! Model count was 0 for player {Name} !!");
                            }
                            else
                            {
                                if (resourcePatch?.Geometry != null)
                                {
                                    model = geometryModel.FindGeometry(resourcePatch.Geometry.Default);

                                    if (model == null)
                                    {
                                        Log.Debug(
                                            $"Invalid geometry: {resourcePatch.Geometry.Default} for player {Name}");
                                    }
                                    else
                                    {
                                        var modelTextureSize = new Point((int)model.Description.TextureWidth, (int)model.Description.TextureHeight);

                                        var textureSize = new Point(skinBitmap.Width, skinBitmap.Height);

                                        if (modelTextureSize != textureSize)
                                        {
                                            int newHeight = modelTextureSize.Y > textureSize.Y ? textureSize.Y : modelTextureSize.Y;
                                            int newWidth  = modelTextureSize.X > textureSize.X ? textureSize.X: modelTextureSize.X;

                                            var bitmap = skinBitmap;
                                            bitmap.Mutate <Rgba32>(xx =>
                                            {
                                                xx.Resize(modelTextureSize.X, modelTextureSize.Y);
                                                xx.Flip(FlipMode.Horizontal);
                                            });

                                            skinBitmap = bitmap;
                                        }
                                    }
                                }
                                else
                                {
                                    Log.Debug($"Resourcepatch geometry was null for player {Name}");
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        string name = "N/A";
                        Log.Debug(ex, $"Could not create geometry ({name}): {ex.ToString()} for player {Name}");
                    }
                }
                else
                {
                    Log.Debug($"Geometry data null for player {Name}");
                }
            }

            if (model == null)
            {
                model = skin.Slim ? (EntityModel) new Models.HumanoidCustomslimModel() :
                        (EntityModel) new HumanoidModel();                // new Models.HumanoidCustomGeometryHumanoidModel();
            }

            if (model != null && ValidateModel(model, Name))
            {
                var modelRenderer = new EntityModelRenderer(model, TextureUtils.BitmapToTexture2D(Alex.Instance.GraphicsDevice, skinBitmap));

                if (modelRenderer.Valid)
                {
                    ModelRenderer = modelRenderer;
                }
                else
                {
                    modelRenderer.Dispose();
                    Log.Debug($"Invalid model: for player {Name} (Disposing)");
                }
            }
            else
            {
                Log.Debug($"Invalid model for player {Name}");
            }
        }