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

@@ -13,12 +13,12 @@ import emu.grasscutter.scripts.data.SceneTrigger;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify;
import emu.grasscutter.server.packet.send.PacketDungeonChallengeFinishNotify;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Getter
@Setter
public class WorldChallenge {
@@ -27,7 +27,7 @@ public class WorldChallenge {
private final int challengeId;
private final int challengeIndex;
private final List<Integer> paramList;
private final int timeLimit;
private int timeLimit;
private final List<ChallengeTrigger> challengeTriggers;
private final int goal;
private final AtomicInteger score;
@@ -112,24 +112,10 @@ public class WorldChallenge {
}
// TODO: record the time in PARAM2 and used in action
// TODO: Set 'eventSource' in script arguments.
// Event source should be set to '1' for timer challenges.
var eventSource = new AtomicReference<>("");
// TODO: This is a hack to get the event source.
// This should be properly implemented.
scriptManager
.getTriggersByEvent(EventType.EVENT_CHALLENGE_SUCCESS)
.forEach(
trigger -> {
if (trigger.currentGroup.id == this.getGroup().id) {
eventSource.set(trigger.getSource());
}
});
scriptManager.callEvent(
new ScriptArgs(this.getGroup().id, EventType.EVENT_CHALLENGE_SUCCESS)
.setParam2(finishedTime)
.setEventSource(eventSource.get()));
.setEventSource(this.getChallengeIndex()));
this.getScene()
.triggerDungeonEvent(
@@ -145,23 +131,10 @@ public class WorldChallenge {
this.finish(false);
// TODO: Set 'eventSource' in script arguments.
// Event source should be set to '1' for timer challenges.
var eventSource = new AtomicReference<>("");
// TODO: This is a hack to get the event source.
// This should be properly implemented.
var scriptManager = this.getScene().getScriptManager();
scriptManager
.getTriggersByEvent(EventType.EVENT_CHALLENGE_FAIL)
.forEach(
trigger -> {
if (trigger.currentGroup.id == this.getGroup().id) {
eventSource.set(trigger.getSource());
}
});
scriptManager.callEvent(
new ScriptArgs(this.getGroup().id, EventType.EVENT_CHALLENGE_FAIL)
.setEventSource(eventSource.get()));
.setEventSource(this.getChallengeIndex()));
challengeTriggers.forEach(t -> t.onFinish(this));
}

View File

@@ -18,6 +18,7 @@ public abstract class ChallengeFactory {
challengeFactoryHandlers.add(new KillMonsterTimeChallengeFactoryHandler());
challengeFactoryHandlers.add(new SurviveChallengeFactoryHandler());
challengeFactoryHandlers.add(new TriggerInTimeChallengeFactoryHandler());
challengeFactoryHandlers.add(new KillMonsterCountInTimeIncChallengeFactoryHandler());
}
public static WorldChallenge getChallenge(

View File

@@ -0,0 +1,33 @@
package emu.grasscutter.game.dungeons.challenge.factory;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.dungeons.challenge.enums.ChallengeType;
import emu.grasscutter.game.dungeons.challenge.trigger.InTimeTrigger;
import emu.grasscutter.game.dungeons.challenge.trigger.KillMonsterCountTrigger;
import emu.grasscutter.game.dungeons.challenge.trigger.KillMonsterTimeIncTrigger;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.scripts.data.SceneGroup;
import lombok.val;
import java.util.List;
public class KillMonsterCountInTimeIncChallengeFactoryHandler implements ChallengeFactoryHandler{
@Override
public boolean isThisType(ChallengeType challengeType) {
return challengeType == ChallengeType.CHALLENGE_TIME_FLY;
}
@Override
public WorldChallenge build(int challengeIndex, int challengeId, int groupId, int monsterCount, int timeLimit, int timeInc, Scene scene, SceneGroup group) {
val realGroup = scene.getScriptManager().getGroupById(groupId);
return new WorldChallenge(
scene, realGroup,
challengeId, // Id
challengeIndex, // Index
List.of(monsterCount, timeLimit, timeInc),
timeLimit, // Limit
monsterCount, // Goal
List.of(new KillMonsterCountTrigger(), new InTimeTrigger(), new KillMonsterTimeIncTrigger(timeInc))
);
}
}

View File

@@ -0,0 +1,26 @@
package emu.grasscutter.game.dungeons.challenge.trigger;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.server.packet.send.PacketChallengeDataNotify;
public class KillMonsterTimeIncTrigger extends ChallengeTrigger{
private int increment;
public KillMonsterTimeIncTrigger(int increment) {
this.increment = increment;
}
@Override
public void onBegin(WorldChallenge challenge) {
//challenge.getScene().broadcastPacket(new PacketChallengeDataNotify(challenge, 0, challenge.getScore().get()));
}
@Override
public void onMonsterDeath(WorldChallenge challenge, EntityMonster monster) {
challenge.getScene().broadcastPacket(new PacketChallengeDataNotify(challenge, 0, increment));
challenge.setTimeLimit(challenge.getTimeLimit() + increment);
}
}