Skip to content

Commit

Permalink
Add PlayerUseFoodEvent and implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
KingRainbow44 committed Aug 2, 2022
1 parent 89575f5 commit faeb969
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 22 deletions.
56 changes: 34 additions & 22 deletions src/main/java/emu/grasscutter/game/systems/InventorySystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import emu.grasscutter.game.shop.ShopChestTable;
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
import emu.grasscutter.net.proto.MaterialInfoOuterClass.MaterialInfo;
import emu.grasscutter.server.event.player.PlayerUseFoodEvent;
import emu.grasscutter.server.game.BaseGameSystem;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.*;
Expand Down Expand Up @@ -812,38 +813,49 @@ public GameItem useItem(Player player, long targetGuid, long itemGuid, int count

int used = 0;
boolean useSuccess = false;
ItemData itemData = useItem.getItemData();

// Use
switch (useItem.getItemData().getMaterialType()) {
switch (itemData.getMaterialType()) {
case MATERIAL_FOOD:
if (useItem.getItemData().getUseTarget() == ItemUseTarget.ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR) {
if (itemData.getUseTarget() == ItemUseTarget.ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR) {
if (target == null) {
break;
}

used = player.getTeamManager().reviveAvatar(target) ? 1 : 0;
// Invoke player use food event.
PlayerUseFoodEvent event = new PlayerUseFoodEvent(player, itemData, target.getAsEntity());
// Call the event.
event.call(); if(!event.isCanceled()) {
used = player.getTeamManager().reviveAvatar(target) ? 1 : 0;
}
} else {
used = 1;
}
break;
case MATERIAL_NOTICE_ADD_HP:
if (useItem.getItemData().getUseTarget() == ItemUseTarget.ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR) {
if (itemData.getUseTarget() == ItemUseTarget.ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR) {
if (target == null) {
break;
}

int[] SatiationParams = useItem.getItemData().getSatiationParams();
used = player.getTeamManager().healAvatar(target, SatiationParams[0], SatiationParams[1]) ? 1 : 0;
// Invoke player use food event.
PlayerUseFoodEvent event = new PlayerUseFoodEvent(player, itemData, target.getAsEntity());
// Call the event.
event.call(); if(!event.isCanceled()) {
int[] SatiationParams = itemData.getSatiationParams();
used = player.getTeamManager().healAvatar(target, SatiationParams[0], SatiationParams[1]) ? 1 : 0;
}
}
break;
case MATERIAL_CONSUME:
// Make sure we have usage data for this material.
if (useItem.getItemData().getItemUse() == null) {
if (itemData.getItemUse() == null) {
break;
}
ItemUseOp useOp = useItem.getItemData().getItemUse().get(0).getUseOp();

ItemUseOp useOp = itemData.getItemUse().get(0).getUseOp();

// Unlock item based on use operation
useSuccess = switch (useOp) {
case ITEM_USE_UNLOCK_FORGE -> player.getForgingManager().unlockForgingBlueprint(useItem);
Expand All @@ -854,15 +866,15 @@ public GameItem useItem(Player player, long targetGuid, long itemGuid, int count
break;
case MATERIAL_FURNITURE_FORMULA:
case MATERIAL_FURNITURE_SUITE_FORMULA:
if (useItem.getItemData().getItemUse() == null) {
if (itemData.getItemUse() == null) {
break;
}
useSuccess = player.getFurnitureManager().unlockFurnitureOrSuite(useItem);

break;
case MATERIAL_CONSUME_BATCH_USE:
// Make sure we have usage data for this material.
if (useItem.getItemData().getItemUse() == null) {
if (itemData.getItemUse() == null) {
break;
}

Expand All @@ -889,11 +901,11 @@ public GameItem useItem(Player player, long targetGuid, long itemGuid, int count
}

for (ItemParamData itemParamData : shopChestTable.getContainsItem()) {
ItemData itemData = GameData.getItemDataMap().get(itemParamData.getId());
if (itemData == null) {
ItemData containedItem = GameData.getItemDataMap().get(itemParamData.getId());
if (containedItem == null) {
continue;
}
rewardItemList.add(new GameItem(itemData, itemParamData.getCount()));
rewardItemList.add(new GameItem(containedItem, itemParamData.getCount()));
}

if (!rewardItemList.isEmpty()) {
Expand All @@ -919,12 +931,12 @@ public GameItem useItem(Player player, long targetGuid, long itemGuid, int count
}

int optionItemId = shopChestBatchUseTable.getOptionItem().get(optionId - 1);
ItemData itemData = GameData.getItemDataMap().get(optionItemId);
if (itemData == null) {
ItemData optionItem = GameData.getItemDataMap().get(optionItemId);
if (optionItem == null) {
break;
}

player.getInventory().addItem(new GameItem(itemData, count), ActionReason.Shop);
player.getInventory().addItem(new GameItem(optionItem, count), ActionReason.Shop);

used = count;
break;
Expand All @@ -944,23 +956,23 @@ public GameItem useItem(Player player, long targetGuid, long itemGuid, int count
// we return the item to make UseItemRsp a success.
if (used > 0) {
// Handle use params, mainly server buffs
for (ItemUseData useData : useItem.getItemData().getItemUse()) {
for (ItemUseData useData : itemData.getItemUse()) {
switch (useData.getUseOp()) {
case ITEM_USE_ADD_SERVER_BUFF -> {
int buffId = Integer.parseInt(useData.getUseParam()[0]);
float time = Float.parseFloat(useData.getUseParam()[1]);

player.getBuffManager().addBuff(buffId, time);
}
default -> {}
}
}

// Remove item from inventory since we used it
player.getInventory().removeItem(useItem, used);
return useItem;
}

if (useSuccess) {
return useItem;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package emu.grasscutter.server.event.player;

import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.event.Cancellable;
import emu.grasscutter.server.event.types.PlayerEvent;
import lombok.Getter;
import lombok.Setter;

/**
* This event is invoked when the player uses food on an avatar.
*/
public final class PlayerUseFoodEvent extends PlayerEvent implements Cancellable {
@Getter @Setter private ItemData foodUsed;
@Getter private final EntityAvatar selectedAvatar;

public PlayerUseFoodEvent(Player player, ItemData foodUsed, EntityAvatar selectedAvatar) {
super(player);

this.foodUsed = foodUsed;
this.selectedAvatar = selectedAvatar;
}
}

0 comments on commit faeb969

Please sign in to comment.