mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-05-18 03:47:07 +08: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,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++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user