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); }
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; }
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)); }
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); }
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); }
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; } }
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; }
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); }
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); }
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); } } }
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; }
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); }
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; }