diff --git a/src/main/java/emu/grasscutter/game/managers/ResinManager.java b/src/main/java/emu/grasscutter/game/managers/ResinManager.java index e55809f41..76393c7f3 100644 --- a/src/main/java/emu/grasscutter/game/managers/ResinManager.java +++ b/src/main/java/emu/grasscutter/game/managers/ResinManager.java @@ -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)); } } diff --git a/src/main/java/emu/grasscutter/game/managers/SotSManager.java b/src/main/java/emu/grasscutter/game/managers/SotSManager.java index b80058142..5f394a800 100644 --- a/src/main/java/emu/grasscutter/game/managers/SotSManager.java +++ b/src/main/java/emu/grasscutter/game/managers/SotSManager.java @@ -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; diff --git a/src/main/java/emu/grasscutter/game/managers/stamina/StaminaManager.java b/src/main/java/emu/grasscutter/game/managers/stamina/StaminaManager.java index 85c8fb7b3..3c3fd5a02 100644 --- a/src/main/java/emu/grasscutter/game/managers/stamina/StaminaManager.java +++ b/src/main/java/emu/grasscutter/game/managers/stamina/StaminaManager.java @@ -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)); diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index 945d5a3dc..2a13012f7 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -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; } + } } diff --git a/src/main/java/emu/grasscutter/game/props/PlayerProperty.java b/src/main/java/emu/grasscutter/game/props/PlayerProperty.java index 85a9456cf..ef3d0dbe3 100644 --- a/src/main/java/emu/grasscutter/game/props/PlayerProperty.java +++ b/src/main/java/emu/grasscutter/game/props/PlayerProperty.java @@ -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 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) { diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerPropReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerPropReq.java index 7f01392ad..7775a237d 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerPropReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerPropReq.java @@ -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 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; }