Run IntelliJ IDEA code formatter

This commit is contained in:
KingRainbow44
2023-03-31 17:19:26 -04:00
parent 5bf5fb07a2
commit 15e2f3ca34
917 changed files with 30030 additions and 22446 deletions

View File

@@ -7,6 +7,7 @@ import emu.grasscutter.data.binout.SceneNpcBornEntry;
import emu.grasscutter.data.excels.*;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.dungeons.DungeonSettleListener;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.gadget.GadgetWorktop;
import emu.grasscutter.game.managers.blossom.BlossomManager;
@@ -16,7 +17,6 @@ import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.LifeState;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.game.quest.QuestGroupSuite;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass;
@@ -37,28 +37,52 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
public class Scene {
@Getter private final World world;
@Getter private final SceneData sceneData;
@Getter private final List<Player> players;
@Getter private final Map<Integer, GameEntity> entities;
@Getter private final Set<SpawnDataEntry> spawnedEntities;
@Getter private final Set<SpawnDataEntry> deadSpawnedEntities;
@Getter private final Set<SceneBlock> loadedBlocks;
@Getter private final BlossomManager blossomManager;
@Getter
private final World world;
@Getter
private final SceneData sceneData;
@Getter
private final List<Player> players;
@Getter
private final Map<Integer, GameEntity> entities;
@Getter
private final Set<SpawnDataEntry> spawnedEntities;
@Getter
private final Set<SpawnDataEntry> deadSpawnedEntities;
@Getter
private final Set<SceneBlock> loadedBlocks;
@Getter
private final BlossomManager blossomManager;
private Set<SpawnDataEntry.GridBlockId> loadedGridBlocks;
@Getter @Setter private boolean dontDestroyWhenEmpty;
@Getter
@Setter
private boolean dontDestroyWhenEmpty;
@Getter @Setter private int autoCloseTime;
@Getter @Setter private int time;
private long startTime;
@Getter
@Setter
private int autoCloseTime;
@Getter
@Setter
private int time;
private final long startTime;
@Getter private SceneScriptManager scriptManager;
@Getter @Setter private WorldChallenge challenge;
@Getter private List<DungeonSettleListener> dungeonSettleListeners;
@Getter private DungeonData dungeonData;
@Getter @Setter private int prevScene; // Id of the previous scene
@Getter @Setter private int prevScenePoint;
@Getter
private final SceneScriptManager scriptManager;
@Getter
@Setter
private WorldChallenge challenge;
@Getter
private List<DungeonSettleListener> dungeonSettleListeners;
@Getter
private DungeonData dungeonData;
@Getter
@Setter
private int prevScene; // Id of the previous scene
@Getter
@Setter
private int prevScenePoint;
private Set<SceneNpcBornEntry> npcBornEntrySet;
public Scene(World world, SceneData sceneData) {
this.world = world;
this.sceneData = sceneData;
@@ -96,9 +120,9 @@ public class Scene {
public GameEntity getEntityByConfigId(int configId) {
return this.entities.values().stream()
.filter(x -> x.getConfigId() == configId)
.findFirst()
.orElse(null);
.filter(x -> x.getConfigId() == configId)
.findFirst()
.orElse(null);
}
public void changeTime(int time) {
@@ -225,6 +249,7 @@ public class Scene {
player.sendPacket(new PacketSceneEntityAppearNotify(entity));
}
public void addEntities(Collection<? extends GameEntity> entities) {
addEntities(entities, VisionType.VISION_TYPE_BORN);
}
@@ -258,14 +283,16 @@ public class Scene {
this.broadcastPacket(new PacketSceneEntityDisappearNotify(removed, visionType));
}
}
public synchronized void removeEntities(List<GameEntity> entity, VisionType visionType) {
var toRemove = entity.stream()
.map(this::removeEntityDirectly)
.toList();
.map(this::removeEntityDirectly)
.toList();
if (toRemove.size() > 0) {
this.broadcastPacket(new PacketSceneEntityDisappearNotify(toRemove, visionType));
}
}
public synchronized void replaceEntity(EntityAvatar oldEntity, EntityAvatar newEntity) {
this.removeEntityDirectly(oldEntity);
this.addEntityDirectly(newEntity);
@@ -367,6 +394,7 @@ public class Scene {
return level;
}
public void checkNpcGroup() {
Set<SceneNpcBornEntry> npcBornEntries = ConcurrentHashMap.newKeySet();
for (Player player : this.getPlayers()) {
@@ -390,8 +418,7 @@ public class Scene {
public synchronized void checkSpawns() {
Set<SpawnDataEntry.GridBlockId> loadedGridBlocks = new HashSet<>();
for (Player player : this.getPlayers()) {
for (SpawnDataEntry.GridBlockId block : SpawnDataEntry.GridBlockId.getAdjacentGridBlockIds(player.getSceneId(), player.getPosition()))
loadedGridBlocks.add(block);
Collections.addAll(loadedGridBlocks, SpawnDataEntry.GridBlockId.getAdjacentGridBlockIds(player.getSceneId(), player.getPosition()));
}
if (this.loadedGridBlocks.containsAll(loadedGridBlocks)) { // Don't recalculate static spawns if nothing has changed
return;
@@ -401,7 +428,7 @@ public class Scene {
Set<SpawnDataEntry> visible = new HashSet<>();
for (var block : loadedGridBlocks) {
var spawns = spawnLists.get(block);
if (spawns!=null) {
if (spawns != null) {
visible.addAll(spawns);
}
}
@@ -445,7 +472,7 @@ public class Scene {
gadget.setConfigId(entry.getConfigId());
gadget.setSpawnEntry(entry);
int state = entry.getGadgetState();
if (state>0) {
if (state > 0) {
gadget.setState(state);
}
gadget.buildContent();
@@ -488,7 +515,7 @@ public class Scene {
public List<SceneBlock> getPlayerActiveBlocks(Player player) {
// consider the borders' entities of blocks, so we check if contains by index
return SceneIndexManager.queryNeighbors(getScriptManager().getBlocksIndex(),
player.getPosition().toXZDoubleArray(), Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
player.getPosition().toXZDoubleArray(), Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
}
private boolean unloadBlockIfNotVisible(Collection<SceneBlock> visible, SceneBlock block) {
@@ -526,12 +553,12 @@ public class Scene {
public List<SceneGroup> playerMeetGroups(Player player, SceneBlock block) {
List<SceneGroup> sceneGroups = SceneIndexManager.queryNeighbors(block.sceneGroupIndex, player.getPosition().toDoubleArray(),
Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
List<SceneGroup> groups = sceneGroups.stream()
.filter(group -> !scriptManager.getLoadedGroupSetPerBlock().get(block.id).contains(group))
.peek(group -> scriptManager.getLoadedGroupSetPerBlock().get(block.id).add(group))
.toList();
.filter(group -> !scriptManager.getLoadedGroupSetPerBlock().get(block.id).contains(group))
.peek(group -> scriptManager.getLoadedGroupSetPerBlock().get(block.id).add(group))
.toList();
if (groups.size() == 0) {
return List.of();
@@ -539,20 +566,22 @@ public class Scene {
return groups;
}
public void onLoadBlock(SceneBlock block, List<Player> players) {
this.getScriptManager().loadBlockFromScript(block);
scriptManager.getLoadedGroupSetPerBlock().put(block.id , new HashSet<>());
scriptManager.getLoadedGroupSetPerBlock().put(block.id, new HashSet<>());
// the groups form here is not added in current scene
var groups = players.stream()
.filter(player -> block.contains(player.getPosition()))
.map(p -> playerMeetGroups(p, block))
.flatMap(Collection::stream)
.toList();
.filter(player -> block.contains(player.getPosition()))
.map(p -> playerMeetGroups(p, block))
.flatMap(Collection::stream)
.toList();
onLoadGroup(groups);
Grasscutter.getLogger().info("Scene {} Block {} loaded.", this.getId(), block.id);
}
public void loadTriggerFromGroup(SceneGroup group, String triggerName) {
//Load triggers and regions
getScriptManager().registerTrigger(group.triggers.values().stream().filter(p -> p.name.contains(triggerName)).toList());
@@ -582,8 +611,8 @@ public class Scene {
if (garbageGadgets != null) {
entities.addAll(garbageGadgets.stream().map(g -> scriptManager.createGadget(group.id, group.block_id, g))
.filter(Objects::nonNull)
.toList());
.filter(Objects::nonNull)
.toList());
}
// Load suites
@@ -611,7 +640,7 @@ public class Scene {
public void onUnloadBlock(SceneBlock block) {
List<GameEntity> toRemove = this.getEntities().values().stream()
.filter(e -> e.getBlockId() == block.id).toList();
.filter(e -> e.getBlockId() == block.id).toList();
if (toRemove.size() > 0) {
toRemove.forEach(this::removeEntityDirectly);
@@ -649,12 +678,11 @@ public class Scene {
public void onPlayerDestroyGadget(int entityId) {
GameEntity entity = getEntities().get(entityId);
if (entity == null || !(entity instanceof EntityClientGadget)) {
if (entity == null || !(entity instanceof EntityClientGadget gadget)) {
return;
}
// Get and remove entity
EntityClientGadget gadget = (EntityClientGadget) entity;
this.removeEntityDirectly(gadget);
// Remove from owner's gadget list
@@ -709,9 +737,11 @@ public class Scene {
addEntity(entity);
}
}
public void loadNpcForPlayerEnter(Player player) {
this.npcBornEntrySet.addAll(loadNpcForPlayer(player));
}
private List<SceneNpcBornEntry> loadNpcForPlayer(Player player) {
var pos = player.getPosition();
var data = GameData.getSceneNpcBornData().get(getId());
@@ -720,7 +750,7 @@ public class Scene {
}
var npcList = SceneIndexManager.queryNeighbors(data.getIndex(), pos.toDoubleArray(),
Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
var sceneNpcBornEntries = npcList.stream()
.filter(i -> !this.npcBornEntrySet.contains(i))

View File

@@ -1,45 +1,65 @@
package emu.grasscutter.game.world;
import java.util.List;
import java.util.Objects;
import emu.grasscutter.data.GameDepot;
import emu.grasscutter.utils.Position;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Objects;
public class SpawnDataEntry {
@Getter @Setter private transient SpawnGroupEntry group;
@Getter private int monsterId;
@Getter private int gadgetId;
@Getter private int configId;
@Getter private int level;
@Getter private int poseId;
@Getter private int gatherItemId;
@Getter private int gadgetState;
@Getter private Position pos;
@Getter private Position rot;
@Getter
@Setter
private transient SpawnGroupEntry group;
@Getter
private int monsterId;
@Getter
private int gadgetId;
@Getter
private int configId;
@Getter
private int level;
@Getter
private int poseId;
@Getter
private int gatherItemId;
@Getter
private int gadgetState;
@Getter
private Position pos;
@Getter
private Position rot;
public GridBlockId getBlockId() {
int scale = GridBlockId.getScale(gadgetId);
return new GridBlockId(group.sceneId,scale,
(int)(pos.getX() / GameDepot.BLOCK_SIZE[scale]),
(int)(pos.getZ() / GameDepot.BLOCK_SIZE[scale])
return new GridBlockId(group.sceneId, scale,
(int) (pos.getX() / GameDepot.BLOCK_SIZE[scale]),
(int) (pos.getZ() / GameDepot.BLOCK_SIZE[scale])
);
}
public static class SpawnGroupEntry {
@Getter private int sceneId;
@Getter private int groupId;
@Getter private int blockId;
@Getter @Setter private List<SpawnDataEntry> spawns;
@Getter
private int sceneId;
@Getter
private int groupId;
@Getter
private int blockId;
@Getter
@Setter
private List<SpawnDataEntry> spawns;
}
public static class GridBlockId {
@Getter private int sceneId;
@Getter private int scale;
@Getter private int x;
@Getter private int z;
@Getter
private final int sceneId;
@Getter
private final int scale;
@Getter
private final int x;
@Getter
private final int z;
public GridBlockId(int sceneId, int scale, int x, int z) {
this.sceneId = sceneId;
@@ -48,6 +68,25 @@ public class SpawnDataEntry {
this.z = z;
}
public static GridBlockId[] getAdjacentGridBlockIds(int sceneId, Position pos) {
GridBlockId[] results = new GridBlockId[5 * 5 * GameDepot.BLOCK_SIZE.length];
int t = 0;
for (int scale = 0; scale < GameDepot.BLOCK_SIZE.length; scale++) {
int x = ((int) (pos.getX() / GameDepot.BLOCK_SIZE[scale]));
int z = ((int) (pos.getZ() / GameDepot.BLOCK_SIZE[scale]));
for (int i = x - 2; i < x + 3; i++) {
for (int j = z - 2; j < z + 3; j++) {
results[t++] = new GridBlockId(sceneId, scale, i, j);
}
}
}
return results;
}
public static int getScale(int gadgetId) {
return 0;//you should implement here,this is index of GameDepot.BLOCK_SIZE
}
@Override
public String toString() {
return "SpawnDataEntryScaledPoint{" +
@@ -70,24 +109,5 @@ public class SpawnDataEntry {
public int hashCode() {
return Objects.hash(sceneId, scale, x, z);
}
public static GridBlockId[] getAdjacentGridBlockIds(int sceneId, Position pos) {
GridBlockId[] results = new GridBlockId[5*5*GameDepot.BLOCK_SIZE.length];
int t=0;
for (int scale = 0; scale < GameDepot.BLOCK_SIZE.length; scale++) {
int x = ((int)(pos.getX()/GameDepot.BLOCK_SIZE[scale]));
int z = ((int)(pos.getZ()/GameDepot.BLOCK_SIZE[scale]));
for (int i=x-2; i<x+3; i++) {
for (int j=z-2; j<z+3; j++) {
results[t++] = new GridBlockId(sceneId, scale, i, j);
}
}
}
return results;
}
public static int getScale(int gadgetId) {
return 0;//you should implement here,this is index of GameDepot.BLOCK_SIZE
}
}
}

View File

@@ -1,49 +1,43 @@
package emu.grasscutter.game.world;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.DungeonData;
import emu.grasscutter.data.excels.SceneData;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.Player.SceneLoadState;
import emu.grasscutter.game.props.EnterReason;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
import emu.grasscutter.scripts.data.SceneConfig;
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.Position;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.Player.SceneLoadState;
import emu.grasscutter.game.props.EnterReason;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.DungeonData;
import emu.grasscutter.data.excels.SceneData;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
import emu.grasscutter.scripts.data.SceneConfig;
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.PacketDelTeamEntityNotify;
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify;
import emu.grasscutter.server.packet.send.PacketScenePlayerInfoNotify;
import emu.grasscutter.server.packet.send.PacketSyncScenePlayTeamEntityNotify;
import emu.grasscutter.server.packet.send.PacketSyncTeamEntityNotify;
import emu.grasscutter.server.packet.send.PacketWorldPlayerInfoNotify;
import emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify;
import emu.grasscutter.utils.Position;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public class World implements Iterable<Player> {
private final GameServer server;
private final Player owner;
private final List<Player> players;
private final Int2ObjectMap<Scene> scenes;
private int levelEntityId;
private final int levelEntityId;
private int nextEntityId = 0;
private int nextPeerId = 0;
private int worldLevel;
private boolean isMultiplayer;
private final boolean isMultiplayer;
public World(Player player) {
this(player, false);
@@ -169,10 +163,10 @@ public class World implements Iterable<Player> {
public synchronized void removePlayer(Player player) {
// Remove team entities
player.sendPacket(
new PacketDelTeamEntityNotify(
player.getSceneId(),
this.getPlayers().stream().map(p -> p.getTeamManager().getEntityId()).collect(Collectors.toList())
)
new PacketDelTeamEntityNotify(
player.getSceneId(),
this.getPlayers().stream().map(p -> p.getTeamManager().getEntityId()).collect(Collectors.toList())
)
);
// Deregister
@@ -224,7 +218,8 @@ public class World implements Iterable<Player> {
// Call player teleport event.
PlayerTeleportEvent event = new PlayerTeleportEvent(player, teleportType, player.getPosition(), teleportTo);
// Call event & check if it was canceled.
event.call(); if (event.isCanceled()) {
event.call();
if (event.isCanceled()) {
return false; // Teleport was canceled.
}
@@ -310,7 +305,7 @@ public class World implements Iterable<Player> {
}
// Dont send packets if player is loading into the scene
if (player.getSceneLoadState().getValue() < SceneLoadState.INIT.getValue() ) {
if (player.getSceneLoadState().getValue() < SceneLoadState.INIT.getValue()) {
// World player info packets
player.getSession().send(new PacketWorldPlayerInfoNotify(this));
player.getSession().send(new PacketScenePlayerInfoNotify(this));

View File

@@ -54,9 +54,9 @@ public class WorldDataSystem extends BaseGameSystem {
public RewardPreviewData getRewardByBossId(int monsterId) {
var investigationMonsterData = GameData.getInvestigationMonsterDataMap().values().parallelStream()
.filter(imd -> imd.getMonsterIdList() != null && !imd.getMonsterIdList().isEmpty())
.filter(imd -> imd.getMonsterIdList().get(0) == monsterId)
.findFirst();
.filter(imd -> imd.getMonsterIdList() != null && !imd.getMonsterIdList().isEmpty())
.filter(imd -> imd.getMonsterIdList().get(0) == monsterId)
.findFirst();
if (investigationMonsterData.isEmpty()) {
return null;
@@ -84,6 +84,7 @@ public class WorldDataSystem extends BaseGameSystem {
}
return level;
}
private InvestigationMonsterOuterClass.InvestigationMonster getInvestigationMonster(Player player, InvestigationMonsterData imd) {
if (imd.getGroupIdList().isEmpty() || imd.getMonsterIdList().isEmpty()) {
return null;
@@ -99,8 +100,8 @@ public class WorldDataSystem extends BaseGameSystem {
}
var monster = group.monsters.values().stream()
.filter(x -> x.monster_id == monsterId)
.findFirst();
.filter(x -> x.monster_id == monsterId)
.findFirst();
if (monster.isEmpty()) {
return null;
}
@@ -108,15 +109,15 @@ public class WorldDataSystem extends BaseGameSystem {
var builder = InvestigationMonsterOuterClass.InvestigationMonster.newBuilder();
builder.setId(imd.getId())
.setCityId(imd.getCityId())
.setSceneId(imd.getCityData().getSceneId())
.setGroupId(groupId)
.setMonsterId(monsterId)
.setLevel(getMonsterLevel(monster.get(), player.getWorld()))
.setIsAlive(true)
.setNextRefreshTime(Integer.MAX_VALUE)
.setRefreshInterval(Integer.MAX_VALUE)
.setPos(monster.get().pos.toProto());
.setCityId(imd.getCityId())
.setSceneId(imd.getCityData().getSceneId())
.setGroupId(groupId)
.setMonsterId(monsterId)
.setLevel(getMonsterLevel(monster.get(), player.getWorld()))
.setIsAlive(true)
.setNextRefreshTime(Integer.MAX_VALUE)
.setRefreshInterval(Integer.MAX_VALUE)
.setPos(monster.get().pos.toProto());
if ("Boss".equals(imd.getMonsterCategory())) {
var bossChest = group.searchBossChestInGroup();
@@ -136,11 +137,11 @@ public class WorldDataSystem extends BaseGameSystem {
}
return GameData.getInvestigationMonsterDataMap().values()
.parallelStream()
.filter(imd -> imd.getCityId() == cityId)
.map(imd -> this.getInvestigationMonster(player, imd))
.filter(Objects::nonNull)
.toList();
.parallelStream()
.filter(imd -> imd.getCityId() == cityId)
.map(imd -> this.getInvestigationMonster(player, imd))
.filter(Objects::nonNull)
.toList();
}
}