mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-21 03:15:59 +01:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user