Implement a proper ability system (#2166)

* Apply fix `21dec2fe`

* Apply fix `89d01d5f`

* Apply fix `d900f154`

this one was already implemented; updated to use call from previous commit

* Ability changing commit

TODO: change info to debug

* Remove use of deprecated methods/fields

* Temp commit v2
(Adding LoseHP and some fixes)

* Oopsie

* Probably fix monster battle

* Fix issue with reflecting into fields

* Fix some things

* Fix ability names for 3.6 resources

* Improve logging

---------

Co-authored-by: StartForKiller <jesussanz2003@gmail.com>
This commit is contained in:
Magix
2023-05-29 23:40:02 -07:00
committed by GitHub
parent 9b58105120
commit f00c54cb95
71 changed files with 2015 additions and 995 deletions

View File

@@ -1,63 +1,18 @@
package emu.grasscutter.game.ability;
import emu.grasscutter.data.binout.AbilityData;
import emu.grasscutter.data.binout.AbilityModifier;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.server.event.entity.EntityDamageEvent;
import lombok.Getter;
import lombok.Setter;
public final class AbilityModifierController {
@Getter private AbilityModifier data;
public class AbilityModifierController {
@Getter private Ability ability;
@Getter private Ability ability; // Owner ability instance
@Getter private AbilityData abilityData;
@Getter private AbilityModifier modifierData;
@Getter private float elementDurability;
@Getter @Setter private int localId;
public AbilityModifierController(Ability ability, AbilityModifier data) {
public AbilityModifierController(Ability ability, AbilityData abilityData, AbilityModifier modifierData) {
this.ability = ability;
this.data = data;
this.elementDurability = data.elementDurability.get();
}
public void setElementDurability(float durability) {
this.elementDurability = durability;
if (durability <= 0) {
onRemoved();
ability.getModifiers().values().removeIf(a -> a == this);
}
}
public void onAdded() {
if (data.onAdded == null) return;
for (AbilityModifierAction action : data.onAdded) {
ability.getManager().executeAction(ability, action);
}
}
public void onRemoved() {
if (data.onRemoved == null) return;
for (AbilityModifierAction action : data.onRemoved) {
ability.getManager().executeAction(ability, action);
}
}
public void onBeingHit(EntityDamageEvent event) {
if (data.onBeingHit != null)
for (var action : data.onBeingHit) {
ability.getManager().executeAction(ability, action);
}
if (event.getAttackElementType().equals(data.elementType)) {
elementDurability -= event.getDamage();
if (elementDurability <= 0) {
onRemoved();
ability.getModifiers().values().removeIf(a -> a == this);
}
}
this.abilityData = abilityData;
this.modifierData = modifierData;
}
}