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
Unverified
parent 9b58105120
commit f00c54cb95
71 changed files with 2015 additions and 995 deletions
@@ -1,9 +1,9 @@
package emu.grasscutter.data.binout;
import static emu.grasscutter.game.ability.AbilityLocalIdGenerator.*;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.AbilityLocalIdGenerator;
import emu.grasscutter.game.ability.AbilityLocalIdGenerator.ConfigAbilitySubContainerType;
import java.util.HashMap;
import java.util.Map;
@@ -12,13 +12,26 @@ public class AbilityData {
public Map<String, AbilityModifier> modifiers;
public boolean isDynamicAbility;
public Map<String, Float> abilitySpecials;
public AbilityModifierAction[] onAdded;
public AbilityModifierAction[] onRemoved;
public AbilityModifierAction[] onAbilityStart;
public AbilityModifierAction[] onKill;
public AbilityModifierAction[] onFieldEnter;
public AbilityModifierAction[] onExit;
public AbilityModifierAction[] onAttach;
public AbilityModifierAction[] onDetach;
public AbilityModifierAction[] onAvatarIn;
public AbilityModifierAction[] onAvatarOut;
public AbilityModifierAction[] onTriggerAvatarRay;
public AbilityModifierAction[] onVehicleIn;
public AbilityModifierAction[] onVehicleOut;
// abilityMixins
// onAbilityStart
// onKill
public AbilityMixinData[] abilityMixins;
public final Map<Integer, AbilityModifierAction> localIdToAction = new HashMap<>();
public final Map<Integer, AbilityMixinData> localIdToMixin = new HashMap<>();
private boolean _initialized = false;
@@ -26,48 +39,88 @@ public class AbilityData {
if (_initialized) return;
_initialized = true;
if (modifiers == null) return;
initializeMixins();
initializeModifiers();
initializeActions();
}
private void initializeActions() {
AbilityLocalIdGenerator generator = new AbilityLocalIdGenerator(ConfigAbilitySubContainerType.ACTION);
generator.configIndex = 0;
generator.initializeActionLocalIds(onAdded, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onRemoved, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onAbilityStart, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onKill, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onFieldEnter, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onExit, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onAttach, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onDetach, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onAvatarIn, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onAvatarOut, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onTriggerAvatarRay, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onVehicleIn, localIdToAction);
generator.configIndex++;
generator.initializeActionLocalIds(onVehicleOut, localIdToAction);
}
private void initializeMixins() {
if(abilityMixins != null) {
AbilityLocalIdGenerator generator = new AbilityLocalIdGenerator(ConfigAbilitySubContainerType.MIXIN);
generator.modifierIndex = 0;
generator.configIndex = 0;
generator.initializeMixinsLocalIds(abilityMixins, localIdToMixin);
}
}
private void initializeModifiers() {
if(modifiers == null) return;
var _modifiers = modifiers.entrySet().stream()
.sorted(Map.Entry.comparingByKey()).map(Map.Entry::getValue)
.toList();
var _modifiers = modifiers.values().toArray(new AbilityModifier[0]);
var modifierIndex = 0;
for (var modifier : _modifiers) {
for (AbilityModifier abilityModifier : _modifiers) {
long configIndex = 0L;
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onAdded, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onRemoved, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onBeingHit, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onAttackLanded, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onHittingOther, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onThinkInterval, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onKill, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onCrash, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onAvatarIn, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onAvatarOut, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onReconnect, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onChangeAuthority, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onVehicleIn, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onVehicleOut, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onZoneEnter, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onZoneExit, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onHeal, localIdToAction);
this.initializeActionSubCategory(
modifierIndex, configIndex++, modifier.onBeingHealed, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onAdded, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onRemoved, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onBeingHit, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onAttackLanded, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onHittingOther, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onThinkInterval, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onKill, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onCrash, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onAvatarIn, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onAvatarOut, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onReconnect, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onChangeAuthority, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onVehicleIn, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onVehicleOut, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onZoneEnter, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onZoneExit, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onHeal, localIdToAction);
this.initializeActionSubCategory(modifierIndex, configIndex++, abilityModifier.onBeingHealed, localIdToAction);
if (abilityModifier.modifierMixins != null) {
var generator = new AbilityLocalIdGenerator(ConfigAbilitySubContainerType.MODIFIER_MIXIN);
generator.modifierIndex = modifierIndex;
generator.configIndex = 0;
generator.initializeMixinsLocalIds(abilityModifier.modifierMixins, localIdToMixin);
}
modifierIndex++;
}