Refactor player managers

This commit is contained in:
Melledy
2022-07-18 20:42:22 -07:00
parent 3957616b6c
commit d20e9d1f72
30 changed files with 231 additions and 485 deletions

View File

@@ -10,6 +10,7 @@ import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.proto.CookRecipeDataOuterClass;
@@ -22,14 +23,12 @@ import emu.grasscutter.server.packet.send.PacketPlayerCookArgsRsp;
import emu.grasscutter.server.packet.send.PacketPlayerCookRsp;
import io.netty.util.internal.ThreadLocalRandom;
public class CookingManager {
public class CookingManager extends BasePlayerManager {
private static final int MANUAL_PERFECT_COOK_QUALITY = 3;
private static Set<Integer> defaultUnlockedRecipies;
private final Player player;
public CookingManager(Player player) {
this.player = player;
super(player);
}
public static void initialize() {

View File

@@ -4,6 +4,7 @@ import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.game.home.FurnitureMakeSlotItem;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.proto.ItemParamOuterClass;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
@@ -13,11 +14,10 @@ import emu.grasscutter.utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class FurnitureManager {
private final Player player;
public class FurnitureManager extends BasePlayerManager {
public FurnitureManager(Player player) {
this.player = player;
super(player);
}
public void onLogin(){

View File

@@ -8,11 +8,17 @@ import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.EntityVehicle;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.proto.VisionTypeOuterClass;
public record InsectCaptureManager(Player player) {
public class InsectCaptureManager extends BasePlayerManager {
public InsectCaptureManager(Player player) {
super(player);
}
public void arrestSmallCreature(GameEntity entity) {
//System.out.println("arrestSmallCreature!");
EnvAnimalGatherConfigData gather;

View File

@@ -1,5 +1,6 @@
package emu.grasscutter.game.managers;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.props.WatcherTriggerType;
@@ -9,11 +10,10 @@ import emu.grasscutter.utils.Utils;
import static emu.grasscutter.Configuration.GAME_OPTIONS;
public class ResinManager {
private final Player player;
public class ResinManager extends BasePlayerManager {
public ResinManager(Player player) {
this.player = player;
super(player);
}
/********************

View File

@@ -3,6 +3,7 @@ package emu.grasscutter.game.managers;
import ch.qos.logback.classic.Logger;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.PlayerProperty;
@@ -16,11 +17,10 @@ import java.util.Timer;
import java.util.TimerTask;
// Statue of the Seven Manager
public class SotSManager {
public class SotSManager extends BasePlayerManager {
// NOTE: Spring volume balance *1 = fight prop HP *100
private final Player player;
private final Logger logger = Grasscutter.getLogger();
private Timer autoRecoverTimer;
private final boolean enablePriorityHealing = false;
@@ -28,7 +28,7 @@ public class SotSManager {
public final static int GlobalMaximumSpringVolume = PlayerProperty.PROP_MAX_SPRING_VOLUME.getMax();
public SotSManager(Player player) {
this.player = player;
super(player);
}
public boolean getIsAutoRecoveryEnabled() {

View File

@@ -1,74 +0,0 @@
package emu.grasscutter.game.managers.collection;
import java.util.HashMap;
import java.util.List;
import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.player.Player;
public class CollectionManager {
private static final long SECOND = 1000; //1 Second
private static final long MINUTE = SECOND*60; //1 Minute
private static final long HOUR = MINUTE*60; //1 Hour
private static final long DAY = HOUR*24; //1 Day
private static final HashMap<Integer,Long> DEFINE_REFRESH_TIME = new HashMap<>();// <GadgetId,Waiting Millisecond>
private static final long DEFAULT_REFRESH_TIME = HOUR*6; // default 6 Hours
static {
DEFINE_REFRESH_TIME.put(70590027,3*DAY);//星银矿石 3 Days
DEFINE_REFRESH_TIME.put(70590036,3*DAY);//紫晶块 3 Days
DEFINE_REFRESH_TIME.put(70520003,3*DAY);//水晶 3 Days
DEFINE_REFRESH_TIME.put(70590013,2*DAY);//嘟嘟莲 2 Days
DEFINE_REFRESH_TIME.put(70540029,2*DAY);//清心 2 Days
DEFINE_REFRESH_TIME.put(70540028,2*DAY);//星螺 2 Days
DEFINE_REFRESH_TIME.put(70540027,2*DAY);//马尾 2 Days
DEFINE_REFRESH_TIME.put(70540026,2*DAY);//琉璃袋 2 Days
DEFINE_REFRESH_TIME.put(70540022,2*DAY);//落落莓 2 Days
DEFINE_REFRESH_TIME.put(70540020,2*DAY);//慕风蘑菇 2 Days
DEFINE_REFRESH_TIME.put(70540019,2*DAY);//风车菊 2 Days
DEFINE_REFRESH_TIME.put(70540018,2*DAY);//塞西莉亚花 2 Days
DEFINE_REFRESH_TIME.put(70540015,2*DAY);//霓裳花 2 Days
DEFINE_REFRESH_TIME.put(70540014,2*DAY);//莲蓬 2 Days
DEFINE_REFRESH_TIME.put(70540013,2*DAY);//钩钩果 2 Days
DEFINE_REFRESH_TIME.put(70540012,2*DAY);//琉璃百合 2 Days
DEFINE_REFRESH_TIME.put(70540008,2*DAY);//绝云椒椒 2 Days
DEFINE_REFRESH_TIME.put(70520018,2*DAY);//夜泊石 2 Days
DEFINE_REFRESH_TIME.put(70520002,2*DAY);//白铁矿 2 Days
DEFINE_REFRESH_TIME.put(70510012,2*DAY);//石珀 2 Days
DEFINE_REFRESH_TIME.put(70510009,2*DAY);//蒲公英 2 Days
DEFINE_REFRESH_TIME.put(70510007,2*DAY);//冰雾花 2 Days
DEFINE_REFRESH_TIME.put(70510006,2*DAY);//烈焰花 2 Days
DEFINE_REFRESH_TIME.put(70510005,2*DAY);//电气水晶 2 Days
DEFINE_REFRESH_TIME.put(70510004,2*DAY);//小灯草 2 Days
DEFINE_REFRESH_TIME.put(70540021,DAY);//日落果 1 Day
DEFINE_REFRESH_TIME.put(70540005,DAY);//松果 1 Day
DEFINE_REFRESH_TIME.put(70540003,DAY);//苹果 1 Day
DEFINE_REFRESH_TIME.put(70540001,DAY);//树莓 1 Day
DEFINE_REFRESH_TIME.put(70520019,DAY);//魔晶块 1 Days
DEFINE_REFRESH_TIME.put(70520008,DAY);//金鱼草 1 Days
DEFINE_REFRESH_TIME.put(70520007,DAY);//白萝卜 1 Days
DEFINE_REFRESH_TIME.put(70520006,DAY);//胡萝卜 1 Days
DEFINE_REFRESH_TIME.put(70520004,DAY);//蘑菇 1 Day
DEFINE_REFRESH_TIME.put(70520001,DAY);//铁矿 1 Day
DEFINE_REFRESH_TIME.put(70520009,12*HOUR);//薄荷 12 Hours
DEFINE_REFRESH_TIME.put(70520005,12*HOUR);//甜甜花 12 Hours
}
private final static HashMap<Integer, List<CollectionData>> CollectionResourcesData = new HashMap<>();
private final HashMap<CollectionData,EntityGadget> spawnedEntities = new HashMap<>();
private CollectionRecordStore collectionRecordStore;
Player player;
private static long getGadgetRefreshTime(int gadgetId){
return DEFINE_REFRESH_TIME.getOrDefault(gadgetId,DEFAULT_REFRESH_TIME);
}
public synchronized void setPlayer(Player player) {
this.player = player;
this.collectionRecordStore = player.getCollectionRecordStore();
}
}

View File

@@ -7,20 +7,21 @@ import dev.morphia.annotations.Transient;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.entity.EntityItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.net.proto.HitTreeNotifyOuterClass;
import emu.grasscutter.net.proto.VectorOuterClass;
import emu.grasscutter.utils.Position;
public class DeforestationManager {
public class DeforestationManager extends BasePlayerManager {
final static int RECORD_EXPIRED_SECONDS = 60*5; // 5 min
final static int RECORD_MAX_TIMES = 3; // max number of wood
final static int RECORD_MAX_TIMES_OTHER_HIT_TREE = 10; // if hit 10 times other trees, reset wood
@Transient private final Player player;
@Transient private final ArrayList<HitTreeRecord> currentRecord;
@Transient private final static HashMap<Integer, Integer> ColliderTypeToWoodItemID = new HashMap<>();
private final ArrayList<HitTreeRecord> currentRecord;
private final static HashMap<Integer, Integer> ColliderTypeToWoodItemID = new HashMap<>();
static {
/* define wood types which reflected to item id*/
ColliderTypeToWoodItemID.put(1,101301);
@@ -36,8 +37,9 @@ public class DeforestationManager {
ColliderTypeToWoodItemID.put(11,101311);
ColliderTypeToWoodItemID.put(12,101312);
}
public DeforestationManager(Player player){
this.player = player;
super(player);
this.currentRecord = new ArrayList<>();
}
public void resetWood(){

View File

@@ -13,6 +13,7 @@ import emu.grasscutter.game.entity.EntityItem;
import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ElementType;
import emu.grasscutter.game.props.FightProperty;
@@ -46,8 +47,7 @@ import static java.util.Map.entry;
import com.google.gson.reflect.TypeToken;
import com.google.protobuf.InvalidProtocolBufferException;
public class EnergyManager {
private final Player player;
public class EnergyManager extends BasePlayerManager {
private final Map<EntityAvatar, Integer> avatarNormalProbabilities;
// energyUsage for each player
private Boolean energyUsage;
@@ -55,15 +55,11 @@ public class EnergyManager {
private final static Int2ObjectMap<List<SkillParticleGenerationInfo>> skillParticleGenerationData = new Int2ObjectOpenHashMap<>();
public EnergyManager(Player player) {
this.player = player;
super(player);
this.avatarNormalProbabilities = new HashMap<>();
this.energyUsage=GAME_OPTIONS.energyUsage;
}
public Player getPlayer() {
return this.player;
}
public static void initialize() {
// Read the data we need for monster energy drops.
try (Reader fileReader = new InputStreamReader(DataLoader.load("EnergyDrop.json"))) {

View File

@@ -11,6 +11,7 @@ import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.data.excels.ForgeData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.props.WatcherTriggerType;
@@ -27,11 +28,10 @@ import emu.grasscutter.server.packet.send.PacketForgeQueueManipulateRsp;
import emu.grasscutter.server.packet.send.PacketForgeStartRsp;
import emu.grasscutter.utils.Utils;
public class ForgingManager {
private final Player player;
public class ForgingManager extends BasePlayerManager {
public ForgingManager(Player player) {
this.player = player;
super(player);
}
/**********

View File

@@ -1,5 +1,6 @@
package emu.grasscutter.game.managers.mapmark;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.proto.MapMarkPointTypeOuterClass.MapMarkPointType;
import emu.grasscutter.net.proto.MarkMapReqOuterClass.MarkMapReq;
@@ -9,16 +10,17 @@ import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify;
import emu.grasscutter.utils.Position;
import java.util.HashMap;
import java.util.Map;
public class MapMarksManager {
public class MapMarksManager extends BasePlayerManager {
public static final int mapMarkMaxCount = 150;
private HashMap<String, MapMark> mapMarks;
private final Player player;
public MapMarksManager(Player player) {
this.player = player;
this.mapMarks = player.getMapMarks();
if (this.mapMarks == null) { this.mapMarks = new HashMap<>(); }
super(player);
}
public Map<String, MapMark> getMapMarks() {
return getPlayer().getMapMarks();
}
public void handleMapMarkReq(MarkMapReq req) {
@@ -45,31 +47,26 @@ public class MapMarksManager {
}
}
if (op != Operation.OPERATION_GET) {
saveMapMarks();
save();
}
player.getSession().send(new PacketMarkMapRsp(getMapMarks()));
}
public HashMap<String, MapMark> getMapMarks() {
return mapMarks;
}
public String getMapMarkKey(Position position) {
return "x" + (int)position.getX()+ "z" + (int)position.getZ();
}
public void removeMapMark(Position position) {
mapMarks.remove(getMapMarkKey(position));
getMapMarks().remove(getMapMarkKey(position));
}
public void addMapMark(MapMark mapMark) {
if (mapMarks.size() < mapMarkMaxCount) {
mapMarks.put(getMapMarkKey(mapMark.getPosition()), mapMark);
if (getMapMarks().size() < mapMarkMaxCount) {
getMapMarks().put(getMapMarkKey(mapMark.getPosition()), mapMark);
}
}
private void saveMapMarks() {
player.setMapMarks(mapMarks);
private void save() {
player.save();
}

View File

@@ -5,6 +5,7 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.LifeState;
@@ -25,10 +26,9 @@ import java.util.*;
import static emu.grasscutter.Configuration.GAME_OPTIONS;
public class StaminaManager {
public class StaminaManager extends BasePlayerManager {
// TODO: Skiff state detection?
private final Player player;
private static final HashMap<String, HashSet<MotionState>> MotionStatesCategorized = new HashMap<>() {{
put("CLIMB", new HashSet<>(List.of(
MotionState.MOTION_STATE_CLIMB, // sustained, when not moving no cost no recover
@@ -163,7 +163,7 @@ public class StaminaManager {
}
public StaminaManager(Player player) {
this.player = player;
super(player);
}
// Accessors