Superfighters Deluxe 1.3.6b is out!

Added 6 Jul 2020
* Streetsweepers have been tuned down to feel like a less impossible threat to deal with:
- Life reduced from 60 to 45.
- Time between bursts increased from 3.0 to 3.5 seconds.
- Each projectile that hits a Streetsweeper now does a minimum of 6 damage, making guns like uzi and shotgun more useful.
- Magnum and Sniper bullets can now one-shot Streetsweepers.
- With a Strength Boost active, your melee damage towards Streetsweepers is doubled (except for the Chainsaw).
- Heavy metal melee weapons (Fire Axe, Hammer, Pipe Wrench and Lead Pipe) now deal bonus damage towards Streetsweepers.
- The disable time from electrocuting a Streetsweeper using the Shock Batons increased from 2.5 to 4.0 seconds. This now also resets the target the Streetsweeper is chasing, making for a better escape tool.
- The time you need to stay out-of-sight before Streetsweepers can target other opponents reduced from 2.0 to 1.7 seconds.
 
* Removed the magnum from the "Streetsweeper Sweep-up" challenge.
 
* Pressing the "sheathe weapon" button will now cancel queued weapon equipping (noticeable for throwables and automatic weapons in some situations).
* Fixed a bug where rolling could get unintentionally delayed if you kept alternating between standing/crouching after a melee weapon breaks during a melee attack.
* Fixed a bug where you would be unable to perform certain melee actions immediately after dropping a weapon in some situations.
* Fixed a bug where you couldn't kick immediately after sheathing a gun in some situations.
 
* ScriptAPI: Fixed a bug where IPlayer.SetUser() would not properly update the player's team in the scoreboard and HUD.

Superfighters Deluxe 1.3.6 is out!

Added 26 Apr 2020
* Fixed a bug preventing the player from attacking, blocking or grabbing after blocking and catching an unequippable item (pills, slo-mo, strength boost, etc.)
 
ScriptAPI:
* Added IPlayer.IsHoldingActiveThrowable, IPlayer.GetActiveThrowableWeaponItem(), IPlayer.SetActiveThrowableTimer(..), IPlayer.DisarmActiveThrowable(..) to be able to read and disarm current active throwables on a player.
* Updated IPlayer.Disarm(..). It will now disarm any active throwables first. Also included an optional parameter 'out IObject disarmedActiveThrowable' to be able to read the disarmed active throwable (if any). This returns the same object as calling IPlayer.DisarmActiveThrowable() first. This is done to keep backwards compatibility with existing code.
* Added IObjectGrenadeThrown.GetExplosionTimer(), IObjectGrenadeThrown.SetExplosionTimer() to be able to change the explosion timer on thrown grenades (and "reactivate" duds by calling SetExplosionTimer after the first timer runs out).
* Added IPlayer.GetCorpseHealth(), SetCorpseHealth(float value), GetCorpseMaxHealth() to be able to update the durability of a dead player's corpse.
* Added IObjectWeaponItem.GetCurrentAmmo(), IObjectWeaponItem.GetMaxAmmo() to be able to read ammo from current item.
* Added IObjectWeaponItem.RifleWeapon|HandgunWeapon|RangedWeapon|ThrownWeapon|PowerupItem|InstantPickupWeaponItem which returns the item information struct about the specified item.
* Added MeleeWeaponItem.CurrentValue, CurrentValue.MaxValue to read durability (0-100).
* Updated ProjectileHitCallback to handle deflections by:
- Adding ProjectileHitArgs.IsDeflection, ProjectileHitArgs.DeflectionNormal to be able to read if a projectile hit is a deflection.
- Updating ProjectileHitArgs.RemoveFlag so it's now false during deflections.
- Updating ProjectileHitCallback so it's now fired when projectiles are blocked or deflected by players and deflected on ProjectileDeflectZone.
* Added IProjectile.PowerupTotalBounces to read projectile's maximum total bounces that can be performed. IProjectile.BounceCount can now be written to to change current amount of bounces.
* Players deflecting a bullet now counts towards the bullet's total bounce count as if it bounced on a wall.
* Moved IPlayer.DealDamage() to base IObject.DealDamage() and added bool IObject.Destructable readonly property to be able to deal damage to objects in a more convenient way.
* Added IPlayer.CurrentPrimaryRangedWeapon and IPlayer.CurrentSecondaryRangedWeapon. Both return a RangedWeaponItem struct containing the same properties as RifleWeaponItem and HandgunWeaponItem.
* Added LazerEquipped property to RangedWeaponItem, RifleWeaponItem and HandgunWeaponItem to be able to read if a ranged weapon has a lazer upgrade attached.
* Removed IGame.WriteToConsole(string text) in favor of the new IGame.WriteToConsole(object param[] args) to avoid ambiguous calls between the two.
* IGame.WriteToConsole now prints <null> for null values.
* IGame.WriteToConsoleF no longer crashes if you input an invalid format, instead a default format will be generated and used.
* Fixed a bug where SupplyCrates created in the editor or ScriptAPI would show the wrong category icon for lazer, bouncing fire and explosive fire powerups.
* Fixed Events.PlayerWeaponRemovedActionCallback not running correctly when a player gets gibbed or removed in certain situations.
* Fixed a bug where projectiles created inside ProjectileCreatedCallbackEvent wouldn't work properly.
* Fixed a bug causing IGame.GetColorPackage() to always return null.
* Fixed a bug that showed the wrong exception when a stacktrace from map scripts couldn't be parsed correctly.
* Fixed a bug with IObjectPlayerSpawnTrigger.SetSpawnWeaponItem*(..) causing exceptions when calling Trigger().

Superfighters Deluxe 1.3.5 is out!

Added 23 Mar 2020
ScriptAPI:
 
* Updated Game.GetObjectsByArea(...) to include a second parameter (PhysicsLayer.Active | PhysicsLayer.Background | PhysicsLayer.All) to be able to get objects from the background Box2D world (where FarBg objects and PathNode objects are).
* Added IObject.GetPhysicsLayer() to be able to read if an object is in the Background or Active Physics layer.
* Added CollisionFilter.AbsorbProjectile and RayCastInput.AbsorbProjectile to be able to filter if projectiles are absorbed on hit or not.
* Added float IObjectWeaponItem.DespawnTime, void IObjectWeaponItem.SetDespawnTime(int despawnTimeMs), bool IObjectWeaponItem.Despawning, IObjectWeaponItem.BreakOnDrop, IObjectWeaponItem.SetBreakOnDrop(bool value) to be able to control how items are despawned (with a few exceptions, see the ScriptAPI documentation for details).
* Added IPlayer.InThrowingMode to be able to see if the player has toggled to throwing mode.
* Added IObjectTimerTrigger.ResetTrigger(), IObjectTimerTrigger.StopTimer(), IObjectTimerTrigger.StartTimer(), IObjectTimerTrigger.IsTimerRunning to be able to stop/start/reset timers through code.
* Added IObjectAlternatingTrigger.ResetTrigger() which restarts the trigger at the first item.
* Added IObjectWeaponItem IPlayer.Disarm(WeaponItemType weaponType, Vector2 velocity) to be able to make players drop any weapon at any time.
* Added IPlayer.DealDamage(float damage) to be able to deal "misc/other" damage according to the built in rules for players in the game.
* Added Events.PlayerWeaponAddedActionCallback, Events.PlayerWeaponRemovedActionCallback to be able to listen when items are added or removed from player equipment (for example when a player grabs items, drops items, or throws items, or when a script removes/adds items etc.). See documentation for more details.
* Added IPlayer.GetWeaponMuzzleInfo(..), IPlayer.GetWeaponLazerInfo(..) to get world position and direction from an equipped weapon to be able to read where projectiles should be spawned if you're creating custom projectiles.
* Added Game.WriteToConsole(param object[] message) and Game.WriteToConsoleF(string format, param object[] args) for some quicker formatting.
* Fixed a NullReferenceException when using Game.CreateObject() in ObjectDamageCallback.
* Fixed a bug where LocalStorage and GlobalStorage wouldn't properly save empty arrays, causing them to be read as an array of length 1.
* Fixed a bug where damage from SawBlades and StreetsweeperBlades would count towards TotalMeleeDamageTaken instead of TotalOtherDamageTaken in the IPlayer.Statistics.
* Fixed the default "My Project" label in the documentation to "Superfighters Deluxe".

Superfighters Deluxe 1.3.4 is out!

Added 7 Feb 2020
* Added command "/MODERATORS" to be able to list all moderators in-game if you are the host.
* Added support to be able to assign passwords to moderators. This is done by right clicking on the moderator list in the server software OR by using the command "/SETMODERATORPASSWORD [X] [PASS]" where [X] is the shorthand index of the moderator (as displayed in the /MODERATORS command) and [PASS] is the new password.
* Fixed a bug where commands "/SETTEAMS" and "/SHUFFLETEAMS" wouldn't work in offline games.
* Fixed a red error message being displayed in the tutorial when dying for the first time.
 
Map Editor:
* Fixed a bug where you couldn't target OnPlayerDamageTriggers in the map editor from other triggers.
* Fixed a crash that could happen when clicking buttons in the map while testing your map in the Map Editor.
* ScriptAPI: Added IPlayer.GetEnergy(), IPlayer.GetMaxEnergy() to read current energy from a player.
* ScriptAPI: Fixed a bug which prevented callback events from triggering other registered callback events correctly in certain situations.
 
* Other minor fixes.

Superfighters Deluxe 1.3.3 is out!

Added 1 Nov 2019

HAPPY HALLOWEEN!

* New Versus map: Old Warehouse.
* New Challenge: Return to Castle Sonnenfreude.
* Bots can now seek cover while shooting.
* Streetsweepers now have nameplates and team icons.
* Slightly lowered Streetsweeper spawn chance.
 
ScriptAPI:
* Added BotBehaviorSet.SeekCoverWhileShooting to control how likely a bot will take cover while shooting.
* Added IObjectStreetsweeper.SetShowNamePlate(), GetShowNamePlate() to determine if name plates should be visible or not (default true).
* Added IObjectStreetsweeperCrate.GetRandomWeapon(), SetRandomWeapon() to control if a spawned Streetsweeper should randomize its weapon.
* Now possible to set weapon type to "None" for Streetsweepers (map editor and code) (Added StreetsweeperWeaponType.None).