Skip to content

Commit c832a43

Browse files
committed
deliver_item objective
1 parent 9b09f10 commit c832a43

4 files changed

Lines changed: 139 additions & 0 deletions

File tree

src/main/java/de/erethon/aether/Aether.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.erethon.aether.qxl.actions.ShowMobAction;
1313
import de.erethon.aether.qxl.actions.SpawnMobAction;
1414
import de.erethon.aether.qxl.actions.SpawnerAction;
15+
import de.erethon.aether.qxl.objectives.DeliverItemObjective;
1516
import de.erethon.aether.qxl.objectives.InteractMobObjective;
1617
import de.erethon.aether.qxl.objectives.KillMobObjective;
1718
import de.erethon.aether.spawning.MobSpawnConfig;
@@ -168,6 +169,7 @@ public void onEnable() {
168169
questsXL.registerComponent(QRegistries.ACTIONS, "show_mob", ShowMobAction::new);
169170
questsXL.registerComponent(QRegistries.ACTIONS, "hide_mob", HideMobAction::new);
170171
questsXL.registerComponent(QRegistries.ACTIONS, "remove_mob", RemoveMobAction::new);
172+
questsXL.registerComponent(QRegistries.OBJECTIVES, "deliver_item", DeliverItemObjective::new);
171173
questsXL.registerComponent(QRegistries.OBJECTIVES, "kill_mob", KillMobObjective::new);
172174
questsXL.registerComponent(QRegistries.OBJECTIVES, "interact_mob", InteractMobObjective::new);
173175
}

src/main/java/de/erethon/aether/creature/AetherBaseMob.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import de.erethon.aether.events.CreatureDeathEvent;
1414
import de.erethon.aether.events.CreatureInteractEvent;
1515
import de.erethon.aether.events.CreatureLoadEvent;
16+
import de.erethon.aether.events.MobDeliverItemEvent;
1617
import de.erethon.aether.qxl.AetherHolder;
1718
import de.erethon.aether.tools.NMSUtils;
1819
import de.erethon.hecate.Hecate;
@@ -544,8 +545,27 @@ public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReas
544545
if (hand == InteractionHand.OFF_HAND) { // Called for both hands, we only want main hand
545546
return super.mobInteract(player, hand);
546547
}
548+
// Interaction event
547549
CreatureInteractEvent event = new CreatureInteractEvent((org.bukkit.entity.Player) player.getBukkitEntity(), this, data);
548550
Bukkit.getPluginManager().callEvent(event);
551+
552+
// Item delivery
553+
ItemStack itemInHand = player.getItemInHand(hand);
554+
if (!itemInHand.isEmpty()) {
555+
HItem hItem = Aether.getInstance().getItemLibrary().get(itemInHand).getItem();
556+
if (hItem != null) {
557+
int amount = itemInHand.getCount();
558+
MobDeliverItemEvent deliverEvent = new MobDeliverItemEvent((org.bukkit.entity.Player) player.getBukkitEntity(), data.getID(), hItem, amount);
559+
deliverEvent.callEvent();
560+
itemInHand.setCount(deliverEvent.getAmount());
561+
if (itemInHand.getCount() <= 0) {
562+
player.setItemInHand(hand, new ItemStack(Items.AIR));
563+
}
564+
return super.mobInteract(player, hand); // Do not process dialogue if an item was delivered
565+
}
566+
}
567+
568+
// QXL
549569
try {
550570
QPlayer qPlayer = QuestsXL.get().getDatabaseManager().getCurrentPlayer((org.bukkit.entity.Player) player.getBukkitEntity());
551571
if (qPlayer != null && holder != null) {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package de.erethon.aether.events;
2+
3+
import de.erethon.hephaestus.items.HItem;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.Event;
6+
import org.bukkit.event.HandlerList;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
public class MobDeliverItemEvent extends Event {
10+
11+
private static final HandlerList handlers = new HandlerList();
12+
13+
private Player player;
14+
private String mobID;
15+
private HItem item;
16+
private int amount;
17+
18+
public MobDeliverItemEvent(Player player, String mobID, HItem item, int amount) {
19+
this.player = player;
20+
this.mobID = mobID;
21+
this.item = item;
22+
this.amount = amount;
23+
}
24+
25+
public HItem getItem() {
26+
return item;
27+
}
28+
29+
public int getAmount() {
30+
return amount;
31+
}
32+
33+
public void setAmount(int amount) {
34+
this.amount = amount;
35+
}
36+
37+
public Player getPlayer() {
38+
return player;
39+
}
40+
41+
public String getMobID() {
42+
return mobID;
43+
}
44+
45+
@Override
46+
public @NotNull HandlerList getHandlers() {
47+
return handlers;
48+
}
49+
50+
public static HandlerList getHandlerList() {
51+
return handlers;
52+
}
53+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package de.erethon.aether.qxl.objectives;
2+
3+
import de.erethon.aether.events.MobDeliverItemEvent;
4+
import de.erethon.hephaestus.items.HItem;
5+
import de.erethon.questsxl.common.QConfig;
6+
import de.erethon.questsxl.common.QLoadableDoc;
7+
import de.erethon.questsxl.common.QParamDoc;
8+
import de.erethon.questsxl.common.QTranslatable;
9+
import de.erethon.questsxl.objective.ActiveObjective;
10+
import de.erethon.questsxl.objective.QBaseObjective;
11+
import org.bukkit.entity.Player;
12+
13+
@QLoadableDoc(
14+
value = "deliver_item",
15+
description = "Deliver a specific item to a mob to complete this objective.",
16+
shortExample = "deliver_item: item=minecraft:diamond, amount=5",
17+
longExample = {
18+
"deliver_item:",
19+
" item: minecraft:diamond # The item that needs to be delivered.",
20+
" amount: 5 # The amount of the item that needs to be delivered."
21+
}
22+
)
23+
public class DeliverItemObjective extends QBaseObjective<MobDeliverItemEvent> {
24+
25+
@QParamDoc(name = "mob", description = "The ID of the mob to which the item must be delivered.", required = true)
26+
private String mobID;
27+
@QParamDoc(name = "item", description = "The Hephaestus ID of the item that needs to be delivered.", required = true)
28+
private String itemID;
29+
@QParamDoc(name = "amount", description = "The amount of the item that needs to be delivered.", def = "1")
30+
private int amount;
31+
32+
@Override
33+
protected QTranslatable getDefaultDisplayText(Player player) {
34+
return null;
35+
}
36+
37+
@Override
38+
public Class<MobDeliverItemEvent> getEventType() {
39+
return MobDeliverItemEvent.class;
40+
}
41+
42+
@Override
43+
public void check(ActiveObjective activeObjective, MobDeliverItemEvent event) {
44+
if (!conditions(event.getPlayer())) {
45+
return;
46+
}
47+
if (!event.getMobID().equalsIgnoreCase(mobID)) {
48+
return;
49+
}
50+
HItem deliveredItem = event.getItem();
51+
if (deliveredItem.getKey().toString().equalsIgnoreCase(itemID) && event.getAmount() >= amount) {
52+
event.setAmount(event.getAmount() - amount);
53+
checkCompletion(activeObjective, this, getPlayerHolder(event.getPlayer()));
54+
}
55+
}
56+
57+
@Override
58+
public void load(QConfig cfg) {
59+
super.load(cfg);
60+
itemID = cfg.getString("item");
61+
mobID = cfg.getString("mob");
62+
amount = cfg.getInt("amount", 1);
63+
}
64+
}

0 commit comments

Comments
 (0)