mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-02-09 05:52:52 +08:00
Add PlayerUseFoodEvent
and implementations
This commit is contained in:
parent
89575f587e
commit
faeb96927a
@ -30,6 +30,7 @@ import emu.grasscutter.game.shop.ShopChestBatchUseTable;
|
|||||||
import emu.grasscutter.game.shop.ShopChestTable;
|
import emu.grasscutter.game.shop.ShopChestTable;
|
||||||
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
|
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
|
||||||
import emu.grasscutter.net.proto.MaterialInfoOuterClass.MaterialInfo;
|
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.BaseGameSystem;
|
||||||
import emu.grasscutter.server.game.GameServer;
|
import emu.grasscutter.server.game.GameServer;
|
||||||
import emu.grasscutter.server.packet.send.*;
|
import emu.grasscutter.server.packet.send.*;
|
||||||
@ -812,38 +813,49 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
|
|
||||||
int used = 0;
|
int used = 0;
|
||||||
boolean useSuccess = false;
|
boolean useSuccess = false;
|
||||||
|
ItemData itemData = useItem.getItemData();
|
||||||
|
|
||||||
// Use
|
// Use
|
||||||
switch (useItem.getItemData().getMaterialType()) {
|
switch (itemData.getMaterialType()) {
|
||||||
case MATERIAL_FOOD:
|
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) {
|
if (target == null) {
|
||||||
break;
|
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 {
|
} else {
|
||||||
used = 1;
|
used = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MATERIAL_NOTICE_ADD_HP:
|
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) {
|
if (target == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int[] SatiationParams = useItem.getItemData().getSatiationParams();
|
// Invoke player use food event.
|
||||||
used = player.getTeamManager().healAvatar(target, SatiationParams[0], SatiationParams[1]) ? 1 : 0;
|
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;
|
break;
|
||||||
case MATERIAL_CONSUME:
|
case MATERIAL_CONSUME:
|
||||||
// Make sure we have usage data for this material.
|
// Make sure we have usage data for this material.
|
||||||
if (useItem.getItemData().getItemUse() == null) {
|
if (itemData.getItemUse() == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemUseOp useOp = useItem.getItemData().getItemUse().get(0).getUseOp();
|
ItemUseOp useOp = itemData.getItemUse().get(0).getUseOp();
|
||||||
|
|
||||||
// Unlock item based on use operation
|
// Unlock item based on use operation
|
||||||
useSuccess = switch (useOp) {
|
useSuccess = switch (useOp) {
|
||||||
case ITEM_USE_UNLOCK_FORGE -> player.getForgingManager().unlockForgingBlueprint(useItem);
|
case ITEM_USE_UNLOCK_FORGE -> player.getForgingManager().unlockForgingBlueprint(useItem);
|
||||||
@ -854,7 +866,7 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
break;
|
break;
|
||||||
case MATERIAL_FURNITURE_FORMULA:
|
case MATERIAL_FURNITURE_FORMULA:
|
||||||
case MATERIAL_FURNITURE_SUITE_FORMULA:
|
case MATERIAL_FURNITURE_SUITE_FORMULA:
|
||||||
if (useItem.getItemData().getItemUse() == null) {
|
if (itemData.getItemUse() == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
useSuccess = player.getFurnitureManager().unlockFurnitureOrSuite(useItem);
|
useSuccess = player.getFurnitureManager().unlockFurnitureOrSuite(useItem);
|
||||||
@ -862,7 +874,7 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
break;
|
break;
|
||||||
case MATERIAL_CONSUME_BATCH_USE:
|
case MATERIAL_CONSUME_BATCH_USE:
|
||||||
// Make sure we have usage data for this material.
|
// Make sure we have usage data for this material.
|
||||||
if (useItem.getItemData().getItemUse() == null) {
|
if (itemData.getItemUse() == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -889,11 +901,11 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (ItemParamData itemParamData : shopChestTable.getContainsItem()) {
|
for (ItemParamData itemParamData : shopChestTable.getContainsItem()) {
|
||||||
ItemData itemData = GameData.getItemDataMap().get(itemParamData.getId());
|
ItemData containedItem = GameData.getItemDataMap().get(itemParamData.getId());
|
||||||
if (itemData == null) {
|
if (containedItem == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
rewardItemList.add(new GameItem(itemData, itemParamData.getCount()));
|
rewardItemList.add(new GameItem(containedItem, itemParamData.getCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rewardItemList.isEmpty()) {
|
if (!rewardItemList.isEmpty()) {
|
||||||
@ -919,12 +931,12 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int optionItemId = shopChestBatchUseTable.getOptionItem().get(optionId - 1);
|
int optionItemId = shopChestBatchUseTable.getOptionItem().get(optionId - 1);
|
||||||
ItemData itemData = GameData.getItemDataMap().get(optionItemId);
|
ItemData optionItem = GameData.getItemDataMap().get(optionItemId);
|
||||||
if (itemData == null) {
|
if (optionItem == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getInventory().addItem(new GameItem(itemData, count), ActionReason.Shop);
|
player.getInventory().addItem(new GameItem(optionItem, count), ActionReason.Shop);
|
||||||
|
|
||||||
used = count;
|
used = count;
|
||||||
break;
|
break;
|
||||||
@ -944,23 +956,23 @@ public class InventorySystem extends BaseGameSystem {
|
|||||||
// we return the item to make UseItemRsp a success.
|
// we return the item to make UseItemRsp a success.
|
||||||
if (used > 0) {
|
if (used > 0) {
|
||||||
// Handle use params, mainly server buffs
|
// Handle use params, mainly server buffs
|
||||||
for (ItemUseData useData : useItem.getItemData().getItemUse()) {
|
for (ItemUseData useData : itemData.getItemUse()) {
|
||||||
switch (useData.getUseOp()) {
|
switch (useData.getUseOp()) {
|
||||||
case ITEM_USE_ADD_SERVER_BUFF -> {
|
case ITEM_USE_ADD_SERVER_BUFF -> {
|
||||||
int buffId = Integer.parseInt(useData.getUseParam()[0]);
|
int buffId = Integer.parseInt(useData.getUseParam()[0]);
|
||||||
float time = Float.parseFloat(useData.getUseParam()[1]);
|
float time = Float.parseFloat(useData.getUseParam()[1]);
|
||||||
|
|
||||||
player.getBuffManager().addBuff(buffId, time);
|
player.getBuffManager().addBuff(buffId, time);
|
||||||
}
|
}
|
||||||
default -> {}
|
default -> {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove item from inventory since we used it
|
// Remove item from inventory since we used it
|
||||||
player.getInventory().removeItem(useItem, used);
|
player.getInventory().removeItem(useItem, used);
|
||||||
return useItem;
|
return useItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useSuccess) {
|
if (useSuccess) {
|
||||||
return useItem;
|
return useItem;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user