public void Update() { //some basic error checking if (Level.current == null || Steam.user == null) { return; } //fancy SFX replacement. yeah yeah, it's per frame, whatever. deal with it. if (ModSettings.enableDangerousInjections) { foreach (KeyValuePair <string, Tuple <float, string>[]> entry in _sfxr) { if (entry.Value.Length > 0) { bool changed = false; foreach (Tuple <float, string> val in entry.Value) { //no breaking is done intentionally. later entries have priority. if (Rando.Float(0.0f, 1.0f) < val.Item1) { _sounds[entry.Key] = _sounds[val.Item2]; changed = true; } } //if not changed, reset to default if (!changed) { _sounds[entry.Key] = _sounds_bak[entry.Key]; } } } } //hat replacement if (!(Level.current is Editor)) { IEnumerable <Thing> teamHatList = Level.current.things[typeof(TeamHat)]; //int nhats = 0; foreach (TeamHat teamHat in teamHatList) { //nhats++; if (teamHat.team != null && teamHat.team.customData == null && teamHat.team.hasHat) { if (!(teamHat is EdoHat)) { //'Normal' Special Hats if (CensoredHat.isHat(teamHat)) { ReplaceHat(teamHat, new CensoredHat(teamHat.x, teamHat.y, teamHat.team)); } if (BreadfishHat.isHat(teamHat)) { ReplaceHat(teamHat, new BreadfishHat(teamHat.x, teamHat.y, teamHat.team)); } if (AdsHat.isHat(teamHat)) { ReplaceHat(teamHat, new AdsHat(teamHat.x, teamHat.y, teamHat.team)); } if (AndIHat.isHat(teamHat)) { ReplaceHat(teamHat, new AndIHat(teamHat.x, teamHat.y, teamHat.team)); } //Special Ability Hats if (NoHat.isHat(teamHat)) { ReplaceHat(teamHat, new NoHat(teamHat.x, teamHat.y, teamHat.team)); } if (DittoHat.isHat(teamHat)) { ReplaceHat(teamHat, new DittoHat(teamHat.x, teamHat.y, teamHat.team)); } if (BombHat.isHat(teamHat)) { ReplaceHat(teamHat, new BombHat(teamHat.x, teamHat.y, teamHat.team)); } if (ChickenHat.isHat(teamHat)) { ReplaceHat(teamHat, new ChickenHat(teamHat.x, teamHat.y, teamHat.team)); } if (PiesHat.isHat(teamHat)) { ReplaceHat(teamHat, new PiesHat(teamHat.x, teamHat.y, teamHat.team)); } if (FinnerHat.isHat(teamHat)) { ReplaceHat(teamHat, new FinnerHat(teamHat.x, teamHat.y, teamHat.team)); } if (DJHat.isHat(teamHat)) { ReplaceHat(teamHat, new DJHat(teamHat.x, teamHat.y, teamHat.team)); } //Developer Hats if (DenHat.isHat(teamHat)) { ReplaceHat(teamHat, new DenHat(teamHat.x, teamHat.y, teamHat.team)); } if (MilkHat.isHat(teamHat)) { ReplaceHat(teamHat, new MilkHat(teamHat.x, teamHat.y, teamHat.team)); } if (UpsideHat.isHat(teamHat)) { ReplaceHat(teamHat, new UpsideHat(teamHat.x, teamHat.y, teamHat.team)); } //turbans if (TurbanData.find(teamHat.sprite.texture.textureIndex) != null) { Turban turban = new Turban(teamHat.x, teamHat.y, teamHat.team); ReplaceHat(teamHat, turban); SpawnCape(turban, new Sprite(Mod.GetPath <EdoMod>("capes\\king")).texture); } } /*if(!(teamHat is Turban)) * { * Turban turban = TurbanData.findHat(teamHat); * if (turban != null) * { * ReplaceHat(teamHat, turban); * } * if (teamHat is Turban) * { * SpawnCape(turban, new Sprite(Mod.GetPath<EdoMod>("capes\\king")).texture); * } * }*/ } } List <Thing> removedHats = teamSpawnsDone.Keys.Except(Level.current.things[typeof(TeamHat)]).ToList(); foreach (Thing thing in removedHats) { TeamHat teamHat = thing as TeamHat; if (teamHat != null && teamSpawnsDone.ContainsKey(teamHat)) { Cape cape; if (teamSpawnsDone.TryGetValue(teamHat, out cape)) { Level.Remove(cape); } teamSpawnsDone.Remove(teamHat); } } //DIVEKICK! //Duck.grounded IEnumerable <Thing> ducks = Level.current.things[typeof(Duck)]; foreach (Duck duck in ducks) { if (!duck.grounded && duck.sliding) { //Duck target = Level.current.NearestThing<Duck>(duck.position); foreach (Duck target in ducks) { //can't target null or self if (target == null || target == duck) { continue; } //can't kill a dead target if (target.dead) { continue; } //near to duck && falling down if ((target.position - duck.position).length < 10f && duck.velocity.y > 0) { //Performed DIIIVE KICK! SFX.Play(EdoMod.GetPath <EdoMod>("SFX\\DiveKick")); target.Kill(new DTImpact(duck)); } } } } } }