mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-03-25 17:12:49 +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:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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))
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user