Implement a new item drops system (#2112)

* 1

* Delete .gitattributes

* implement

* Update PacketDropHintNotify.java

* Update PacketWorldChestOpenNotify.java

* Update FileUtils.java

* Update PacketDropHintNotify.java

* Update WorldDataSystem.java

---------

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
This commit is contained in:
dragon
2023-04-14 10:28:54 +08:00
committed by GitHub
parent eda5e8c5e0
commit f71b29c00a
21 changed files with 590 additions and 131 deletions

View File

@@ -17,6 +17,7 @@ import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.dungeons.enums.DungeonPassConditionType;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.gadget.GadgetWorktop;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.managers.blossom.BlossomManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.TeamInfo;
@@ -39,11 +40,17 @@ import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.KahnsSort;
import emu.grasscutter.utils.Position;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
@@ -300,12 +307,33 @@ public final class Scene {
player.sendPacket(new PacketSceneEntityAppearNotify(entity));
}
public void addDropEntity(GameItem item, GameEntity bornForm, Player player, boolean share) {
// TODO:optimize EntityItem.java. Maybe we should make other players can't see
// the ItemEntity.
ItemData itemData = GameData.getItemDataMap().get(item.getItemId());
if (itemData == null)
return;
if (itemData.isEquip()) {
float range = (1.5f + (.05f * item.getCount()));
for (int j = 0; j < item.getCount(); j++) {
Position pos = bornForm.getPosition().nearby2d(range).addY(0.5f);
EntityItem entity = new EntityItem(this, player, itemData, pos, item.getCount(), share);
addEntity(entity);
}
} else {
EntityItem entity = new EntityItem(this, player, itemData, bornForm.getPosition().clone().addY(0.5f),
item.getCount(), share);
addEntity(entity);
}
}
public void addEntities(Collection<? extends GameEntity> entities) {
addEntities(entities, VisionType.VISION_TYPE_BORN);
}
public synchronized void addEntities(
Collection<? extends GameEntity> entities, VisionType visionType) {
Collection<? extends GameEntity> entities, VisionType visionType) {
if (entities == null || entities.isEmpty()) {
return;
}
@@ -419,7 +447,10 @@ public final class Scene {
// Reward drop
if (target instanceof EntityMonster && this.getSceneType() != SceneType.SCENE_DUNGEON) {
getWorld().getServer().getDropSystem().callDrop((EntityMonster) target);
if (!getWorld().getServer().getDropSystem().handleMonsterDrop((EntityMonster) target)) {
Grasscutter.getLogger().warn("Can not solve monster drop: drop_id = {} , drop_tag = {}.Fallback to legacy drop system.", ((EntityMonster) target).getMetaMonster().drop_id, ((EntityMonster) target).getMetaMonster().drop_tag);
getWorld().getServer().getDropSystemLegacy().callDrop((EntityMonster) target);
}
}
// Remove entity from world

View File

@@ -57,6 +57,7 @@ public class WorldDataSystem extends BaseGameSystem {
return chestInteractHandlerMap;
}
@Deprecated
public RewardPreviewData getRewardByBossId(int monsterId) {
var investigationMonsterData =
GameData.getInvestigationMonsterDataMap().values().parallelStream()
@@ -92,7 +93,7 @@ public class WorldDataSystem extends BaseGameSystem {
WorldLevelData worldLevelData = GameData.getWorldLevelDataMap().get(world.getWorldLevel());
if (worldLevelData != null) {
level = worldLevelData.getMonsterLevel();
level = Math.max(level, worldLevelData.getMonsterLevel());
}
return level;
}