mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-26 22:22:51 +00:00
PlayerProperty Refactor
This commit is contained in:
parent
8876c1c99d
commit
09f7a2e69d
@ -44,7 +44,6 @@ public class ResinManager {
|
||||
}
|
||||
|
||||
// Send packets.
|
||||
this.player.sendPacket(new PacketPlayerPropNotify(this.player, PlayerProperty.PROP_PLAYER_RESIN));
|
||||
this.player.sendPacket(new PacketResinChangeNotify(this.player));
|
||||
|
||||
// Battle Pass trigger
|
||||
@ -70,7 +69,6 @@ public class ResinManager {
|
||||
}
|
||||
|
||||
// Send packets.
|
||||
this.player.sendPacket(new PacketPlayerPropNotify(this.player, PlayerProperty.PROP_PLAYER_RESIN));
|
||||
this.player.sendPacket(new PacketResinChangeNotify(this.player));
|
||||
}
|
||||
|
||||
@ -117,7 +115,6 @@ public class ResinManager {
|
||||
}
|
||||
|
||||
// Send packets.
|
||||
this.player.sendPacket(new PacketPlayerPropNotify(this.player, PlayerProperty.PROP_PLAYER_RESIN));
|
||||
this.player.sendPacket(new PacketResinChangeNotify(this.player));
|
||||
}
|
||||
|
||||
@ -141,7 +138,6 @@ public class ResinManager {
|
||||
}
|
||||
|
||||
// Send initial notifications on logon.
|
||||
this.player.sendPacket(new PacketPlayerPropNotify(this.player, PlayerProperty.PROP_PLAYER_RESIN));
|
||||
this.player.sendPacket(new PacketResinChangeNotify(this.player));
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,6 @@ import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
import emu.grasscutter.net.proto.ChangeHpReasonOuterClass.ChangeHpReason;
|
||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropChangeReasonNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
|
||||
@ -26,7 +25,7 @@ public class SotSManager {
|
||||
private Timer autoRecoverTimer;
|
||||
private final boolean enablePriorityHealing = false;
|
||||
|
||||
public final static int GlobalMaximumSpringVolume = 8500000;
|
||||
public final static int GlobalMaximumSpringVolume = PlayerProperty.PROP_MAX_SPRING_VOLUME.getMax();
|
||||
|
||||
public SotSManager(Player player) {
|
||||
this.player = player;
|
||||
|
@ -2,8 +2,6 @@ package emu.grasscutter.game.managers.stamina;
|
||||
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.command.commands.NoStaminaCommand;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.entity.EntityAvatar;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
@ -112,8 +110,8 @@ public class StaminaManager {
|
||||
}};
|
||||
|
||||
private final Logger logger = Grasscutter.getLogger();
|
||||
public final static int GlobalCharacterMaximumStamina = 24000;
|
||||
public final static int GlobalVehicleMaxStamina = 24000;
|
||||
public final static int GlobalCharacterMaximumStamina = PlayerProperty.PROP_MAX_STAMINA.getMax();
|
||||
public final static int GlobalVehicleMaxStamina = PlayerProperty.PROP_MAX_STAMINA.getMax();
|
||||
private Position currentCoordinates = new Position(0, 0, 0);
|
||||
private Position previousCoordinates = new Position(0, 0, 0);
|
||||
private MotionState currentState = MotionState.MOTION_STATE_STANDBY;
|
||||
@ -292,7 +290,6 @@ public class StaminaManager {
|
||||
// set stamina if is character stamina
|
||||
if (isCharacterStamina) {
|
||||
player.setProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA, newStamina);
|
||||
session.send(new PacketPlayerPropNotify(player, PlayerProperty.PROP_CUR_PERSIST_STAMINA));
|
||||
} else {
|
||||
vehicleStamina = newStamina;
|
||||
session.send(new PacketVehicleStaminaNotify(vehicleId, ((float) newStamina) / 100));
|
||||
|
@ -259,14 +259,14 @@ public class Player {
|
||||
this.teamManager = new TeamManager(this);
|
||||
this.birthday = new PlayerBirthday();
|
||||
this.codex = new PlayerCodex(this);
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEVEL, 1);
|
||||
this.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, 1);
|
||||
this.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, 50);
|
||||
this.setProperty(PlayerProperty.PROP_IS_FLYABLE, 1);
|
||||
this.setProperty(PlayerProperty.PROP_IS_TRANSFERABLE, 1);
|
||||
this.setProperty(PlayerProperty.PROP_MAX_STAMINA, 24000);
|
||||
this.setProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA, 24000);
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_RESIN, 160);
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEVEL, 1, false);
|
||||
this.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, 1, false);
|
||||
this.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, 50, false);
|
||||
this.setProperty(PlayerProperty.PROP_IS_FLYABLE, 1, false);
|
||||
this.setProperty(PlayerProperty.PROP_IS_TRANSFERABLE, 1, false);
|
||||
this.setProperty(PlayerProperty.PROP_MAX_STAMINA, 24000, false);
|
||||
this.setProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA, 24000, false);
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_RESIN, 160, false);
|
||||
this.getFlyCloakList().add(140001);
|
||||
this.getNameCardList().add(210001);
|
||||
this.getPos().set(GameConstants.START_POSITION);
|
||||
@ -481,7 +481,6 @@ public class Player {
|
||||
|
||||
public void setPrimogems(int primogem) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_HCOIN, primogem);
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, PlayerProperty.PROP_PLAYER_HCOIN));
|
||||
}
|
||||
|
||||
public int getMora() {
|
||||
@ -490,7 +489,6 @@ public class Player {
|
||||
|
||||
public void setMora(int mora) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_SCOIN, mora);
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, PlayerProperty.PROP_PLAYER_SCOIN));
|
||||
}
|
||||
|
||||
public int getCrystals() {
|
||||
@ -499,7 +497,6 @@ public class Player {
|
||||
|
||||
public void setCrystals(int crystals) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_MCOIN, crystals);
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, PlayerProperty.PROP_PLAYER_MCOIN));
|
||||
}
|
||||
|
||||
public int getHomeCoin() {
|
||||
@ -508,7 +505,6 @@ public class Player {
|
||||
|
||||
public void setHomeCoin(int coin) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_HOME_COIN, coin);
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, PlayerProperty.PROP_PLAYER_HOME_COIN));
|
||||
}
|
||||
private int getExpRequired(int level) {
|
||||
PlayerLevelData levelData = GameData.getPlayerLevelDataMap().get(level);
|
||||
@ -546,9 +542,6 @@ public class Player {
|
||||
|
||||
// Set exp
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_EXP, exp);
|
||||
|
||||
// Update player with packet
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, PlayerProperty.PROP_PLAYER_EXP));
|
||||
}
|
||||
|
||||
private void updateWorldLevel() {
|
||||
@ -621,7 +614,11 @@ public class Player {
|
||||
}
|
||||
|
||||
public boolean setProperty(PlayerProperty prop, int value) {
|
||||
return setPropertyWithSanityCheck(prop, value);
|
||||
return setPropertyWithSanityCheck(prop, value, true);
|
||||
}
|
||||
|
||||
public boolean setProperty(PlayerProperty prop, int value, boolean sendPacket) {
|
||||
return setPropertyWithSanityCheck(prop, value, sendPacket);
|
||||
}
|
||||
|
||||
public int getProperty(PlayerProperty prop) {
|
||||
@ -1456,8 +1453,8 @@ public class Player {
|
||||
world.addPlayer(this);
|
||||
|
||||
// Multiplayer setting
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_MP_SETTING_TYPE, this.getMpSetting().getNumber());
|
||||
this.setProperty(PlayerProperty.PROP_IS_MP_MODE_AVAILABLE, 1);
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_MP_SETTING_TYPE, this.getMpSetting().getNumber(), false);
|
||||
this.setProperty(PlayerProperty.PROP_IS_MP_MODE_AVAILABLE, 1, false);
|
||||
|
||||
// Packets
|
||||
session.send(new PacketPlayerDataNotify(this)); // Player data
|
||||
@ -1565,101 +1562,41 @@ public class Player {
|
||||
this.messageHandler = messageHandler;
|
||||
}
|
||||
|
||||
private void saveSanityCheckedProperty(PlayerProperty prop, int value) {
|
||||
getProperties().put(prop.getId(), value);
|
||||
public int getPropertyMin(PlayerProperty prop) {
|
||||
if (prop.getDynamicRange()) {
|
||||
return switch (prop) {
|
||||
default -> 0;
|
||||
};
|
||||
} else {
|
||||
return prop.getMin();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean setPropertyWithSanityCheck(PlayerProperty prop, int value) {
|
||||
if (prop == PlayerProperty.PROP_EXP) { // 1001
|
||||
if (!(value >= 0)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_BREAK_LEVEL) { // 1002
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_SATIATION_VAL) { // 1003
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_SATIATION_PENALTY_TIME) { // 1004
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_LEVEL) { // 4001
|
||||
if (!(value >= 0 && value <= 90)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_LAST_CHANGE_AVATAR_TIME) { // 10001
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_MAX_SPRING_VOLUME) { // 10002
|
||||
if (!(value >= 0 && value <= SotSManager.GlobalMaximumSpringVolume)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_CUR_SPRING_VOLUME) { // 10003
|
||||
int playerMaximumSpringVolume = getProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME);
|
||||
if (!(value >= 0 && value <= playerMaximumSpringVolume)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_SPRING_AUTO_USE) { // 10004
|
||||
if (!(value >= 0 && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT) { // 10005
|
||||
if (!(value >= 0 && value <= 100)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_FLYABLE) { // 10006
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_WEATHER_LOCKED) { // 10007
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_GAME_TIME_LOCKED) { // 10008
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_TRANSFERABLE) { // 10009
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_MAX_STAMINA) { // 10010
|
||||
if (!(value >= 0 && value <= StaminaManager.GlobalCharacterMaximumStamina)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_CUR_PERSIST_STAMINA) { // 10011
|
||||
int playerMaximumStamina = getProperty(PlayerProperty.PROP_MAX_STAMINA);
|
||||
if (!(value >= 0 && value <= playerMaximumStamina)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_CUR_TEMPORARY_STAMINA) { // 10012
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_LEVEL) { // 10013
|
||||
if (!(0 < value && value <= 90)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_EXP) { // 10014
|
||||
if (!(0 <= value)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_HCOIN) { // 10015
|
||||
// see PlayerProperty.PROP_PLAYER_HCOIN comments
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_SCOIN) { // 10016
|
||||
// See 10015
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_MP_SETTING_TYPE) { // 10017
|
||||
if (!(0 <= value && value <= 2)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_IS_MP_MODE_AVAILABLE) { // 10018
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WORLD_LEVEL) { // 10019
|
||||
if (!(0 <= value && value <= 8)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_RESIN) { // 10020
|
||||
// Do not set 160 as a cap, because player can have more than 160 when they use fragile resin.
|
||||
if (!(0 <= value)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WAIT_SUB_HCOIN) { // 10022
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WAIT_SUB_SCOIN) { // 10023
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_IS_ONLY_MP_WITH_PS_PLAYER) { // 10024
|
||||
if (!(0 <= value && value <= 1)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_MCOIN) { // 10025
|
||||
// see 10015
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WAIT_SUB_MCOIN) { // 10026
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_LEGENDARY_KEY) { // 10027
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_IS_HAS_FIRST_SHARE) { // 10028
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_FORGE_POINT) { // 10029
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_CUR_CLIMATE_METER) { // 10035
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_CUR_CLIMATE_TYPE) { // 10036
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_CUR_CLIMATE_AREA_ID) { // 10037
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_CUR_CLIMATE_AREA_CLIMATE_TYPE) { // 10038
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WORLD_LEVEL_LIMIT) { // 10039
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WORLD_LEVEL_ADJUST_CD) { // 10040
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM) { // 10041
|
||||
// TODO: implement sanity check
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_HOME_COIN) { // 10042
|
||||
if (!(0 <= value)) { return false; }
|
||||
} else if (prop == PlayerProperty.PROP_PLAYER_WAIT_SUB_HOME_COIN) { // 10043
|
||||
// TODO: implement sanity check
|
||||
public int getPropertyMax(PlayerProperty prop) {
|
||||
if (prop.getDynamicRange()) {
|
||||
return switch (prop) {
|
||||
case PROP_CUR_SPRING_VOLUME -> getProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME);
|
||||
case PROP_CUR_PERSIST_STAMINA -> getProperty(PlayerProperty.PROP_MAX_STAMINA);
|
||||
default -> 0;
|
||||
};
|
||||
} else {
|
||||
return prop.getMax();
|
||||
}
|
||||
saveSanityCheckedProperty(prop, value);
|
||||
}
|
||||
|
||||
private boolean setPropertyWithSanityCheck(PlayerProperty prop, int value, boolean sendPacket) {
|
||||
int min = this.getPropertyMin(prop);
|
||||
int max = this.getPropertyMax(prop);
|
||||
if (min <= value && value <= max) {
|
||||
this.properties.put(prop.getId(), value);
|
||||
if (sendPacket) {
|
||||
// Update player with packet
|
||||
this.sendPacket(new PacketPlayerPropNotify(this, prop));
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,41 +6,41 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
|
||||
public enum PlayerProperty {
|
||||
PROP_EXP (1001),
|
||||
PROP_EXP (1001, 0),
|
||||
PROP_BREAK_LEVEL (1002),
|
||||
PROP_SATIATION_VAL (1003),
|
||||
PROP_SATIATION_PENALTY_TIME (1004),
|
||||
PROP_LEVEL (4001),
|
||||
PROP_LEVEL (4001, 0, 90),
|
||||
PROP_LAST_CHANGE_AVATAR_TIME (10001),
|
||||
PROP_MAX_SPRING_VOLUME (10002), // Maximum volume of the Statue of the Seven for the player [0, 8500000]
|
||||
PROP_CUR_SPRING_VOLUME (10003), // Current volume of the Statue of the Seven [0, PROP_MAX_SPRING_VOLUME]
|
||||
PROP_IS_SPRING_AUTO_USE (10004), // Auto HP recovery when approaching the Statue of the Seven [0, 1]
|
||||
PROP_SPRING_AUTO_USE_PERCENT (10005), // Auto HP recovery percentage [0, 100]
|
||||
PROP_IS_FLYABLE (10006), // Are you in a state that disables your flying ability? e.g. new player [0, 1]
|
||||
PROP_IS_WEATHER_LOCKED (10007),
|
||||
PROP_IS_GAME_TIME_LOCKED (10008),
|
||||
PROP_IS_TRANSFERABLE (10009),
|
||||
PROP_MAX_STAMINA (10010), // Maximum stamina of the player (0 - 24000)
|
||||
PROP_CUR_PERSIST_STAMINA (10011), // Used stamina of the player (0 - PROP_MAX_STAMINA)
|
||||
PROP_MAX_SPRING_VOLUME (10002, 0, 8_500_000), // Maximum volume of the Statue of the Seven for the player [0, 8500000]
|
||||
PROP_CUR_SPRING_VOLUME (10003, true), // Current volume of the Statue of the Seven [0, PROP_MAX_SPRING_VOLUME]
|
||||
PROP_IS_SPRING_AUTO_USE (10004, 0, 1), // Auto HP recovery when approaching the Statue of the Seven [0, 1]
|
||||
PROP_SPRING_AUTO_USE_PERCENT (10005, 0, 100), // Auto HP recovery percentage [0, 100]
|
||||
PROP_IS_FLYABLE (10006, 0, 1), // Are you in a state that disables your flying ability? e.g. new player [0, 1]
|
||||
PROP_IS_WEATHER_LOCKED (10007, 0, 1),
|
||||
PROP_IS_GAME_TIME_LOCKED (10008, 0, 1),
|
||||
PROP_IS_TRANSFERABLE (10009, 0, 1),
|
||||
PROP_MAX_STAMINA (10010, 0, 24_000), // Maximum stamina of the player (0 - 24000)
|
||||
PROP_CUR_PERSIST_STAMINA (10011, true), // Used stamina of the player (0 - PROP_MAX_STAMINA)
|
||||
PROP_CUR_TEMPORARY_STAMINA (10012),
|
||||
PROP_PLAYER_LEVEL (10013),
|
||||
PROP_PLAYER_LEVEL (10013, 1, 60),
|
||||
PROP_PLAYER_EXP (10014),
|
||||
PROP_PLAYER_HCOIN (10015), // Primogem (-inf, +inf)
|
||||
// It is known that Mihoyo will make Primogem negative in the cases that a player spends
|
||||
// his gems and then got a money refund, so negative is allowed.
|
||||
PROP_PLAYER_SCOIN (10016), // Mora [0, +inf)
|
||||
PROP_PLAYER_MP_SETTING_TYPE (10017), // Do you allow other players to join your game? [0=no 1=direct 2=approval]
|
||||
PROP_IS_MP_MODE_AVAILABLE (10018), // 0 if in quest or something that disables MP [0, 1]
|
||||
PROP_PLAYER_WORLD_LEVEL (10019), // [0, 8]
|
||||
PROP_PLAYER_RESIN (10020), // Original Resin [0, +inf)
|
||||
PROP_PLAYER_SCOIN (10016, 0), // Mora [0, +inf)
|
||||
PROP_PLAYER_MP_SETTING_TYPE (10017, 0, 2), // Do you allow other players to join your game? [0=no 1=direct 2=approval]
|
||||
PROP_IS_MP_MODE_AVAILABLE (10018, 0, 1), // 0 if in quest or something that disables MP [0, 1]
|
||||
PROP_PLAYER_WORLD_LEVEL (10019, 0, 8), // [0, 8]
|
||||
PROP_PLAYER_RESIN (10020, 0, 2000), // Original Resin [0, 2000] - note that values above 160 require refills
|
||||
PROP_PLAYER_WAIT_SUB_HCOIN (10022),
|
||||
PROP_PLAYER_WAIT_SUB_SCOIN (10023),
|
||||
PROP_IS_ONLY_MP_WITH_PS_PLAYER (10024), // Is only MP with PlayStation players? [0, 1]
|
||||
PROP_IS_ONLY_MP_WITH_PS_PLAYER (10024, 0, 1), // Is only MP with PlayStation players? [0, 1]
|
||||
PROP_PLAYER_MCOIN (10025), // Genesis Crystal (-inf, +inf) see 10015
|
||||
PROP_PLAYER_WAIT_SUB_MCOIN (10026),
|
||||
PROP_PLAYER_LEGENDARY_KEY (10027),
|
||||
PROP_IS_HAS_FIRST_SHARE (10028),
|
||||
PROP_PLAYER_FORGE_POINT (10029),
|
||||
PROP_PLAYER_FORGE_POINT (10029, 0, 300_000),
|
||||
PROP_CUR_CLIMATE_METER (10035),
|
||||
PROP_CUR_CLIMATE_TYPE (10036),
|
||||
PROP_CUR_CLIMATE_AREA_ID (10037),
|
||||
@ -48,22 +48,55 @@ public enum PlayerProperty {
|
||||
PROP_PLAYER_WORLD_LEVEL_LIMIT (10039),
|
||||
PROP_PLAYER_WORLD_LEVEL_ADJUST_CD (10040),
|
||||
PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM (10041),
|
||||
PROP_PLAYER_HOME_COIN (10042), // Realm currency [0, +inf)
|
||||
PROP_PLAYER_HOME_COIN (10042, 0), // Realm currency [0, +inf)
|
||||
PROP_PLAYER_WAIT_SUB_HOME_COIN (10043);
|
||||
|
||||
private final int id;
|
||||
private static final int inf = Integer.MAX_VALUE; // Maybe this should be something else?
|
||||
private final int id, min, max;
|
||||
private final boolean dynamicRange;
|
||||
private static final Int2ObjectMap<PlayerProperty> map = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
static {
|
||||
Stream.of(values()).forEach(e -> map.put(e.getId(), e));
|
||||
}
|
||||
|
||||
PlayerProperty(int id) {
|
||||
PlayerProperty(int id, int min, int max, boolean dynamicRange) {
|
||||
this.id = id;
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
this.dynamicRange = dynamicRange;
|
||||
}
|
||||
|
||||
PlayerProperty(int id, int min) {
|
||||
this(id, min, inf, false);
|
||||
}
|
||||
|
||||
PlayerProperty(int id, int min, int max) {
|
||||
this(id, min, max, false);
|
||||
}
|
||||
|
||||
PlayerProperty(int id) {
|
||||
this(id, Integer.MIN_VALUE, inf, false);
|
||||
}
|
||||
|
||||
PlayerProperty(int id, boolean dynamicRange) {
|
||||
this(id, Integer.MIN_VALUE, inf, dynamicRange);
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public int getMin() {
|
||||
return this.min;
|
||||
}
|
||||
|
||||
public int getMax() {
|
||||
return this.max;
|
||||
}
|
||||
|
||||
public boolean getDynamicRange() {
|
||||
return dynamicRange;
|
||||
}
|
||||
|
||||
public static PlayerProperty getPropById(int value) {
|
||||
|
@ -10,9 +10,6 @@ import emu.grasscutter.net.proto.SetPlayerPropReqOuterClass.SetPlayerPropReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSetPlayerPropRsp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Opcodes(PacketOpcodes.SetPlayerPropReq)
|
||||
public class HandlerSetPlayerPropReq extends PacketHandler {
|
||||
|
||||
@ -21,11 +18,10 @@ public class HandlerSetPlayerPropReq extends PacketHandler {
|
||||
// Auto template
|
||||
SetPlayerPropReq req = SetPlayerPropReq.parseFrom(payload);
|
||||
Player player = session.getPlayer();
|
||||
List<PropValue> propList = req.getPropListList();
|
||||
for (int i = 0; i < propList.size(); i++) {
|
||||
PlayerProperty prop = PlayerProperty.getPropById(propList.get(i).getType());
|
||||
for (PropValue p : req.getPropListList()) {
|
||||
PlayerProperty prop = PlayerProperty.getPropById(p.getType());
|
||||
if (prop == PlayerProperty.PROP_IS_MP_MODE_AVAILABLE) {
|
||||
if (!player.setProperty(prop, (int)propList.get(i).getVal())) {
|
||||
if (!player.setProperty(prop, (int) p.getVal(), false)) {
|
||||
session.send(new PacketSetPlayerPropRsp(1));
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user