示例#1
0
        protected override void PlacedMark(Player p, ushort x, ushort y, ushort z, BlockID block)
        {
            p.RevertBlock(x, y, z);
            if (!p.level.Config.Guns)
            {
                p.ClearBlockchange(); return;
            }
            if (!CommandParser.IsBlockAllowed(p, "use", block))
            {
                return;
            }

            WeaponArgs args = new WeaponArgs();

            args.player     = p;
            args.block      = block;
            args.weaponType = (WeaponType)p.blockchangeObject;

            args.start      = MakePos(p);
            args.dir        = DirUtils.GetFlatDirVector(p.Rot.RotY, p.Rot.HeadX);
            args.pos        = args.PosAt(3);
            args.iterations = 4;

            SchedulerTask task = new SchedulerTask(GunCallback, args, TimeSpan.Zero, true);

            p.CriticalTasks.Add(task);
        }
示例#2
0
        static void GunCallback(SchedulerTask task)
        {
            WeaponArgs args = (WeaponArgs)task.State;

            if (args.moving)
            {
                args.moving = MoveGun(args);

                // Laser gun persists for a short while
                if (!args.moving && args.weaponType == WeaponType.Laser)
                {
                    task.Delay = TimeSpan.FromMilliseconds(400);
                }
                return;
            }

            args.TeleportSourcePlayer();
            if (args.weaponType == WeaponType.Laser)
            {
                foreach (Vec3U16 pos in args.previous)
                {
                    args.player.level.Blockchange(pos.X, pos.Y, pos.Z, Block.Air, true);
                }
                args.previous.Clear();
            }
            else if (args.previous.Count > 0)
            {
                Vec3U16 pos = args.previous[0];
                args.previous.RemoveAt(0);
                args.player.level.Blockchange(pos.X, pos.Y, pos.Z, Block.Air, true);
            }
            task.Repeating = args.previous.Count > 0;
        }
示例#3
0
        static Vec3U16 MissileTarget(WeaponArgs args)
        {
            Player p = args.player;

            args.start = MakePos(p);
            args.dir   = DirUtils.GetDirVector(p.Rot.RotY, p.Rot.HeadX);
            int i;

            for (i = 1; ; i++)
            {
                Vec3U16 target = args.PosAt(i);
                BlockID block  = p.level.GetBlock(target.X, target.Y, target.Z);
                if (block == Block.Invalid)
                {
                    break;
                }

                if (block != Block.Air && !args.allBlocks.Contains(target) && HandlesHitBlock(p, block, args.weaponType, target, false))
                {
                    break;
                }

                Player hit = GetPlayer(p, target, true);
                if (hit != null)
                {
                    return(MakePos(hit));
                }
            }
            return(args.PosAt(i - 1));
        }
示例#4
0
        static bool MoveMissile(WeaponArgs args, Vec3U16 pos, Vec3U16 target)
        {
            Player  p     = args.player;
            BlockID block = p.level.GetBlock(pos.X, pos.Y, pos.Z);

            if (block != Block.Air && !args.allBlocks.Contains(pos) && HandlesHitBlock(p, block, args.weaponType, pos, true))
            {
                return(false);
            }

            p.level.Blockchange(pos.X, pos.Y, pos.Z, args.block);
            args.previous.Add(pos);
            args.allBlocks.Add(pos);
            if (HitsPlayer(args, pos))
            {
                return(false);
            }

            if (pos == target && p.level.physics >= 3 && args.weaponType >= WeaponType.Explode)
            {
                p.level.MakeExplosion(target.X, target.Y, target.Z, 2);
                return(false);
            }

            if (args.previous.Count > 12)
            {
                pos = args.previous[0];
                p.level.Blockchange(pos.X, pos.Y, pos.Z, Block.Air, true);
                args.previous.RemoveAt(0);
            }
            return(true);
        }
示例#5
0
        protected override void PlacedMark(Player p, ushort x, ushort y, ushort z, BlockID block)
        {
            if (!p.staticCommands)
            {
                p.ClearBlockchange();
                p.aiming = false;
            }
            p.RevertBlock(x, y, z);
            if (!p.level.Config.Guns || !CommandParser.IsBlockAllowed(p, "place", block))
            {
                p.ClearBlockchange(); return;
            }

            WeaponArgs args = new WeaponArgs();

            args.player     = p;
            args.block      = block;
            args.weaponType = (WeaponType)p.blockchangeObject;
            args.pos        = MakePos(p);

            SchedulerTask task = new SchedulerTask(MissileCallback, args,
                                                   TimeSpan.FromMilliseconds(100), true);

            p.CriticalTasks.Add(task);
        }
示例#6
0
        static void PerformMove(WeaponArgs args)
        {
            while (true)
            {
                args.iterations++;
                Vec3U16 target = MissileTarget(args);
                FindNext(target, ref args.pos, args.buffer);

                if (args.iterations <= 3)
                {
                    continue;
                }
                args.moving = MoveMissile(args, args.pos, target);
                return;
            }
        }
示例#7
0
        static void MissileCallback(SchedulerTask task)
        {
            WeaponArgs args = (WeaponArgs)task.State;

            if (args.moving)
            {
                PerformMove(args); return;
            }

            args.TeleportSourcePlayer();
            if (args.previous.Count > 0)
            {
                Vec3U16 pos = args.previous[0];
                args.previous.RemoveAt(0);
                args.player.level.Blockchange(pos.X, pos.Y, pos.Z, Block.Air, true);
            }
            task.Repeating = args.previous.Count > 0;
        }
示例#8
0
        protected override void OnActivated(Player p, byte yaw, byte pitch, BlockID block)
        {
            if (!p.staticCommands)
            {
                p.ClearBlockchange();
                p.aiming = false;
            }

            WeaponArgs args = new WeaponArgs();

            args.player     = p;
            args.block      = block;
            args.weaponType = (WeaponType)p.blockchangeObject;
            args.pos        = MakePos(p);

            SchedulerTask task = new SchedulerTask(MissileCallback, args,
                                                   TimeSpan.FromMilliseconds(100), true);

            p.CriticalTasks.Add(task);
        }
示例#9
0
        static bool HitsPlayer(WeaponArgs args, Vec3U16 pos)
        {
            Player pl = GetPlayer(args.player, pos, true);

            if (pl == null)
            {
                return(false);
            }

            Player p = args.player;

            if (p.level.physics >= 3 && args.weaponType >= WeaponType.Explode)
            {
                pl.HandleDeath(Block.Cobblestone, "@p %Swas blown up by " + p.ColoredName, true);
            }
            else
            {
                pl.HandleDeath(Block.Cobblestone, "@p %Swas shot by " + p.ColoredName);
            }
            return(true);
        }
示例#10
0
        static bool MoveGun(WeaponArgs args)
        {
            while (true)
            {
                args.pos = args.PosAt(args.iterations);
                args.iterations++;
                Vec3U16 pos = args.pos;

                BlockID cur = args.player.level.GetBlock(pos.X, pos.Y, pos.Z);
                if (cur == Block.Invalid)
                {
                    return(false);
                }
                if (cur != Block.Air && !args.allBlocks.Contains(pos) && HandlesHitBlock(args.player, cur, args.weaponType, pos, true))
                {
                    return(false);
                }

                args.player.level.Blockchange(pos.X, pos.Y, pos.Z, args.block);
                args.previous.Add(pos);
                args.allBlocks.Add(pos);
                if (HitsPlayer(args, pos))
                {
                    return(false);
                }

                if (args.iterations > 12 && args.weaponType != WeaponType.Laser)
                {
                    pos = args.previous[0];
                    args.previous.RemoveAt(0);
                    args.player.level.Blockchange(pos.X, pos.Y, pos.Z, Block.Air, true);
                }

                if (args.weaponType != WeaponType.Laser)
                {
                    return(true);
                }
            }
        }
示例#11
0
    private void Shoot(IWeaponArgsHolder holder)
    {
        if (!gameObject.activeInHierarchy)
        {
            return;
        }

        if (bulletSupply == null)
        {
            bulletSupply = holder.GetAmmoSupply();
        }

        UpdateAmmo();
        WaitCD();

        if (ammoItems.Count <= 0)
        {
            return;
        }

        WeaponArgs weaponArgs = holder.GetWeaponArgs();

        ammoItems.Peek().Item.Amount--;

        for (int i = 0; i < numOfProjectiles; i++)
        {
            float x = Random.Range(-inAccuracy, inAccuracy) / 150;
            float y = Random.Range(-inAccuracy, inAccuracy) / 150;

            Vector2 offset       = new Vector2(x, y);
            Vector2 newDirection = (Vector2)weaponArgs.ray.direction + offset;

            WeaponArgs shootArgs         = new WeaponArgs(new Ray(weaponArgs.ray.origin, newDirection), mask, weaponArgs.objectsToIgnore);
            LineEffect createdLineEffect = lineEffectPool.Instantiate(transform.position, Quaternion.identity);
            createdLineEffect.Setup(firePoint.position, shootArgs.hit.point, lineColor, lineWidth, lineLifeTime);

            shootArgs.HitDamageable?.Damage(damage);
        }
    }
 public Weapon(WeaponArgs Wargs, ItemArgs Iargs) : base(Iargs)
 {
     this.meleeDamage = Wargs.meleeDamage;
     this.durability  = Wargs.durability;
     typeOfWearable   = TypeOfWearable.weapon;
 }
示例#13
0
    void InputExpression()
    {
        weaponArgs = new WeaponArgs[weaponNumber];
        for (int i = 0; i < weaponNumber; i++)
        {
            weaponArgs[i]             = new WeaponArgs();
            weaponArgs[i].texture     = weaponTexture[i];
            weaponArgs[i].weaponWave  = weaponWave[i];
            weaponArgs[i].weaponSound = weaponSound[i];
        }

        weaponArgs[0].name       = "斧头";
        weaponArgs[0].expression =
            "01010" +
            "01110" +
            "01110" +
            "01010" +
            "01000" +
            "01000";
        weaponArgs [0].SetArgs(200f, 3f, 45f, 12f, 2.5f, 3.5f, 0.8f);

        weaponArgs[1].name       = "尖刺斧头";
        weaponArgs[1].expression =
            "01010" +
            "01110" +
            "11111" +
            "01110" +
            "01010" +
            "01000";
        weaponArgs [1].SetArgs(300f, 4f, 80f, 25f, 2.5f, 3.3f, 0.8f);

        weaponArgs[2].name       = "棒子";
        weaponArgs[2].expression =
            "01110" +
            "01110" +
            "01110" +
            "00100" +
            "00100" +
            "00100";
        weaponArgs [2].SetArgs(200f, 3f, 35f, 12f, 2.7f, 3.8f, 1.2f);

        weaponArgs[3].name       = "重型棒子";
        weaponArgs[3].expression =
            "11111" +
            "01110" +
            "01110" +
            "00100" +
            "00100" +
            "01110";
        weaponArgs [3].SetArgs(300f, 4f, 50f, 18f, 2.7f, 3.6f, 1.1f);

        weaponArgs[4].name       = "狼牙棒";
        weaponArgs[4].expression =
            "11110" +
            "11110" +
            "11110" +
            "01100" +
            "01100" +
            "01100";
        weaponArgs [4].SetArgs(400f, 5f, 70f, 22f, 2.7f, 3.5f, 1f);

        weaponArgs[5].name       = "咸鱼棒";
        weaponArgs[5].expression =
            "00110" +
            "01111" +
            "01111" +
            "01110" +
            "01100" +
            "11110";
        weaponArgs [5].SetArgs(500f, 6f, 75f, 25f, 2.8f, 3.7f, 1.4f);

        weaponArgs[6].name       = "短刀";
        weaponArgs[6].expression =
            "00000" +
            "00000" +
            "00100" +
            "00100" +
            "01110" +
            "00100";
        weaponArgs [6].SetArgs(200f, 3f, 25f, 8f, 2f, 4f, 2f);

        weaponArgs[7].name       = "短弯刀";
        weaponArgs[7].expression =
            "01000" +
            "00100" +
            "00110" +
            "01100" +
            "00100" +
            "00000";
        weaponArgs [7].SetArgs(300f, 4f, 35f, 12f, 2.2f, 3.9f, 2f);

        weaponArgs[8].name       = "短锯刀";
        weaponArgs[8].expression =
            "00000" +
            "10000" +
            "11000" +
            "10000" +
            "11100" +
            "10000";
        weaponArgs [8].SetArgs(400f, 5f, 50f, 15f, 2.2f, 3.9f, 1.8f);

        weaponArgs[9].name       = "锅铲";
        weaponArgs[9].expression =
            "00000" +
            "01110" +
            "01110" +
            "00100" +
            "00100" +
            "00100";
        weaponArgs [9].SetArgs(400f, 5f, 55f, 10f, 2f, 4f, 2.5f);

        weaponArgs[10].name       = "重锤";
        weaponArgs[10].expression =
            "11111" +
            "11111" +
            "11111" +
            "00100" +
            "00100" +
            "00100";
        weaponArgs [10].SetArgs(500f, 6f, 150f, 20f, 3.5f, 2.5f, 0.6f);

        weaponArgs[11].name       = "弯拐杖";
        weaponArgs[11].expression =
            "00100" +
            "01110" +
            "00010" +
            "00100" +
            "00010" +
            "00100";
        weaponArgs [11].SetArgs(200f, 3f, 45f, 15f, 7f, 3.8f, 0.67f);

        weaponArgs[12].name       = "水晶拐杖";
        weaponArgs[12].expression =
            "01010" +
            "01110" +
            "01110" +
            "00100" +
            "00100" +
            "00100";
        weaponArgs [12].SetArgs(300f, 4f, 55f, 16f, 7.5f, 3.8f, 0.67f);

        weaponArgs[13].name       = "山型拐杖";
        weaponArgs[13].expression =
            "10101" +
            "01110" +
            "01110" +
            "00100" +
            "00100" +
            "01000";
        weaponArgs [13].SetArgs(400f, 5f, 65f, 17f, 7.5f, 3.8f, 0.6f);

        weaponArgs[14].name       = "猫爪拐杖";
        weaponArgs[14].expression =
            "01110" +
            "11111" +
            "01110" +
            "00100" +
            "01000" +
            "00100";
        weaponArgs [14].SetArgs(500f, 6f, 80f, 18f, 7.5f, 3.8f, 0.6f);

        weaponArgs[15].name       = "长剑";
        weaponArgs[15].expression =
            "00010" +
            "00010" +
            "00010" +
            "00111" +
            "00010" +
            "00010";
        weaponArgs [15].SetArgs(500f, 6f, 100f, 25f, 3.2f, 3f, 1f);
    }
示例#14
0
    void SetWeapon(int type, float complished)
    {
        GetComponent <WeaponController> ().SetWeapon(type);

        int totalCnt = 0, totalQuality = 0;
        int attCnt = 0, attQ = 0;
        int defCnt = 0, defQ = 0;
        int speedCnt = 0, speedQ = 0;

        for (int r = 0; r < maxR; r++)
        {
            for (int c = 0; c < maxC; c++)
            {
                if (layout[r, c] != -1)
                {
                    totalCnt++;
                    totalQuality += layout[r, c] + 1;
                    if (r < maxR / 3)
                    {
                        attCnt++;
                        attQ += layout[r, c] + 1;
                    }
                    else if (r < maxR * 2 / 3)
                    {
                        defCnt++;
                        defQ += layout[r, c] + 1;
                    }
                    else
                    {
                        speedCnt++;
                        speedQ += layout[r, c] + 1;
                    }
                }
            }
        }
        float quality    = (totalCnt == 0) ? 1f : (float)totalQuality / totalCnt;
        float attBonus   = (attCnt == 0) ? 1f : (float)attQ / attCnt;
        float defBonus   = (defCnt == 0) ? 1f : (float)defQ / defCnt;
        float speedBonus = (speedCnt == 0) ? 1f : Mathf.Pow((float)speedQ / speedCnt, 0.3f);
        float k          = Mathf.Pow(complished * quality, 0.5f);

        ArgsController args   = GetComponent <ArgsController> ();
        WeaponArgs     weapon = (type == -1) ? (new WeaponArgs()) : weaponArgs [type];

        args.weaponComplish = complished;
        args.weaponQuality  = quality;
        args.attBonus       = attBonus;
        args.defBonus       = defBonus;
        args.speedBonus     = speedBonus;
        args.weaponTexture  = weapon.texture;
        if (type == -1)
        {
            args.weaponWave = emptyWave;
            GetComponent <PlayerController>().attackSound = emptySound;
        }
        else
        {
            args.weaponWave = weapon.weaponWave;
            GetComponent <PlayerController>().attackSound = weapon.weaponSound;
        }
        args.weaponName = weapon.name;

        float hpRate = (float)args.hp / args.maxHp;

        args.maxHp = weapon.maxHp * k;
        args.hp    = args.maxHp * hpRate;

        args.deltaHp     = weapon.deltaHp;
        args.att         = weapon.att * k * attBonus;
        args.def         = weapon.def * k * defBonus;
        args.range       = weapon.range * speedBonus;
        args.moveSpeed   = weapon.moveSpeed * speedBonus;
        args.attackSpeed = weapon.attackSpeed * speedBonus;
    }