示例#1
0
        public override float Apply(PaintLayer layer, Color color, byte glow, PaintBrushSize brushSize, float pressurePercent,
                                    int randSeed, int worldX, int worldY)
        {
            var   mymod     = BetterPaintMod.Instance;
            int   iterRange = (int)((brushSize == PaintBrushSize.Small ? 1 : 3) * mymod.Config.BrushSizeMultiplier);
            float radius    = (brushSize == PaintBrushSize.Small ? 0.5f : 3f) * mymod.Config.BrushSizeMultiplier;

            int tileX = worldX / 16;
            int tileY = worldY / 16;

            float uses = 0;

            for (int i = -iterRange; i <= iterRange; i++)
            {
                for (int j = -iterRange; j <= iterRange; j++)
                {
                    float dist = (float)Math.Sqrt((double)((i * i) + (j * j)));

                    if (dist > radius)
                    {
                        continue;
                    }

                    uses += this.PaintAt(layer, color, glow, pressurePercent, (ushort)(tileX + i), (ushort)(tileY + j));
                }
            }

            return(uses);
        }
        internal float ApplyColorAtNoSync(BetterPaintMod mymod, PaintLayerType layer, PaintBrushType brushType,
                                          Color color, byte glow, PaintBrushSize brushSize, float pressurePrecent,
                                          int randSeed, int worldX, int worldY)
        {
            if (Main.netMode == 2)
            {
                throw new ModHelpersException("No server.");
            }

            PaintBrush brush      = mymod.Modes[brushType];
            float      paintsUsed = 0f;

            switch (layer)
            {
            case PaintLayerType.Background:
                paintsUsed += brush.Apply(this.Background, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);
                break;

            case PaintLayerType.Foreground:
                paintsUsed += brush.Apply(this.Foreground, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);
                break;

            case PaintLayerType.Anyground:
                paintsUsed += brush.Apply(this.Background, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);
                paintsUsed += brush.Apply(this.Foreground, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);
                break;

            default:
                throw new ModHelpersException("Not implemented.");
            }

            return(paintsUsed);
        }
示例#3
0
        public override float Apply(PaintLayer layer, Color _, byte __, PaintBrushSize brushSize, float pressurePercent,
                                    int randSeed, int worldX, int worldY)
        {
            var mymod = BetterPaintMod.Instance;

            int diameter = brushSize == PaintBrushSize.Small ? 1 : 6;

            diameter = (int)((float)diameter * mymod.Config.BrushSizeMultiplier);

            int   iterRange = Math.Max(1, diameter / 2);
            float radius    = (float)diameter / 2f;

            int tileX = worldX / 16;
            int tileY = worldY / 16;

            for (int i = -iterRange; i <= iterRange; i++)
            {
                for (int j = -iterRange; j <= iterRange; j++)
                {
                    float dist = (float)Math.Sqrt((double)((i * i) + (j * j)));

                    if (dist > radius)
                    {
                        continue;
                    }

                    this.EraseAt(layer, pressurePercent, (ushort)(tileX + i), (ushort)(tileY + j));
                }
            }

            return(0);
        }
 private PaintStrokeProtocol(PaintLayerType layer, PaintBrushType brushType, Color color, byte glow,
                             PaintBrushSize brushSize, float pressurePercent, int randSeed, int worldX, int worldY)
 {
     this.Layer           = (int)layer;
     this.BrushType       = (int)brushType;
     this.MyColor         = color;
     this.Glow            = glow;
     this.BrushSize       = (int)brushSize;
     this.PressurePercent = pressurePercent;
     this.WorldX          = worldX;
     this.WorldY          = worldY;
 }
        public static void SyncToAll(PaintLayerType layer, PaintBrushType brushType, Color color, byte glow,
                                     PaintBrushSize brushSize, float pressurePercent, int randSeed, int worldX, int worldY)
        {
            if (Main.netMode != 1)
            {
                throw new ModHelpersException("Not client");
            }

            var protocol = new PaintStrokeProtocol(layer, brushType, color, glow, brushSize, pressurePercent, randSeed, worldX, worldY);

            protocol.SendToServer(true);
        }
        ////////////////

        public float ApplyColorAt(BetterPaintMod mymod, PaintLayerType layer, PaintBrushType brushType,
                                  Color color, byte glow, PaintBrushSize brushSize, float pressurePrecent, int worldX, int worldY)
        {
            if (Main.netMode == 2)
            {
                throw new ModHelpersException("No server.");
            }

            int   randSeed   = DateTime.Now.Millisecond;
            float paintsUsed = this.ApplyColorAtNoSync(mymod, layer, brushType, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);

            if (Main.netMode == 1)
            {
                PaintStrokeProtocol.SyncToAll(layer, brushType, color, glow, brushSize, pressurePrecent, randSeed, worldX, worldY);
            }

            return(paintsUsed);
        }
示例#7
0
        public override float Apply(PaintLayer layer, Color color, byte glow, PaintBrushSize brushSize, float pressurePercent,
                                    int randSeed, int worldX, int worldY)
        {
            var mymod    = BetterPaintMod.Instance;
            int diameter = brushSize == PaintBrushSize.Small ? 3 : 8;

            diameter = (int)((float)diameter * mymod.Config.BrushSizeMultiplier);

            int   iterRange = diameter / 2;
            float maxRange  = (float)diameter / 2f;
            float uses      = 0;

            int    tileX       = worldX / 16;
            int    tileY       = worldY / 16;
            double tileOffsetX = (double)(worldX % 16) / 16f;
            double tileOffsetY = (double)(worldY % 16) / 16f;

            for (int i = -iterRange; i <= iterRange; i++)
            {
                for (int j = -iterRange; j <= iterRange; j++)
                {
                    double iOff = i + tileOffsetX;
                    double jOff = j + tileOffsetY;

                    float dist = (float)Math.Sqrt((iOff * iOff) + (jOff * jOff));

                    if (dist > maxRange)
                    {
                        continue;
                    }

                    ushort x = (ushort)(tileX + i);
                    ushort y = (ushort)(tileY + j);

                    uses += this.PaintAt(layer, color, glow, pressurePercent, maxRange, dist, x, y);
                }
            }

            return(uses);
        }
        public override float Apply(PaintLayer layer, Color color, byte glow, PaintBrushSize brushSize, float pressurePercent,
                                    int randSeed, int worldX, int worldY)
        {
            var mymod = BetterPaintMod.Instance;
            var rand  = new Random(randSeed);

            int tileX = worldX / 16;
            int tileY = worldY / 16;

            float uses = 0;

            int diameter = brushSize == PaintBrushSize.Small ? 3 : 6;

            diameter = (int)((float)diameter * mymod.Config.BrushSizeMultiplier);

            int spats = (int)((float)(diameter * diameter) * mymod.Config.BrushSpatterDensity);

            int minRadius           = Math.Max(1, diameter / 3);
            int extendedRadiusRange = diameter - minRadius;

            for (int i = 0; i < spats; i++)
            {
                int extendedRadius = rand.Next(extendedRadiusRange);
                int radius         = minRadius + extendedRadius;

                int xOff = rand.Next(-radius, radius);

                radius = minRadius + extendedRadius;
                int yOff = rand.Next(-radius, radius);

                float randPercent = pressurePercent * (1f - (float)rand.NextDouble());

                if (randPercent >= 0.01f)
                {
                    uses += this.PaintAt(layer, color, glow, randPercent, (ushort)(tileX + xOff), (ushort)(tileY + yOff));
                }
            }

            return(uses);
        }
        ////////////////

        public abstract float Apply(PaintLayer layer, Color color, byte glow, PaintBrushSize brushSize, float pressurePercent,
                                    int randSeed, int worldX, int worldY);