* introduction of aggravated damage properties and modification of damage pathways such that 'aggravated' is treated as a unique damage type
* initial work and tests for AggravatedDamageMessage
* wrote aggravated damage properties into the definitions of projectiles that convey them; basic workflow for aggravation from projectile damage is in place, but not tested
* merge rebase resolutions
* grenade projectile flag on projectile definition; better timing control on aura behavior and integration with player control
* timing and damage tuning around: standard, reinforced, max; plasma grenades, dragon
* work on starfire damage profile; moved aura behavior into own folder and creates an aura container object; extended aura behavior to vehicles; applied target-control to aggravation effect
* woring Starfire damage calculations; projectiles have open-ended quality modifier
* working comet calculations
* separated aggravation behavior and uara management behavior; moved files into packages and deleted old files
* moved aggravation damage into damage implementations of turrets and vehicles, rather than directly into ther immediate control agencies; revamp projectile quality modifiers; comet now does initial damage and one less tick of aggravation; the implementation progression of damageable entities is different now
* eliminated multiple timers for a single aura effect; added comments; added tests; fixed tests
* aura effects that will run for longer will not get replaced by aura effects that would end sooner
* merge rebase; accommodation for suppressing aura where no aura should be displayed; new radial degrade calculations
* test repairs
* merge rebase hell
* dragon fireball burn damage modification
* fireball burn effect should always be 1 as long as it does damage, despite radial degrade
* Fix !list not distinguishing between players and corpses
* Fix /worldkick not working
* /silence no longer responds with a message window
* Fix 96-99 zone map files
* Fix implants not resetting after being jammend
* Fix MAXes requiring the wrong certs
* RefreshLoadouts no longer queries loadoads from the database
* /gmtell no longer sends to self
* Set AMS spawn timer to 10 seconds
* Fix medkit cooldown display
* Fix wrong max type being purchased
* Fix implants not being locked when fatigued
* Fix implants progress bar
* Make tells case insensitive
* Add AvatarActor: Responsible for managing the session's avatar object
* Convert Avatar object to case class
* Add persistence for BEP, CEP, implants, certs and cosmetics
* Add cosmetic chat commands and handle UI packet
* Add /setbr, /setcr, /certadd, /addbep, /addcep GM commands
* Convert zone maps to JSON
* Update to Scala 2.13.3 and fix warnings
* Fix MAX cooldowns not being applied when purchased manually
* Normalize database table names to singular
* Add docker image build
Buildings will now persist their faction in the database. At least
that's what I want you to believe this change is.
What it actually is: A rework of InterstellarCluster and groundwork
for further reworks.
InterstellarClusterService: This is the old InterstellarCluster, but
as a service (it has always been one in secret). It was converted to
a typed actor and it now handles all spawn point requests.
ZoneActor: Basically ZoneControl, but as a typed actor. It's more of a
stub right now, the eventual goal is to have it own the `Zone` object
rather than the other way around.
BuildingActor: BuildingControl, but as a typed actor.
Also includes some minor improvements to ChatActor and sets
SupervisorStrategy.restart for all typed actors (which is the default
for classic actors, but not for typed actors - we may want to get more
sophisticated here in the future).
This removes roughly 1k LOC from WorldSessionActor and moves
them to a new ChatActor. That was the initial goal anyway, but it
wasn't that simple. There was no clear location to put this new actor,
I didn't want to put it in pslogin since it isn't part of the "login server"
(and neither is WSA). But since the new actor would have to talk to
WSA and common does not depend on pslogin, I had a choice of
putting more actors in pslogin or putting everything in common. I
chose the latter.
ChatActor and SessionActor (formerly WorldSessionActor) now live
in `common/actors/session`. Since WSA also depends on other
actors in pslogin, most of the pslogin code was moved to either
common/login or common/util. PsLogin as the main entry point
remains in pslogin since having the main code compile to a library
has some advantages, and it will allow us to produce binaries
for distinct login/world servers in the future if desired. For a second
take, I'd suggest moving common to /src in the root directory.
This change is enabled by a new immutable `Zone` object that is
passed from SessionActor to ChatActor. Most of its members are
still mutable references, and the code at the moment does depend
on this being the case. Changes to the session object in
SessionActor are forwarded through a SetZone message to
ChatActor. As we split out more code into actors, we could
use EventBus or typed Topic's instead.
Also included is a reworked ChatService that was converted to a
typed actor and uses the built-in Receptionist facility for service
discovery. By receiving the session object from ChatActor, it can
be much smarter about who to send messages to, rather than
sending all messages to everyone and having them figure it out.
But as this session object is not updated, it can only use static
properties like player name and faction and not fluid properties
like position.
The following chat commands were added:
command, note, gmbroadcast, [nc|tr|vs|broadcast, gmtell, gmpopup
and !whitetext
* initial packet and tests for ChainLashMessage; changed Rounds to RoundPerShot for extra clarity; weapon fire and discharge refactor
* lash damage field for maelstrom; chain lashes on hit with damsage proxy
* mend
* must modify all tests that rely on ephemeral logic like this in the future
* adding modifiers to take the place of target-selected distance calculations performed on damage valuesd; simplying the damage model
* suppressor goes in the suppressor slot