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