Commit 2e19e70f authored by Melledy's avatar Melledy
Browse files

Refactor game server managers to systems

parent d20e9d1f
......@@ -153,7 +153,7 @@ public class QuestManager extends BasePlayerManager {
continue;
}
boolean result = getPlayer().getServer().getQuestHandler().triggerContent(quest, condition, paramStr, params);
boolean result = getPlayer().getServer().getQuestSystem().triggerContent(quest, condition, paramStr, params);
if (result) {
quest.getFinishProgressList()[i] = 1;
......
......@@ -4,6 +4,9 @@ import java.util.Set;
import emu.grasscutter.data.excels.QuestData;
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
import emu.grasscutter.server.game.BaseGameSystem;
import emu.grasscutter.server.game.GameServer;
import org.reflections.Reflections;
import emu.grasscutter.Grasscutter;
......@@ -13,12 +16,14 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@SuppressWarnings("unchecked")
public class ServerQuestHandler {
public class QuestSystem extends BaseGameSystem {
private final Int2ObjectMap<QuestBaseHandler> condHandlers;
private final Int2ObjectMap<QuestBaseHandler> contHandlers;
private final Int2ObjectMap<QuestExecHandler> execHandlers;
public ServerQuestHandler() {
public QuestSystem(GameServer server) {
super(server);
this.condHandlers = new Int2ObjectOpenHashMap<>();
this.contHandlers = new Int2ObjectOpenHashMap<>();
this.execHandlers = new Int2ObjectOpenHashMap<>();
......
......@@ -6,6 +6,7 @@ import emu.grasscutter.data.DataLoader;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.data.excels.ShopGoodsData;
import emu.grasscutter.server.game.BaseGameSystem;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.utils.Utils;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
......@@ -21,35 +22,33 @@ import java.util.List;
import static emu.grasscutter.Configuration.*;
public class ShopManager {
private final GameServer server;
public Int2ObjectMap<List<ShopInfo>> getShopData() {
return shopData;
}
public List<ShopChestTable> getShopChestData() {
return shopChestData;
}
public List<ShopChestBatchUseTable> getShopChestBatchUseData() {
return shopChestBatchUseData;
}
public class ShopSystem extends BaseGameSystem {
private final Int2ObjectMap<List<ShopInfo>> shopData;
private final List<ShopChestTable> shopChestData;
private final List<ShopChestBatchUseTable> shopChestBatchUseData;
private static final int REFRESH_HOUR = 4; // In GMT+8 server
private static final String TIME_ZONE = "Asia/Shanghai"; // GMT+8 Timezone
public ShopManager(GameServer server) {
this.server = server;
public ShopSystem(GameServer server) {
super(server);
this.shopData = new Int2ObjectOpenHashMap<>();
this.shopChestData = new ArrayList<>();
this.shopChestBatchUseData = new ArrayList<>();
this.load();
}
public Int2ObjectMap<List<ShopInfo>> getShopData() {
return shopData;
}
public List<ShopChestTable> getShopChestData() {
return shopChestData;
}
private static final int REFRESH_HOUR = 4; // In GMT+8 server
private static final String TIME_ZONE = "Asia/Shanghai"; // GMT+8 Timezone
public List<ShopChestBatchUseTable> getShopChestBatchUseData() {
return shopChestBatchUseData;
}
public static int getShopNextRefreshTime(ShopInfo shopInfo) {
return switch (shopInfo.getShopRefreshType()) {
......
......@@ -74,7 +74,7 @@ public class TowerManager extends BasePlayerManager {
notifyCurLevelRecordChange();
// use team user choose
player.getTeamManager().useTemporaryTeam(0);
player.getServer().getDungeonManager().handoffDungeon(player, dungeonId,
player.getServer().getDungeonSystem().handoffDungeon(player, dungeonId,
towerDungeonSettleListener);
// make sure user can exit dungeon correctly
......@@ -116,10 +116,10 @@ public class TowerManager extends BasePlayerManager {
return getTowerData().currentLevel < 3;
}
public int getNextFloorId() {
return player.getServer().getTowerScheduleManager().getNextFloorId(getTowerData().currentFloorId);
return player.getServer().getTowerSystem().getNextFloorId(getTowerData().currentFloorId);
}
public boolean hasNextFloor(){
return player.getServer().getTowerScheduleManager().getNextFloorId(getTowerData().currentFloorId) > 0;
return player.getServer().getTowerSystem().getNextFloorId(getTowerData().currentFloorId) > 0;
}
public void clearEntry() {
......@@ -128,10 +128,10 @@ public class TowerManager extends BasePlayerManager {
public boolean canEnterScheduleFloor(){
Map<Integer, TowerLevelRecord> recordMap = getRecordMap();
if(!recordMap.containsKey(player.getServer().getTowerScheduleManager().getLastEntranceFloor())){
if(!recordMap.containsKey(player.getServer().getTowerSystem().getLastEntranceFloor())){
return false;
}
return recordMap.get(player.getServer().getTowerScheduleManager().getLastEntranceFloor())
return recordMap.get(player.getServer().getTowerSystem().getLastEntranceFloor())
.getStarCount() >= 6;
}
......
......@@ -4,6 +4,7 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.DataLoader;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.TowerScheduleData;
import emu.grasscutter.server.game.BaseGameSystem;
import emu.grasscutter.server.game.GameServer;
import java.io.FileReader;
......@@ -14,15 +15,10 @@ import java.util.List;
import static emu.grasscutter.Configuration.*;
public class TowerScheduleManager {
private final GameServer gameServer;
public GameServer getGameServer() {
return gameServer;
}
public TowerScheduleManager(GameServer gameServer) {
this.gameServer = gameServer;
public class TowerSystem extends BaseGameSystem {
public TowerSystem(GameServer server) {
super(server);
this.load();
}
......
......@@ -399,7 +399,7 @@ public class Scene {
// Reward drop
if (target instanceof EntityMonster && this.getSceneType() != SceneType.SCENE_DUNGEON) {
getWorld().getServer().getDropManager().callDrop((EntityMonster) target);
getWorld().getServer().getDropSystem().callDrop((EntityMonster) target);
}
this.removeEntity(target);
......
......@@ -14,6 +14,7 @@ import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.proto.InvestigationMonsterOuterClass;
import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.SceneMonster;
import emu.grasscutter.server.game.BaseGameSystem;
import emu.grasscutter.server.game.GameServer;
import java.io.InputStream;
......@@ -24,13 +25,12 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
public class WorldDataManager {
private final GameServer gameServer;
public class WorldDataSystem extends BaseGameSystem {
private final Map<String, ChestInteractHandler> chestInteractHandlerMap; // chestType-Handler
private final Map<String, SceneGroup> sceneInvestigationGroupMap; // <sceneId_groupId, Group>
public WorldDataManager(GameServer gameServer){
this.gameServer = gameServer;
public WorldDataSystem(GameServer server){
super(server);
this.chestInteractHandlerMap = new HashMap<>();
this.sceneInvestigationGroupMap = new ConcurrentHashMap<>();
......
package emu.grasscutter.server.game;
public abstract class BaseGameSystem {
protected final GameServer server;
public BaseGameSystem(GameServer server) {
this.server = server;
}
public GameServer getServer() {
return this.server;
}
}
......@@ -5,27 +5,27 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.CommandMap;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.battlepass.BattlePassMissionManager;
import emu.grasscutter.game.battlepass.BattlePassSystem;
import emu.grasscutter.game.combine.CombineManger;
import emu.grasscutter.game.drop.DropManager;
import emu.grasscutter.game.dungeons.DungeonManager;
import emu.grasscutter.game.drop.DropSystem;
import emu.grasscutter.game.dungeons.DungeonSystem;
import emu.grasscutter.game.dungeons.challenge.DungeonChallenge;
import emu.grasscutter.game.expedition.ExpeditionManager;
import emu.grasscutter.game.gacha.GachaManager;
import emu.grasscutter.game.managers.AnnouncementManager;
import emu.grasscutter.game.expedition.ExpeditionSystem;
import emu.grasscutter.game.gacha.GachaSystem;
import emu.grasscutter.game.managers.AnnouncementSystem;
import emu.grasscutter.game.managers.CookingManager;
import emu.grasscutter.game.managers.InventoryManager;
import emu.grasscutter.game.managers.MultiplayerManager;
import emu.grasscutter.game.managers.InventorySystem;
import emu.grasscutter.game.managers.MultiplayerSystem;
import emu.grasscutter.game.managers.chat.ChatManager;
import emu.grasscutter.game.managers.chat.ChatManagerHandler;
import emu.grasscutter.game.managers.energy.EnergyManager;
import emu.grasscutter.game.managers.stamina.StaminaManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.quest.ServerQuestHandler;
import emu.grasscutter.game.shop.ShopManager;
import emu.grasscutter.game.tower.TowerScheduleManager;
import emu.grasscutter.game.quest.QuestSystem;
import emu.grasscutter.game.shop.ShopSystem;
import emu.grasscutter.game.tower.TowerSystem;
import emu.grasscutter.game.world.World;
import emu.grasscutter.game.world.WorldDataManager;
import emu.grasscutter.game.world.WorldDataSystem;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
import emu.grasscutter.server.event.types.ServerEvent;
......@@ -47,30 +47,35 @@ import java.util.concurrent.ConcurrentHashMap;
import static emu.grasscutter.utils.Language.translate;
import static emu.grasscutter.Configuration.*;
@Getter
public final class GameServer extends KcpServer {
private final InetSocketAddress address;
// Game server base
private final InetSocketAddress address;
private final GameServerPacketHandler packetHandler;
private final ServerQuestHandler questHandler;
@Getter private final ServerTaskScheduler scheduler;
private final Map<Integer, Player> players;
private final Set<World> worlds;
private final Map<Integer, Player> players;
private final Set<World> worlds;
// Server systems
private final InventorySystem inventorySystem;
private final GachaSystem gachaSystem;
private final ShopSystem shopSystem;
private final MultiplayerSystem multiplayerSystem;
private final DungeonSystem dungeonSystem;
private final ExpeditionSystem expeditionSystem;
private final DropSystem dropSystem;
private final WorldDataSystem worldDataSystem;
private final BattlePassSystem battlePassSystem;
private final CombineManger combineSystem;
private final TowerSystem towerSystem;
private final AnnouncementSystem announcementSystem;
private final QuestSystem questSystem;
// Extra
private final ServerTaskScheduler scheduler;
private final CommandMap commandMap;
private final TaskMap taskMap;
private ChatManagerHandler chatManager;
@Getter private final InventoryManager inventoryManager;
@Getter private final GachaManager gachaManager;
@Getter private final ShopManager shopManager;
@Getter private final MultiplayerManager multiplayerManager;
@Getter private final DungeonManager dungeonManager;
@Getter private final ExpeditionManager expeditionManager;
@Getter private final CommandMap commandMap;
@Getter private final TaskMap taskMap;
@Getter private final DropManager dropManager;
@Getter private final WorldDataManager worldDataManager;
@Getter private final BattlePassMissionManager battlePassMissionManager;
@Getter private final CombineManger combineManger;
@Getter private final TowerScheduleManager towerScheduleManager;
@Getter private final AnnouncementManager announcementManager;
public GameServer() {
this(getAdapterInetSocketAddress());
......@@ -78,11 +83,11 @@ public final class GameServer extends KcpServer {
public GameServer(InetSocketAddress address) {
ChannelConfig channelConfig = new ChannelConfig();
channelConfig.nodelay(true,40,2,true);
channelConfig.nodelay(true, 40, 2, true);
channelConfig.setMtu(1400);
channelConfig.setSndwnd(256);
channelConfig.setRcvwnd(256);
channelConfig.setTimeoutMillis(30*1000);//30s
channelConfig.setTimeoutMillis(30 * 1000);//30s
channelConfig.setUseConvChannel(true);
channelConfig.setAckNoDelay(false);
......@@ -94,56 +99,56 @@ public final class GameServer extends KcpServer {
CookingManager.initialize();
CombineManger.initialize();
// Game Server base
this.address = address;
this.packetHandler = new GameServerPacketHandler(PacketHandler.class);
this.questHandler = new ServerQuestHandler();
this.scheduler = new ServerTaskScheduler();
this.players = new ConcurrentHashMap<>();
this.worlds = Collections.synchronizedSet(new HashSet<>());
this.chatManager = new ChatManager(this);
this.inventoryManager = new InventoryManager(this);
this.gachaManager = new GachaManager(this);
this.shopManager = new ShopManager(this);
this.multiplayerManager = new MultiplayerManager(this);
this.dungeonManager = new DungeonManager(this);
// Extra
this.scheduler = new ServerTaskScheduler();
this.commandMap = new CommandMap(true);
this.taskMap = new TaskMap(true);
this.dropManager = new DropManager(this);
this.expeditionManager = new ExpeditionManager(this);
this.combineManger = new CombineManger(this);
this.towerScheduleManager = new TowerScheduleManager(this);
this.worldDataManager = new WorldDataManager(this);
this.battlePassMissionManager = new BattlePassMissionManager(this);
this.announcementManager = new AnnouncementManager(this);
this.taskMap = new TaskMap(true);
// Create game systems
this.inventorySystem = new InventorySystem(this);
this.gachaSystem = new GachaSystem(this);
this.shopSystem = new ShopSystem(this);
this.multiplayerSystem = new MultiplayerSystem(this);
this.dungeonSystem = new DungeonSystem(this);
this.dropSystem = new DropSystem(this);
this.expeditionSystem = new ExpeditionSystem(this);
this.combineSystem = new CombineManger(this);
this.towerSystem = new TowerSystem(this);
this.worldDataSystem = new WorldDataSystem(this);
this.battlePassSystem = new BattlePassSystem(this);
this.announcementSystem = new AnnouncementSystem(this);
this.questSystem = new QuestSystem(this);
// Chata manager
this.chatManager = new ChatManager(this);
// Hook into shutdown event.
Runtime.getRuntime().addShutdownHook(new Thread(this::onServerShutdown));
}
@Deprecated
public ChatManagerHandler getChatManager() {
return chatManager;
}
@Deprecated
public void setChatManager(ChatManagerHandler chatManager) {
this.chatManager = chatManager;
}
public ChatManagerHandler getChatSystem() {
return chatManager;
}
public GameServerPacketHandler getPacketHandler() {
return packetHandler;
}
public ServerQuestHandler getQuestHandler() {
return questHandler;
}
public Map<Integer, Player> getPlayers() {
return players;
}
public Set<World> getWorlds() {
return worlds;
}
public ChatManagerHandler getChatManager() {
return chatManager;
}
public void setChatManager(ChatManagerHandler chatManager) {
this.chatManager = chatManager;
}
public void setChatSystem(ChatManagerHandler chatManager) {
this.chatManager = chatManager;
}
private static InetSocketAddress getAdapterInetSocketAddress(){
InetSocketAddress inetSocketAddress;
......
......@@ -4,7 +4,7 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.gacha.GachaBanner;
import emu.grasscutter.game.gacha.GachaManager;
import emu.grasscutter.game.gacha.GachaSystem;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.http.Router;
import emu.grasscutter.tools.Tools;
......@@ -108,7 +108,7 @@ public final class GachaHandler implements Router {
// Get the banner info for the banner we want.
int scheduleId = Integer.parseInt(request.query("scheduleId"));
GachaManager manager = Grasscutter.getGameServer().getGachaManager();
GachaSystem manager = Grasscutter.getGameServer().getGachaSystem();
GachaBanner banner = manager.getGachaBanners().get(scheduleId);
// Add 5-star items.
......
......@@ -34,8 +34,8 @@ public class HandlerAvatarExpeditionGetRewardReq extends PacketHandler {
List<GameItem> items = new LinkedList<>();
if (session.getServer().getExpeditionManager().getExpeditionRewardDataList().containsKey(expInfo.getExpId())) {
for (ExpeditionRewardDataList RewardDataList : session.getServer().getExpeditionManager().getExpeditionRewardDataList().get(expInfo.getExpId())) {
if (session.getServer().getExpeditionSystem().getExpeditionRewardDataList().containsKey(expInfo.getExpId())) {
for (ExpeditionRewardDataList RewardDataList : session.getServer().getExpeditionSystem().getExpeditionRewardDataList().get(expInfo.getExpId())) {
if(RewardDataList.getHourTime() == expInfo.getHourTime()){
if(!RewardDataList.getExpeditionRewardData().isEmpty()){
for (ExpeditionRewardData RewardData :RewardDataList.getExpeditionRewardData()) {
......
......@@ -14,7 +14,7 @@ public class HandlerAvatarPromoteReq extends PacketHandler {
AvatarPromoteReq req = AvatarPromoteReq.parseFrom(payload);
// Ascend avatar
session.getServer().getInventoryManager().promoteAvatar(session.getPlayer(), req.getGuid());
session.getServer().getInventorySystem().promoteAvatar(session.getPlayer(), req.getGuid());
}
}
......@@ -14,7 +14,7 @@ public class HandlerAvatarSkillUpgradeReq extends PacketHandler {
AvatarSkillUpgradeReq req = AvatarSkillUpgradeReq.parseFrom(payload);
// Level up avatar talent
session.getServer().getInventoryManager().upgradeAvatarSkill(session.getPlayer(), req.getAvatarGuid(), req.getAvatarSkillId());
session.getServer().getInventorySystem().upgradeAvatarSkill(session.getPlayer(), req.getAvatarGuid(), req.getAvatarSkillId());
}
}
......@@ -14,7 +14,7 @@ public class HandlerAvatarUpgradeReq extends PacketHandler {
AvatarUpgradeReq req = AvatarUpgradeReq.parseFrom(payload);
// Level up avatar
session.getServer().getInventoryManager().upgradeAvatar(
session.getServer().getInventorySystem().upgradeAvatar(
session.getPlayer(),
req.getAvatarGuid(),
req.getItemId(),
......
......@@ -6,7 +6,7 @@ import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.shop.ShopInfo;
import emu.grasscutter.game.shop.ShopLimit;
import emu.grasscutter.game.shop.ShopManager;
import emu.grasscutter.game.shop.ShopSystem;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
......@@ -29,7 +29,7 @@ public class HandlerBuyGoodsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
BuyGoodsReqOuterClass.BuyGoodsReq buyGoodsReq = BuyGoodsReqOuterClass.BuyGoodsReq.parseFrom(payload);
List<ShopInfo> configShop = session.getServer().getShopManager().getShopData().get(buyGoodsReq.getShopType());
List<ShopInfo> configShop = session.getServer().getShopSystem().getShopData().get(buyGoodsReq.getShopType());
if (configShop == null)
return;
......@@ -46,7 +46,7 @@ public class HandlerBuyGoodsReq extends PacketHandler {
int bought = 0;
if (shopLimit != null) {
if (currentTs > shopLimit.getNextRefreshTime()) {
shopLimit.setNextRefreshTime(ShopManager.getShopNextRefreshTime(sg));
shopLimit.setNextRefreshTime(ShopSystem.getShopNextRefreshTime(sg));
} else {
bought = shopLimit.getHasBoughtInPeriod();
}
......@@ -65,7 +65,7 @@ public class HandlerBuyGoodsReq extends PacketHandler {
return;
}
session.getPlayer().addShopLimit(sg.getGoodsId(), buyGoodsReq.getBuyCount(), ShopManager.getShopNextRefreshTime(sg));
session.getPlayer().addShopLimit(sg.getGoodsId(), buyGoodsReq.getBuyCount(), ShopSystem.getShopNextRefreshTime(sg));
GameItem item = new GameItem(GameData.getItemDataMap().get(sg.getGoodsItem().getId()));
item.setCount(buyGoodsReq.getBuyCount() * sg.getGoodsItem().getCount());
session.getPlayer().getInventory().addItem(item, ActionReason.Shop, true); // fix: not notify when got virtual item from shop
......
......@@ -17,7 +17,7 @@ public class HandlerCalcWeaponUpgradeReturnItemsReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
CalcWeaponUpgradeReturnItemsReq req = CalcWeaponUpgradeReturnItemsReq.parseFrom(payload);
List<ItemParam> returnOres = session.getServer().getInventoryManager().calcWeaponUpgradeReturnItems(
List<ItemParam> returnOres = session.getServer().getInventorySystem().calcWeaponUpgradeReturnItems(
session.getPlayer(),
req.getTargetWeaponGuid(),
req.getFoodWeaponGuidListList(),
......
......@@ -21,7 +21,7 @@ public class HandlerCombineReq extends PacketHandler {
CombineReqOuterClass.CombineReq req = CombineReqOuterClass.CombineReq.parseFrom(payload);
var result = session.getServer().getCombineManger()
var result = session.getServer().getCombineSystem()
.combineItem(session.getPlayer(), req.getCombineId(), req.getCombineCount());
if(result == null){
......
......@@ -13,6 +13,6 @@ public class HandlerDestroyMaterialReq extends PacketHandler {
DestroyMaterialReq req = DestroyMaterialReq.parseFrom(payload);
// Delete items
session.getServer().getInventoryManager().destroyMaterial(session.getPlayer(), req.getMaterialListList());
session.getServer().getInventorySystem().destroyMaterial(session.getPlayer(), req.getMaterialListList());
}
}
......@@ -12,6 +12,6 @@ public class HandlerDoGachaReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
DoGachaReq req = DoGachaReq.parseFrom(payload);
session.getServer().getGachaManager().doPulls(session.getPlayer(), req.getGachaScheduleId(), req.getGachaTimes());
session.getServer().getGachaSystem().doPulls(session.getPlayer(), req.getGachaScheduleId(), req.getGachaTimes());
}
}
......@@ -13,7 +13,7 @@ public class HandlerDungeonEntryInfoReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
DungeonEntryInfoReq req = DungeonEntryInfoReq.parseFrom(payload);
session.getServer().getDungeonManager().getEntryInfo(session.getPlayer(), req.getPointId());
session.getServer().getDungeonSystem().getEntryInfo(session.getPlayer(), req.getPointId());
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment