mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-02-07 10:36:41 +01:00
Fix whitespace [skip actions]
This commit is contained in:
@@ -102,9 +102,9 @@ public class CookingManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
// Get result item information.
|
||||
int qualityIndex =
|
||||
quality == 0
|
||||
? 2
|
||||
int qualityIndex =
|
||||
quality == 0
|
||||
? 2
|
||||
: quality - 1;
|
||||
|
||||
ItemParamData resultParam = recipeData.getQualityOutputVec().get(qualityIndex);
|
||||
|
||||
@@ -15,25 +15,25 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FurnitureManager extends BasePlayerManager {
|
||||
|
||||
|
||||
public FurnitureManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
public void onLogin(){
|
||||
public void onLogin() {
|
||||
notifyUnlockFurniture();
|
||||
notifyUnlockFurnitureSuite();
|
||||
}
|
||||
|
||||
public void notifyUnlockFurniture(){
|
||||
public void notifyUnlockFurniture() {
|
||||
player.getSession().send(new PacketUnlockedFurnitureFormulaDataNotify(player.getUnlockedFurniture()));
|
||||
}
|
||||
|
||||
public void notifyUnlockFurnitureSuite(){
|
||||
public void notifyUnlockFurnitureSuite() {
|
||||
player.getSession().send(new PacketUnlockedFurnitureSuiteDataNotify(player.getUnlockedFurnitureSuite()));
|
||||
}
|
||||
|
||||
public synchronized boolean unlockFurnitureOrSuite(GameItem useItem){
|
||||
public synchronized boolean unlockFurnitureOrSuite(GameItem useItem) {
|
||||
// Check
|
||||
if (!List.of("ITEM_USE_UNLOCK_FURNITURE_FORMULA", "ITEM_USE_UNLOCK_FURNITURE_SUITE")
|
||||
.contains(useItem.getItemData().getItemUse().get(0).getUseOp())) {
|
||||
@@ -45,10 +45,10 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
// Remove first
|
||||
player.getInventory().removeItem(useItem, 1);
|
||||
|
||||
if("ITEM_USE_UNLOCK_FURNITURE_FORMULA".equals(useItem.getItemData().getItemUse().get(0).getUseOp())){
|
||||
if ("ITEM_USE_UNLOCK_FURNITURE_FORMULA".equals(useItem.getItemData().getItemUse().get(0).getUseOp())) {
|
||||
player.getUnlockedFurniture().add(furnitureIdOrSuiteId);
|
||||
notifyUnlockFurniture();
|
||||
}else{
|
||||
}else {
|
||||
player.getUnlockedFurnitureSuite().add(furnitureIdOrSuiteId);
|
||||
notifyUnlockFurnitureSuite();
|
||||
}
|
||||
@@ -57,19 +57,19 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
|
||||
public void startMake(int makeId, int avatarId) {
|
||||
var makeData = GameData.getFurnitureMakeConfigDataMap().get(makeId);
|
||||
if(makeData == null){
|
||||
if (makeData == null) {
|
||||
player.getSession().send(new PacketFurnitureMakeStartRsp(Retcode.RET_FURNITURE_MAKE_CONFIG_ERROR_VALUE, null));
|
||||
return;
|
||||
}
|
||||
|
||||
// check slot count
|
||||
if (player.getHome().getLevelData().getFurnitureMakeSlotCount() <= player.getHome().getFurnitureMakeSlotItemList().size()){
|
||||
if (player.getHome().getLevelData().getFurnitureMakeSlotCount() <= player.getHome().getFurnitureMakeSlotItemList().size()) {
|
||||
player.getSession().send(new PacketFurnitureMakeStartRsp(Retcode.RET_FURNITURE_MAKE_SLOT_FULL_VALUE, null));
|
||||
return;
|
||||
}
|
||||
|
||||
// pay items first
|
||||
if(!player.getInventory().payItems(makeData.getMaterialItems().toArray(new ItemParamData[0]))){
|
||||
if (!player.getInventory().payItems(makeData.getMaterialItems().toArray(new ItemParamData[0]))) {
|
||||
player.getSession().send(new PacketFurnitureMakeStartRsp(Retcode.RET_HOME_FURNITURE_COUNT_NOT_ENOUGH_VALUE, null));
|
||||
return;
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
public void queryStatus() {
|
||||
if (player.getHome().getFurnitureMakeSlotItemList() == null){
|
||||
if (player.getHome().getFurnitureMakeSlotItemList() == null) {
|
||||
player.getHome().setFurnitureMakeSlotItemList(new ArrayList<>());
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
|
||||
public void take(int index, int makeId, boolean isFastFinish) {
|
||||
var makeData = GameData.getFurnitureMakeConfigDataMap().get(makeId);
|
||||
if(makeData == null){
|
||||
if (makeData == null) {
|
||||
player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_FURNITURE_MAKE_CONFIG_ERROR_VALUE, makeId, null, null));
|
||||
return;
|
||||
}
|
||||
@@ -112,19 +112,19 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
.filter(x -> x.getIndex() == index && x.getMakeId() == makeId)
|
||||
.findFirst();
|
||||
|
||||
if(slotItem.isEmpty()){
|
||||
if (slotItem.isEmpty()) {
|
||||
player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_FURNITURE_MAKE_NO_MAKE_DATA_VALUE, makeId, null, null));
|
||||
return;
|
||||
}
|
||||
|
||||
// pay the speedup item
|
||||
if(isFastFinish && !player.getInventory().payItem(107013,1)){
|
||||
if (isFastFinish && !player.getInventory().payItem(107013,1)) {
|
||||
player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_FURNITURE_MAKE_UNFINISH_VALUE, makeId, null, null));
|
||||
return;
|
||||
}
|
||||
|
||||
// check if player can take
|
||||
// if(slotItem.get().getBeginTime() + slotItem.get().getDurTime() >= Utils.getCurrentSeconds() && !isFastFinish){
|
||||
// if (slotItem.get().getBeginTime() + slotItem.get().getDurTime() >= Utils.getCurrentSeconds() && !isFastFinish) {
|
||||
// player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_FURNITURE_MAKE_UNFINISH_VALUE, makeId, null, null));
|
||||
// return;
|
||||
// }
|
||||
|
||||
@@ -26,7 +26,7 @@ public class ResinManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
|
||||
|
||||
|
||||
// Check if the player has sufficient resin.
|
||||
if (currentResin < amount) {
|
||||
return false;
|
||||
@@ -39,16 +39,16 @@ public class ResinManager extends BasePlayerManager {
|
||||
// Check if this has taken the player under the recharge cap,
|
||||
// starting the recharging process.
|
||||
if (this.player.getNextResinRefresh() == 0 && newResin < GAME_OPTIONS.resinOptions.cap) {
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
|
||||
}
|
||||
|
||||
// Send packets.
|
||||
this.player.sendPacket(new PacketResinChangeNotify(this.player));
|
||||
|
||||
|
||||
// Battle Pass trigger
|
||||
this.player.getBattlePassManager().triggerMission(WatcherTriggerType.TRIGGER_COST_MATERIAL, 106, amount); // Resin item id = 106
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ public class ResinManager extends BasePlayerManager {
|
||||
* Player login.
|
||||
********************/
|
||||
public synchronized void onPlayerLogin() {
|
||||
// If resin usage is disabled, set resin to cap.
|
||||
// If resin usage is disabled, set resin to cap.
|
||||
if (!GAME_OPTIONS.resinOptions.resinUsage) {
|
||||
this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, GAME_OPTIONS.resinOptions.cap);
|
||||
this.player.setNextResinRefresh(0);
|
||||
@@ -132,7 +132,7 @@ public class ResinManager extends BasePlayerManager {
|
||||
// we need to restart recharging here.
|
||||
int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
|
||||
|
||||
if (currentResin < GAME_OPTIONS.resinOptions.cap && this.player.getNextResinRefresh() == 0) {
|
||||
this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
|
||||
}
|
||||
|
||||
@@ -1,191 +1,191 @@
|
||||
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;
|
||||
import emu.grasscutter.net.proto.ChangeHpReasonOuterClass.ChangeHpReason;
|
||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropChangeReasonNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
// Statue of the Seven Manager
|
||||
public class SotSManager extends BasePlayerManager {
|
||||
|
||||
// NOTE: Spring volume balance *1 = fight prop HP *100
|
||||
|
||||
private final Logger logger = Grasscutter.getLogger();
|
||||
private Timer autoRecoverTimer;
|
||||
private final boolean enablePriorityHealing = false;
|
||||
|
||||
public final static int GlobalMaximumSpringVolume = PlayerProperty.PROP_MAX_SPRING_VOLUME.getMax();
|
||||
|
||||
public SotSManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
public boolean getIsAutoRecoveryEnabled() {
|
||||
return player.getProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE) == 1;
|
||||
}
|
||||
|
||||
public void setIsAutoRecoveryEnabled(boolean enabled) {
|
||||
player.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, enabled ? 1 : 0);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getAutoRecoveryPercentage() {
|
||||
return player.getProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT);
|
||||
}
|
||||
|
||||
public void setAutoRecoveryPercentage(int percentage) {
|
||||
player.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, percentage);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public long getLastUsed() {
|
||||
return player.getSpringLastUsed();
|
||||
}
|
||||
|
||||
public void setLastUsed() {
|
||||
player.setSpringLastUsed(System.currentTimeMillis() / 1000);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getMaxVolume() {
|
||||
return player.getProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME);
|
||||
}
|
||||
|
||||
public void setMaxVolume(int volume) {
|
||||
player.setProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME, volume);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getCurrentVolume() {
|
||||
return player.getProperty(PlayerProperty.PROP_CUR_SPRING_VOLUME);
|
||||
}
|
||||
|
||||
public void setCurrentVolume(int volume) {
|
||||
player.setProperty(PlayerProperty.PROP_CUR_SPRING_VOLUME, volume);
|
||||
setLastUsed();
|
||||
player.save();
|
||||
}
|
||||
|
||||
public void handleEnterTransPointRegionNotify() {
|
||||
logger.trace("Player entered statue region");
|
||||
autoRevive();
|
||||
if (autoRecoverTimer == null) {
|
||||
autoRecoverTimer = new Timer();
|
||||
autoRecoverTimer.schedule(new AutoRecoverTimerTick(), 2500, 15000);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleExitTransPointRegionNotify() {
|
||||
logger.trace("Player left statue region");
|
||||
if (autoRecoverTimer != null) {
|
||||
autoRecoverTimer.cancel();
|
||||
autoRecoverTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
// autoRevive automatically revives all team members.
|
||||
public void autoRevive() {
|
||||
player.getTeamManager().getActiveTeam().forEach(entity -> {
|
||||
boolean isAlive = entity.isAlive();
|
||||
if (isAlive) {
|
||||
return;
|
||||
}
|
||||
logger.trace("Reviving avatar " + entity.getAvatar().getAvatarData().getName());
|
||||
player.getTeamManager().reviveAvatar(entity.getAvatar());
|
||||
player.getTeamManager().healAvatar(entity.getAvatar(), 30, 0);
|
||||
});
|
||||
}
|
||||
|
||||
private class AutoRecoverTimerTick extends TimerTask {
|
||||
// autoRecover checks player setting to see if auto recover is enabled, and refill HP to the predefined level.
|
||||
public void run() {
|
||||
refillSpringVolume();
|
||||
|
||||
logger.trace("isAutoRecoveryEnabled: " + getIsAutoRecoveryEnabled() + "\tautoRecoverPercentage: " + getAutoRecoveryPercentage());
|
||||
|
||||
if (getIsAutoRecoveryEnabled()) {
|
||||
List<EntityAvatar> activeTeam = player.getTeamManager().getActiveTeam();
|
||||
// When the statue does not have enough remaining volume:
|
||||
// Enhanced experience: Enable priority healing
|
||||
// The current active character will get healed first, then sequential.
|
||||
// Vanilla experience: Disable priority healing
|
||||
// Sequential healing based on character index.
|
||||
int priorityIndex = enablePriorityHealing ? player.getTeamManager().getCurrentCharacterIndex() : -1;
|
||||
if (priorityIndex >= 0) {
|
||||
checkAndHealAvatar(activeTeam.get(priorityIndex));
|
||||
}
|
||||
for (int i = 0; i < activeTeam.size(); i++) {
|
||||
if (i != priorityIndex) {
|
||||
checkAndHealAvatar(activeTeam.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void checkAndHealAvatar(EntityAvatar entity) {
|
||||
int maxHP = (int) (entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * 100);
|
||||
int currentHP = (int) (entity.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) * 100);
|
||||
if (currentHP == maxHP) {
|
||||
return;
|
||||
}
|
||||
int targetHP = maxHP * getAutoRecoveryPercentage() / 100;
|
||||
|
||||
if (targetHP > currentHP) {
|
||||
int needHP = targetHP - currentHP;
|
||||
int currentVolume = getCurrentVolume();
|
||||
if (currentVolume >= needHP) {
|
||||
// sufficient
|
||||
setCurrentVolume(currentVolume - needHP);
|
||||
} else {
|
||||
// insufficient balance
|
||||
needHP = currentVolume;
|
||||
setCurrentVolume(0);
|
||||
}
|
||||
if (needHP > 0) {
|
||||
logger.trace("Healing avatar " + entity.getAvatar().getAvatarData().getName() + " +" + needHP);
|
||||
player.getTeamManager().healAvatar(entity.getAvatar(), 0, needHP);
|
||||
player.getSession().send(new PacketEntityFightPropChangeReasonNotify(entity, FightProperty.FIGHT_PROP_CUR_HP,
|
||||
((float) needHP / 100), List.of(3), PropChangeReason.PROP_CHANGE_REASON_STATUE_RECOVER,
|
||||
ChangeHpReason.CHANGE_HP_REASON_ADD_STATUE));
|
||||
player.getSession().send(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void refillSpringVolume() {
|
||||
// Temporary: Max spring volume depends on level of the statues in Mondstadt and Liyue. Override until we have statue level.
|
||||
// TODO: remove
|
||||
// https://genshin-impact.fandom.com/wiki/Statue_of_The_Seven#:~:text=region%20of%20Inazuma.-,Statue%20Levels,-Upon%20first%20unlocking
|
||||
setMaxVolume(8500000);
|
||||
// Temporary: Auto enable 100% statue recovery until we can adjust statue settings in game
|
||||
// TODO: remove
|
||||
setAutoRecoveryPercentage(100);
|
||||
setIsAutoRecoveryEnabled(true);
|
||||
|
||||
int maxVolume = getMaxVolume();
|
||||
int currentVolume = getCurrentVolume();
|
||||
if (currentVolume < maxVolume) {
|
||||
long now = System.currentTimeMillis() / 1000;
|
||||
int secondsSinceLastUsed = (int) (now - getLastUsed());
|
||||
// 15s = 1% max volume
|
||||
int volumeRefilled = secondsSinceLastUsed * maxVolume / 15 / 100;
|
||||
logger.trace("Statue has refilled HP volume: " + volumeRefilled);
|
||||
currentVolume = Math.min(currentVolume + volumeRefilled, maxVolume);
|
||||
logger.trace("Statue remaining HP volume: " + currentVolume);
|
||||
setCurrentVolume(currentVolume);
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
import emu.grasscutter.net.proto.ChangeHpReasonOuterClass.ChangeHpReason;
|
||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropChangeReasonNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
// Statue of the Seven Manager
|
||||
public class SotSManager extends BasePlayerManager {
|
||||
|
||||
// NOTE: Spring volume balance *1 = fight prop HP *100
|
||||
|
||||
private final Logger logger = Grasscutter.getLogger();
|
||||
private Timer autoRecoverTimer;
|
||||
private final boolean enablePriorityHealing = false;
|
||||
|
||||
public final static int GlobalMaximumSpringVolume = PlayerProperty.PROP_MAX_SPRING_VOLUME.getMax();
|
||||
|
||||
public SotSManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
public boolean getIsAutoRecoveryEnabled() {
|
||||
return player.getProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE) == 1;
|
||||
}
|
||||
|
||||
public void setIsAutoRecoveryEnabled(boolean enabled) {
|
||||
player.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, enabled ? 1 : 0);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getAutoRecoveryPercentage() {
|
||||
return player.getProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT);
|
||||
}
|
||||
|
||||
public void setAutoRecoveryPercentage(int percentage) {
|
||||
player.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, percentage);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public long getLastUsed() {
|
||||
return player.getSpringLastUsed();
|
||||
}
|
||||
|
||||
public void setLastUsed() {
|
||||
player.setSpringLastUsed(System.currentTimeMillis() / 1000);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getMaxVolume() {
|
||||
return player.getProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME);
|
||||
}
|
||||
|
||||
public void setMaxVolume(int volume) {
|
||||
player.setProperty(PlayerProperty.PROP_MAX_SPRING_VOLUME, volume);
|
||||
player.save();
|
||||
}
|
||||
|
||||
public int getCurrentVolume() {
|
||||
return player.getProperty(PlayerProperty.PROP_CUR_SPRING_VOLUME);
|
||||
}
|
||||
|
||||
public void setCurrentVolume(int volume) {
|
||||
player.setProperty(PlayerProperty.PROP_CUR_SPRING_VOLUME, volume);
|
||||
setLastUsed();
|
||||
player.save();
|
||||
}
|
||||
|
||||
public void handleEnterTransPointRegionNotify() {
|
||||
logger.trace("Player entered statue region");
|
||||
autoRevive();
|
||||
if (autoRecoverTimer == null) {
|
||||
autoRecoverTimer = new Timer();
|
||||
autoRecoverTimer.schedule(new AutoRecoverTimerTick(), 2500, 15000);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleExitTransPointRegionNotify() {
|
||||
logger.trace("Player left statue region");
|
||||
if (autoRecoverTimer != null) {
|
||||
autoRecoverTimer.cancel();
|
||||
autoRecoverTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
// autoRevive automatically revives all team members.
|
||||
public void autoRevive() {
|
||||
player.getTeamManager().getActiveTeam().forEach(entity -> {
|
||||
boolean isAlive = entity.isAlive();
|
||||
if (isAlive) {
|
||||
return;
|
||||
}
|
||||
logger.trace("Reviving avatar " + entity.getAvatar().getAvatarData().getName());
|
||||
player.getTeamManager().reviveAvatar(entity.getAvatar());
|
||||
player.getTeamManager().healAvatar(entity.getAvatar(), 30, 0);
|
||||
});
|
||||
}
|
||||
|
||||
private class AutoRecoverTimerTick extends TimerTask {
|
||||
// autoRecover checks player setting to see if auto recover is enabled, and refill HP to the predefined level.
|
||||
public void run() {
|
||||
refillSpringVolume();
|
||||
|
||||
logger.trace("isAutoRecoveryEnabled: " + getIsAutoRecoveryEnabled() + "\tautoRecoverPercentage: " + getAutoRecoveryPercentage());
|
||||
|
||||
if (getIsAutoRecoveryEnabled()) {
|
||||
List<EntityAvatar> activeTeam = player.getTeamManager().getActiveTeam();
|
||||
// When the statue does not have enough remaining volume:
|
||||
// Enhanced experience: Enable priority healing
|
||||
// The current active character will get healed first, then sequential.
|
||||
// Vanilla experience: Disable priority healing
|
||||
// Sequential healing based on character index.
|
||||
int priorityIndex = enablePriorityHealing ? player.getTeamManager().getCurrentCharacterIndex() : -1;
|
||||
if (priorityIndex >= 0) {
|
||||
checkAndHealAvatar(activeTeam.get(priorityIndex));
|
||||
}
|
||||
for (int i = 0; i < activeTeam.size(); i++) {
|
||||
if (i != priorityIndex) {
|
||||
checkAndHealAvatar(activeTeam.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void checkAndHealAvatar(EntityAvatar entity) {
|
||||
int maxHP = (int) (entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * 100);
|
||||
int currentHP = (int) (entity.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) * 100);
|
||||
if (currentHP == maxHP) {
|
||||
return;
|
||||
}
|
||||
int targetHP = maxHP * getAutoRecoveryPercentage() / 100;
|
||||
|
||||
if (targetHP > currentHP) {
|
||||
int needHP = targetHP - currentHP;
|
||||
int currentVolume = getCurrentVolume();
|
||||
if (currentVolume >= needHP) {
|
||||
// sufficient
|
||||
setCurrentVolume(currentVolume - needHP);
|
||||
} else {
|
||||
// insufficient balance
|
||||
needHP = currentVolume;
|
||||
setCurrentVolume(0);
|
||||
}
|
||||
if (needHP > 0) {
|
||||
logger.trace("Healing avatar " + entity.getAvatar().getAvatarData().getName() + " +" + needHP);
|
||||
player.getTeamManager().healAvatar(entity.getAvatar(), 0, needHP);
|
||||
player.getSession().send(new PacketEntityFightPropChangeReasonNotify(entity, FightProperty.FIGHT_PROP_CUR_HP,
|
||||
((float) needHP / 100), List.of(3), PropChangeReason.PROP_CHANGE_REASON_STATUE_RECOVER,
|
||||
ChangeHpReason.CHANGE_HP_REASON_ADD_STATUE));
|
||||
player.getSession().send(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void refillSpringVolume() {
|
||||
// Temporary: Max spring volume depends on level of the statues in Mondstadt and Liyue. Override until we have statue level.
|
||||
// TODO: remove
|
||||
// https://genshin-impact.fandom.com/wiki/Statue_of_The_Seven#:~:text=region%20of%20Inazuma.-,Statue%20Levels,-Upon%20first%20unlocking
|
||||
setMaxVolume(8500000);
|
||||
// Temporary: Auto enable 100% statue recovery until we can adjust statue settings in game
|
||||
// TODO: remove
|
||||
setAutoRecoveryPercentage(100);
|
||||
setIsAutoRecoveryEnabled(true);
|
||||
|
||||
int maxVolume = getMaxVolume();
|
||||
int currentVolume = getCurrentVolume();
|
||||
if (currentVolume < maxVolume) {
|
||||
long now = System.currentTimeMillis() / 1000;
|
||||
int secondsSinceLastUsed = (int) (now - getLastUsed());
|
||||
// 15s = 1% max volume
|
||||
int volumeRefilled = secondsSinceLastUsed * maxVolume / 15 / 100;
|
||||
logger.trace("Statue has refilled HP volume: " + volumeRefilled);
|
||||
currentVolume = Math.min(currentVolume + volumeRefilled, maxVolume);
|
||||
logger.trace("Statue remaining HP volume: " + currentVolume);
|
||||
setCurrentVolume(currentVolume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,197 +21,197 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ChatManager implements ChatManagerHandler {
|
||||
static final String PREFIXES = "[/!]";
|
||||
static final Pattern RE_PREFIXES = Pattern.compile(PREFIXES);
|
||||
static final Pattern RE_COMMANDS = Pattern.compile("\n" + PREFIXES);
|
||||
static final String PREFIXES = "[/!]";
|
||||
static final Pattern RE_PREFIXES = Pattern.compile(PREFIXES);
|
||||
static final Pattern RE_COMMANDS = Pattern.compile("\n" + PREFIXES);
|
||||
|
||||
// We store the chat history for ongoing sessions in the form
|
||||
// user id -> chat partner id -> [messages]
|
||||
private final Map<Integer, Map<Integer, List<ChatInfo>>> history = new HashMap<>();
|
||||
// We store the chat history for ongoing sessions in the form
|
||||
// user id -> chat partner id -> [messages]
|
||||
private final Map<Integer, Map<Integer, List<ChatInfo>>> history = new HashMap<>();
|
||||
|
||||
private final GameServer server;
|
||||
private final GameServer server;
|
||||
|
||||
public ChatManager(GameServer server) {
|
||||
this.server = server;
|
||||
}
|
||||
public ChatManager(GameServer server) {
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
public GameServer getServer() {
|
||||
return server;
|
||||
}
|
||||
public GameServer getServer() {
|
||||
return server;
|
||||
}
|
||||
|
||||
private boolean tryInvokeCommand(Player sender, Player target, String rawMessage) {
|
||||
if (!RE_PREFIXES.matcher(rawMessage.substring(0, 1)).matches())
|
||||
return false;
|
||||
for (String line : rawMessage.substring(1).split("\n[/!]"))
|
||||
CommandMap.getInstance().invoke(sender, target, line);
|
||||
return true;
|
||||
}
|
||||
private boolean tryInvokeCommand(Player sender, Player target, String rawMessage) {
|
||||
if (!RE_PREFIXES.matcher(rawMessage.substring(0, 1)).matches())
|
||||
return false;
|
||||
for (String line : rawMessage.substring(1).split("\n[/!]"))
|
||||
CommandMap.getInstance().invoke(sender, target, line);
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************
|
||||
* Chat history handling
|
||||
********************/
|
||||
private void putInHistory(int uid, int targetId, ChatInfo info) {
|
||||
if (!this.history.containsKey(uid)) {
|
||||
this.history.put(uid, new HashMap<>());
|
||||
}
|
||||
if (!this.history.get(uid).containsKey(targetId)) {
|
||||
this.history.get(uid).put(targetId, new ArrayList<>());
|
||||
}
|
||||
/********************
|
||||
* Chat history handling
|
||||
********************/
|
||||
private void putInHistory(int uid, int targetId, ChatInfo info) {
|
||||
if (!this.history.containsKey(uid)) {
|
||||
this.history.put(uid, new HashMap<>());
|
||||
}
|
||||
if (!this.history.get(uid).containsKey(targetId)) {
|
||||
this.history.get(uid).put(targetId, new ArrayList<>());
|
||||
}
|
||||
|
||||
this.history.get(uid).get(targetId).add(info);
|
||||
}
|
||||
this.history.get(uid).get(targetId).add(info);
|
||||
}
|
||||
|
||||
public void clearHistoryOnLogout(Player player) {
|
||||
if (this.history.containsKey(player.getUid())) {
|
||||
this.history.remove(player.getUid());
|
||||
}
|
||||
}
|
||||
public void clearHistoryOnLogout(Player player) {
|
||||
if (this.history.containsKey(player.getUid())) {
|
||||
this.history.remove(player.getUid());
|
||||
}
|
||||
}
|
||||
|
||||
public void handlePullPrivateChatReq(Player player, int targetUid) {
|
||||
if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(targetUid)) {
|
||||
player.sendPacket(new PacketPullPrivateChatRsp(this.history.get(player.getUid()).get(targetUid)));
|
||||
}
|
||||
else {
|
||||
player.sendPacket(new PacketPullPrivateChatRsp(List.of()));
|
||||
}
|
||||
}
|
||||
public void handlePullPrivateChatReq(Player player, int targetUid) {
|
||||
if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(targetUid)) {
|
||||
player.sendPacket(new PacketPullPrivateChatRsp(this.history.get(player.getUid()).get(targetUid)));
|
||||
}
|
||||
else {
|
||||
player.sendPacket(new PacketPullPrivateChatRsp(List.of()));
|
||||
}
|
||||
}
|
||||
|
||||
public void handlePullRecentChatReq(Player player) {
|
||||
// For now, we send the list three messages from the server for the recent chat history.
|
||||
// This matches the previous behavior, but ultimately, we should probably keep track of the last chat partner
|
||||
// for every given player and return the last messages exchanged with that partner.
|
||||
if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(GameConstants.SERVER_CONSOLE_UID)) {
|
||||
int historyLength = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).size();
|
||||
var messages = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).subList(Math.max(historyLength - 3, 0), historyLength);
|
||||
player.sendPacket(new PacketPullRecentChatRsp(messages));
|
||||
}
|
||||
else {
|
||||
player.sendPacket(new PacketPullRecentChatRsp(List.of()));
|
||||
}
|
||||
}
|
||||
public void handlePullRecentChatReq(Player player) {
|
||||
// For now, we send the list three messages from the server for the recent chat history.
|
||||
// This matches the previous behavior, but ultimately, we should probably keep track of the last chat partner
|
||||
// for every given player and return the last messages exchanged with that partner.
|
||||
if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(GameConstants.SERVER_CONSOLE_UID)) {
|
||||
int historyLength = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).size();
|
||||
var messages = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).subList(Math.max(historyLength - 3, 0), historyLength);
|
||||
player.sendPacket(new PacketPullRecentChatRsp(messages));
|
||||
}
|
||||
else {
|
||||
player.sendPacket(new PacketPullRecentChatRsp(List.of()));
|
||||
}
|
||||
}
|
||||
|
||||
/********************
|
||||
* Sending messages
|
||||
********************/
|
||||
public void sendPrivateMessageFromServer(int targetUid, String message) {
|
||||
// Sanity checks.
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
/********************
|
||||
* Sending messages
|
||||
********************/
|
||||
public void sendPrivateMessageFromServer(int targetUid, String message) {
|
||||
// Sanity checks.
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create chat packet and put in history.
|
||||
var packet = new PacketPrivateChatNotify(GameConstants.SERVER_CONSOLE_UID, targetUid, message);
|
||||
putInHistory(targetUid, GameConstants.SERVER_CONSOLE_UID, packet.getChatInfo());
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Send.
|
||||
target.sendPacket(packet);
|
||||
}
|
||||
public void sendPrivateMessageFromServer(int targetUid, int emote) {
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
// Create chat packet and put in history.
|
||||
var packet = new PacketPrivateChatNotify(GameConstants.SERVER_CONSOLE_UID, targetUid, message);
|
||||
putInHistory(targetUid, GameConstants.SERVER_CONSOLE_UID, packet.getChatInfo());
|
||||
|
||||
// Create chat packet and put in history.
|
||||
var packet = new PacketPrivateChatNotify(GameConstants.SERVER_CONSOLE_UID, targetUid, emote);
|
||||
putInHistory(targetUid, GameConstants.SERVER_CONSOLE_UID, packet.getChatInfo());
|
||||
// Send.
|
||||
target.sendPacket(packet);
|
||||
}
|
||||
public void sendPrivateMessageFromServer(int targetUid, int emote) {
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Send.
|
||||
target.sendPacket(packet);
|
||||
}
|
||||
// Create chat packet and put in history.
|
||||
var packet = new PacketPrivateChatNotify(GameConstants.SERVER_CONSOLE_UID, targetUid, emote);
|
||||
putInHistory(targetUid, GameConstants.SERVER_CONSOLE_UID, packet.getChatInfo());
|
||||
|
||||
public void sendPrivateMessage(Player player, int targetUid, String message) {
|
||||
// Sanity checks.
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
// Send.
|
||||
target.sendPacket(packet);
|
||||
}
|
||||
|
||||
// Check if command
|
||||
if (tryInvokeCommand(player, target, message)) {
|
||||
return;
|
||||
}
|
||||
public void sendPrivateMessage(Player player, int targetUid, String message) {
|
||||
// Sanity checks.
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == null && targetUid != GameConstants.SERVER_CONSOLE_UID) {
|
||||
return;
|
||||
}
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
|
||||
// Create chat packet.
|
||||
var packet = new PacketPrivateChatNotify(player.getUid(), targetUid, message);
|
||||
// Check if command
|
||||
if (tryInvokeCommand(player, target, message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Send and put in history.
|
||||
player.sendPacket(packet);
|
||||
putInHistory(player.getUid(), targetUid, packet.getChatInfo());
|
||||
if (target == null && targetUid != GameConstants.SERVER_CONSOLE_UID) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (target != null) {
|
||||
target.sendPacket(packet);
|
||||
putInHistory(targetUid, player.getUid(), packet.getChatInfo());
|
||||
}
|
||||
}
|
||||
// Create chat packet.
|
||||
var packet = new PacketPrivateChatNotify(player.getUid(), targetUid, message);
|
||||
|
||||
public void sendPrivateMessage(Player player, int targetUid, int emote) {
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
|
||||
if (target == null && targetUid != GameConstants.SERVER_CONSOLE_UID) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create chat packet.
|
||||
var packet = new PacketPrivateChatNotify(player.getUid(), target.getUid(), emote);
|
||||
// Send and put in history.
|
||||
player.sendPacket(packet);
|
||||
putInHistory(player.getUid(), targetUid, packet.getChatInfo());
|
||||
|
||||
// Send and put is history.
|
||||
player.sendPacket(packet);
|
||||
putInHistory(player.getUid(), targetUid, packet.getChatInfo());
|
||||
if (target != null) {
|
||||
target.sendPacket(packet);
|
||||
putInHistory(targetUid, player.getUid(), packet.getChatInfo());
|
||||
}
|
||||
}
|
||||
|
||||
if (target != null) {
|
||||
target.sendPacket(packet);
|
||||
putInHistory(targetUid, player.getUid(), packet.getChatInfo());
|
||||
}
|
||||
}
|
||||
public void sendPrivateMessage(Player player, int targetUid, int emote) {
|
||||
// Get target.
|
||||
Player target = getServer().getPlayerByUid(targetUid);
|
||||
|
||||
public void sendTeamMessage(Player player, int channel, String message) {
|
||||
// Sanity checks
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
if (target == null && targetUid != GameConstants.SERVER_CONSOLE_UID) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if command
|
||||
if (tryInvokeCommand(player, null, message)) {
|
||||
return;
|
||||
}
|
||||
// Create chat packet.
|
||||
var packet = new PacketPrivateChatNotify(player.getUid(), target.getUid(), emote);
|
||||
|
||||
// Create and send chat packet
|
||||
player.getWorld().broadcastPacket(new PacketPlayerChatNotify(player, channel, message));
|
||||
}
|
||||
public void sendTeamMessage(Player player, int channel, int icon) {
|
||||
// Create and send chat packet
|
||||
player.getWorld().broadcastPacket(new PacketPlayerChatNotify(player, channel, icon));
|
||||
}
|
||||
// Send and put is history.
|
||||
player.sendPacket(packet);
|
||||
putInHistory(player.getUid(), targetUid, packet.getChatInfo());
|
||||
|
||||
/********************
|
||||
* Welcome messages
|
||||
********************/
|
||||
public void sendServerWelcomeMessages(Player player) {
|
||||
var joinOptions = GAME_INFO.joinOptions;
|
||||
|
||||
if (joinOptions.welcomeEmotes != null && joinOptions.welcomeEmotes.length > 0) {
|
||||
this.sendPrivateMessageFromServer(player.getUid(), joinOptions.welcomeEmotes[Utils.randomRange(0, joinOptions.welcomeEmotes.length - 1)]);
|
||||
}
|
||||
|
||||
if (joinOptions.welcomeMessage != null && joinOptions.welcomeMessage.length() > 0) {
|
||||
this.sendPrivateMessageFromServer(player.getUid(), joinOptions.welcomeMessage);
|
||||
}
|
||||
if (target != null) {
|
||||
target.sendPacket(packet);
|
||||
putInHistory(targetUid, player.getUid(), packet.getChatInfo());
|
||||
}
|
||||
}
|
||||
|
||||
this.sendPrivateMessageFromServer(player.getUid(), "THIS IS AN EXPERIMENTAL BUILD OF GRASSCUTTER FOR 2.7.50/2.8\nDON'T LEAK <3");
|
||||
}
|
||||
public void sendTeamMessage(Player player, int channel, String message) {
|
||||
// Sanity checks
|
||||
if (message == null || message.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if command
|
||||
if (tryInvokeCommand(player, null, message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create and send chat packet
|
||||
player.getWorld().broadcastPacket(new PacketPlayerChatNotify(player, channel, message));
|
||||
}
|
||||
public void sendTeamMessage(Player player, int channel, int icon) {
|
||||
// Create and send chat packet
|
||||
player.getWorld().broadcastPacket(new PacketPlayerChatNotify(player, channel, icon));
|
||||
}
|
||||
|
||||
/********************
|
||||
* Welcome messages
|
||||
********************/
|
||||
public void sendServerWelcomeMessages(Player player) {
|
||||
var joinOptions = GAME_INFO.joinOptions;
|
||||
|
||||
if (joinOptions.welcomeEmotes != null && joinOptions.welcomeEmotes.length > 0) {
|
||||
this.sendPrivateMessageFromServer(player.getUid(), joinOptions.welcomeEmotes[Utils.randomRange(0, joinOptions.welcomeEmotes.length - 1)]);
|
||||
}
|
||||
|
||||
if (joinOptions.welcomeMessage != null && joinOptions.welcomeMessage.length() > 0) {
|
||||
this.sendPrivateMessageFromServer(player.getUid(), joinOptions.welcomeMessage);
|
||||
}
|
||||
|
||||
this.sendPrivateMessageFromServer(player.getUid(), "THIS IS AN EXPERIMENTAL BUILD OF GRASSCUTTER FOR 2.7.50/2.8\nDON'T LEAK <3");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class DeforestationManager extends BasePlayerManager {
|
||||
|
||||
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);
|
||||
@@ -37,17 +37,17 @@ public class DeforestationManager extends BasePlayerManager {
|
||||
ColliderTypeToWoodItemID.put(11,101311);
|
||||
ColliderTypeToWoodItemID.put(12,101312);
|
||||
}
|
||||
|
||||
public DeforestationManager(Player player){
|
||||
|
||||
public DeforestationManager(Player player) {
|
||||
super(player);
|
||||
this.currentRecord = new ArrayList<>();
|
||||
}
|
||||
public void resetWood(){
|
||||
public void resetWood() {
|
||||
synchronized (currentRecord) {
|
||||
currentRecord.clear();
|
||||
}
|
||||
}
|
||||
public void onDeforestationInvoke(HitTreeNotifyOuterClass.HitTreeNotify hit){
|
||||
public void onDeforestationInvoke(HitTreeNotifyOuterClass.HitTreeNotify hit) {
|
||||
synchronized (currentRecord) {
|
||||
//Grasscutter.getLogger().info("onDeforestationInvoke! Wood records {}", currentRecord);
|
||||
VectorOuterClass.Vector hitPosition = hit.getTreePos();
|
||||
@@ -59,14 +59,14 @@ public class DeforestationManager extends BasePlayerManager {
|
||||
HitTreeRecord record = searchRecord(positionHash);
|
||||
if (record == null) {
|
||||
record = new HitTreeRecord(positionHash);
|
||||
}else{
|
||||
}else {
|
||||
currentRecord.remove(record);// move it to last position
|
||||
}
|
||||
currentRecord.add(record);
|
||||
if(currentRecord.size()>RECORD_MAX_TIMES_OTHER_HIT_TREE){
|
||||
if (currentRecord.size()>RECORD_MAX_TIMES_OTHER_HIT_TREE) {
|
||||
currentRecord.remove(0);
|
||||
}
|
||||
if(record.record()) {
|
||||
if (record.record()) {
|
||||
EntityItem entity = new EntityItem(scene,
|
||||
null,
|
||||
GameData.getItemDataMap().get(itemId),
|
||||
@@ -82,7 +82,7 @@ public class DeforestationManager extends BasePlayerManager {
|
||||
}
|
||||
// unknown wood type
|
||||
}
|
||||
private HitTreeRecord searchRecord(int id){
|
||||
private HitTreeRecord searchRecord(int id) {
|
||||
for (HitTreeRecord record : currentRecord) {
|
||||
if (record.getUnique() == id) {
|
||||
return record;
|
||||
|
||||
@@ -448,4 +448,4 @@ public class EnergyManager extends BasePlayerManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,298 +30,298 @@ import emu.grasscutter.utils.Utils;
|
||||
|
||||
public class ForgingManager extends BasePlayerManager {
|
||||
|
||||
public ForgingManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
public ForgingManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
/**********
|
||||
Blueprint unlocking.
|
||||
**********/
|
||||
public synchronized boolean unlockForgingBlueprint(GameItem blueprintItem) {
|
||||
// Make sure this is actually a forging blueprint.
|
||||
if (!blueprintItem.getItemData().getItemUse().get(0).getUseOp().equals("ITEM_USE_UNLOCK_FORGE")) {
|
||||
return false;
|
||||
}
|
||||
/**********
|
||||
Blueprint unlocking.
|
||||
**********/
|
||||
public synchronized boolean unlockForgingBlueprint(GameItem blueprintItem) {
|
||||
// Make sure this is actually a forging blueprint.
|
||||
if (!blueprintItem.getItemData().getItemUse().get(0).getUseOp().equals("ITEM_USE_UNLOCK_FORGE")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Determine the forging item we should unlock.
|
||||
int forgeId = Integer.parseInt(blueprintItem.getItemData().getItemUse().get(0).getUseParam().get(0));
|
||||
// Determine the forging item we should unlock.
|
||||
int forgeId = Integer.parseInt(blueprintItem.getItemData().getItemUse().get(0).getUseParam().get(0));
|
||||
|
||||
// Remove the blueprint from the player's inventory.
|
||||
// We need to do this here, before sending ForgeFormulaDataNotify, or the the forging UI won't correctly
|
||||
// update when unlocking the blueprint.
|
||||
player.getInventory().removeItem(blueprintItem, 1);
|
||||
// Remove the blueprint from the player's inventory.
|
||||
// We need to do this here, before sending ForgeFormulaDataNotify, or the the forging UI won't correctly
|
||||
// update when unlocking the blueprint.
|
||||
player.getInventory().removeItem(blueprintItem, 1);
|
||||
|
||||
// Tell the client that this blueprint is now unlocked and add the unlocked item to the player.
|
||||
this.player.getUnlockedForgingBlueprints().add(forgeId);
|
||||
this.player.sendPacket(new PacketForgeFormulaDataNotify(forgeId));
|
||||
// Tell the client that this blueprint is now unlocked and add the unlocked item to the player.
|
||||
this.player.getUnlockedForgingBlueprints().add(forgeId);
|
||||
this.player.sendPacket(new PacketForgeFormulaDataNotify(forgeId));
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**********
|
||||
Communicate forging information to the client.
|
||||
**********/
|
||||
private synchronized int determineNumberOfQueues() {
|
||||
int adventureRank = player.getLevel();
|
||||
return
|
||||
(adventureRank >= 15) ? 4
|
||||
: (adventureRank >= 10) ? 3
|
||||
: (adventureRank >= 5) ? 2
|
||||
: 1;
|
||||
}
|
||||
/**********
|
||||
Communicate forging information to the client.
|
||||
**********/
|
||||
private synchronized int determineNumberOfQueues() {
|
||||
int adventureRank = player.getLevel();
|
||||
return
|
||||
(adventureRank >= 15) ? 4
|
||||
: (adventureRank >= 10) ? 3
|
||||
: (adventureRank >= 5) ? 2
|
||||
: 1;
|
||||
}
|
||||
|
||||
private synchronized Map<Integer, ForgeQueueData> determineCurrentForgeQueueData() {
|
||||
Map<Integer, ForgeQueueData> res = new HashMap<>();
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
private synchronized Map<Integer, ForgeQueueData> determineCurrentForgeQueueData() {
|
||||
Map<Integer, ForgeQueueData> res = new HashMap<>();
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
|
||||
// Create queue information for all active forges.
|
||||
for (int i = 0; i < this.player.getActiveForges().size(); i++) {
|
||||
ActiveForgeData activeForge = this.player.getActiveForges().get(i);
|
||||
// Create queue information for all active forges.
|
||||
for (int i = 0; i < this.player.getActiveForges().size(); i++) {
|
||||
ActiveForgeData activeForge = this.player.getActiveForges().get(i);
|
||||
|
||||
ForgeQueueData data = ForgeQueueData.newBuilder()
|
||||
.setQueueId(i + 1)
|
||||
.setForgeId(activeForge.getForgeId())
|
||||
.setFinishCount(activeForge.getFinishedCount(currentTime))
|
||||
.setUnfinishCount(activeForge.getUnfinishedCount(currentTime))
|
||||
.setTotalFinishTimestamp(activeForge.getTotalFinishTimestamp())
|
||||
.setNextFinishTimestamp(activeForge.getNextFinishTimestamp(currentTime))
|
||||
.setAvatarId(activeForge.getAvatarId())
|
||||
.build();
|
||||
ForgeQueueData data = ForgeQueueData.newBuilder()
|
||||
.setQueueId(i + 1)
|
||||
.setForgeId(activeForge.getForgeId())
|
||||
.setFinishCount(activeForge.getFinishedCount(currentTime))
|
||||
.setUnfinishCount(activeForge.getUnfinishedCount(currentTime))
|
||||
.setTotalFinishTimestamp(activeForge.getTotalFinishTimestamp())
|
||||
.setNextFinishTimestamp(activeForge.getNextFinishTimestamp(currentTime))
|
||||
.setAvatarId(activeForge.getAvatarId())
|
||||
.build();
|
||||
|
||||
res.put(i + 1, data);
|
||||
}
|
||||
res.put(i + 1, data);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public synchronized void sendForgeDataNotify() {
|
||||
// Determine the number of queues and unlocked items.
|
||||
int numQueues = this.determineNumberOfQueues();
|
||||
var unlockedItems = this.player.getUnlockedForgingBlueprints();
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
public synchronized void sendForgeDataNotify() {
|
||||
// Determine the number of queues and unlocked items.
|
||||
int numQueues = this.determineNumberOfQueues();
|
||||
var unlockedItems = this.player.getUnlockedForgingBlueprints();
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
|
||||
// Send notification.
|
||||
this.player.sendPacket(new PacketForgeDataNotify(unlockedItems, numQueues, queueData));
|
||||
}
|
||||
|
||||
public synchronized void handleForgeGetQueueDataReq() {
|
||||
// Determine the number of queues.
|
||||
int numQueues = this.determineNumberOfQueues();
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
// Send notification.
|
||||
this.player.sendPacket(new PacketForgeDataNotify(unlockedItems, numQueues, queueData));
|
||||
}
|
||||
|
||||
// Reply.
|
||||
this.player.sendPacket(new PacketForgeGetQueueDataRsp(Retcode.RET_SUCC, numQueues, queueData));
|
||||
}
|
||||
public synchronized void handleForgeGetQueueDataReq() {
|
||||
// Determine the number of queues.
|
||||
int numQueues = this.determineNumberOfQueues();
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
|
||||
/**********
|
||||
Initiate forging process.
|
||||
**********/
|
||||
private synchronized void sendForgeQueueDataNotify() {
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(queueData, List.of()));
|
||||
}
|
||||
private synchronized void sendForgeQueueDataNotify(boolean hasRemoved) {
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
// Reply.
|
||||
this.player.sendPacket(new PacketForgeGetQueueDataRsp(Retcode.RET_SUCC, numQueues, queueData));
|
||||
}
|
||||
|
||||
if (hasRemoved) {
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(Map.of(), List.of(1, 2, 3, 4)));
|
||||
}
|
||||
/**********
|
||||
Initiate forging process.
|
||||
**********/
|
||||
private synchronized void sendForgeQueueDataNotify() {
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(queueData, List.of()));
|
||||
}
|
||||
private synchronized void sendForgeQueueDataNotify(boolean hasRemoved) {
|
||||
var queueData = this.determineCurrentForgeQueueData();
|
||||
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(queueData, List.of()));
|
||||
}
|
||||
if (hasRemoved) {
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(Map.of(), List.of(1, 2, 3, 4)));
|
||||
}
|
||||
|
||||
public synchronized void handleForgeStartReq(ForgeStartReq req) {
|
||||
// Refuse if all queues are already full.
|
||||
if (this.player.getActiveForges().size() >= this.determineNumberOfQueues()) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_QUEUE_FULL));
|
||||
return;
|
||||
}
|
||||
this.player.sendPacket(new PacketForgeQueueDataNotify(queueData, List.of()));
|
||||
}
|
||||
|
||||
// Get the required forging information for the target item.
|
||||
if (!GameData.getForgeDataMap().containsKey(req.getForgeId())) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FAIL)); //ToDo: Probably the wrong return code.
|
||||
return;
|
||||
}
|
||||
public synchronized void handleForgeStartReq(ForgeStartReq req) {
|
||||
// Refuse if all queues are already full.
|
||||
if (this.player.getActiveForges().size() >= this.determineNumberOfQueues()) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_QUEUE_FULL));
|
||||
return;
|
||||
}
|
||||
|
||||
ForgeData forgeData = GameData.getForgeDataMap().get(req.getForgeId());
|
||||
// Get the required forging information for the target item.
|
||||
if (!GameData.getForgeDataMap().containsKey(req.getForgeId())) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FAIL)); //ToDo: Probably the wrong return code.
|
||||
return;
|
||||
}
|
||||
|
||||
//Check if the player has sufficient forge points.
|
||||
int requiredPoints = forgeData.getForgePoint() * req.getForgeCount();
|
||||
if (requiredPoints > this.player.getForgePoints()) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_POINT_NOT_ENOUGH));
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if we have enough of each material and consume.
|
||||
List<ItemParamData> material = new ArrayList<>(forgeData.getMaterialItems());
|
||||
material.add(new ItemParamData(202, forgeData.getScoinCost()));
|
||||
ForgeData forgeData = GameData.getForgeDataMap().get(req.getForgeId());
|
||||
|
||||
boolean success = player.getInventory().payItems(material.toArray(new ItemParamData[0]), req.getForgeCount(), ActionReason.ForgeCost);
|
||||
//Check if the player has sufficient forge points.
|
||||
int requiredPoints = forgeData.getForgePoint() * req.getForgeCount();
|
||||
if (requiredPoints > this.player.getForgePoints()) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_POINT_NOT_ENOUGH));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_POINT_NOT_ENOUGH)); //ToDo: Probably the wrong return code.
|
||||
}
|
||||
// Check if we have enough of each material and consume.
|
||||
List<ItemParamData> material = new ArrayList<>(forgeData.getMaterialItems());
|
||||
material.add(new ItemParamData(202, forgeData.getScoinCost()));
|
||||
|
||||
// Consume forge points.
|
||||
this.player.setForgePoints(this.player.getForgePoints() - requiredPoints);
|
||||
boolean success = player.getInventory().payItems(material.toArray(new ItemParamData[0]), req.getForgeCount(), ActionReason.ForgeCost);
|
||||
|
||||
// Create and add active forge.
|
||||
ActiveForgeData activeForge = new ActiveForgeData();
|
||||
activeForge.setForgeId(req.getForgeId());
|
||||
activeForge.setAvatarId(req.getAvatarId());
|
||||
activeForge.setCount(req.getForgeCount());
|
||||
activeForge.setStartTime(Utils.getCurrentSeconds());
|
||||
activeForge.setForgeTime(forgeData.getForgeTime());
|
||||
if (!success) {
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_FORGE_POINT_NOT_ENOUGH)); //ToDo: Probably the wrong return code.
|
||||
}
|
||||
|
||||
this.player.getActiveForges().add(activeForge);
|
||||
// Consume forge points.
|
||||
this.player.setForgePoints(this.player.getForgePoints() - requiredPoints);
|
||||
|
||||
// Done.
|
||||
this.sendForgeQueueDataNotify();
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_SUCC));
|
||||
}
|
||||
// Create and add active forge.
|
||||
ActiveForgeData activeForge = new ActiveForgeData();
|
||||
activeForge.setForgeId(req.getForgeId());
|
||||
activeForge.setAvatarId(req.getAvatarId());
|
||||
activeForge.setCount(req.getForgeCount());
|
||||
activeForge.setStartTime(Utils.getCurrentSeconds());
|
||||
activeForge.setForgeTime(forgeData.getForgeTime());
|
||||
|
||||
/**********
|
||||
Forge queue manipulation (obtaining results and cancelling forges).
|
||||
**********/
|
||||
private synchronized void obtainItems(int queueId) {
|
||||
// Determin how many items are finished.
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
ActiveForgeData forge = this.player.getActiveForges().get(queueId - 1);
|
||||
this.player.getActiveForges().add(activeForge);
|
||||
|
||||
int finished = forge.getFinishedCount(currentTime);
|
||||
int unfinished = forge.getUnfinishedCount(currentTime);
|
||||
// Done.
|
||||
this.sendForgeQueueDataNotify();
|
||||
this.player.sendPacket(new PacketForgeStartRsp(Retcode.RET_SUCC));
|
||||
}
|
||||
|
||||
// Sanity check: Are any items finished?
|
||||
if (finished <= 0) {
|
||||
return;
|
||||
}
|
||||
/**********
|
||||
Forge queue manipulation (obtaining results and cancelling forges).
|
||||
**********/
|
||||
private synchronized void obtainItems(int queueId) {
|
||||
// Determin how many items are finished.
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
ActiveForgeData forge = this.player.getActiveForges().get(queueId - 1);
|
||||
|
||||
// Give finished items to the player.
|
||||
ForgeData data = GameData.getForgeDataMap().get(forge.getForgeId());
|
||||
int finished = forge.getFinishedCount(currentTime);
|
||||
int unfinished = forge.getUnfinishedCount(currentTime);
|
||||
|
||||
int resultId = data.getResultItemId() > 0 ? data.getResultItemId() : data.getShowItemId();
|
||||
ItemData resultItemData = GameData.getItemDataMap().get(resultId);
|
||||
GameItem addItem = new GameItem(resultItemData, data.getResultItemCount() * finished);
|
||||
this.player.getInventory().addItem(addItem);
|
||||
|
||||
// Battle pass trigger handler
|
||||
this.player.getBattlePassManager().triggerMission(WatcherTriggerType.TRIGGER_DO_FORGE, 0, finished);
|
||||
// Sanity check: Are any items finished?
|
||||
if (finished <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Replace active forge with a new one for the unfinished items, if there are any.
|
||||
if (unfinished > 0) {
|
||||
ActiveForgeData remainingForge = new ActiveForgeData();
|
||||
// Give finished items to the player.
|
||||
ForgeData data = GameData.getForgeDataMap().get(forge.getForgeId());
|
||||
|
||||
remainingForge.setForgeId(forge.getForgeId());
|
||||
remainingForge.setAvatarId(forge.getAvatarId());
|
||||
remainingForge.setCount(unfinished);
|
||||
remainingForge.setForgeTime(forge.getForgeTime());
|
||||
remainingForge.setStartTime(forge.getStartTime() + finished * forge.getForgeTime());
|
||||
int resultId = data.getResultItemId() > 0 ? data.getResultItemId() : data.getShowItemId();
|
||||
ItemData resultItemData = GameData.getItemDataMap().get(resultId);
|
||||
GameItem addItem = new GameItem(resultItemData, data.getResultItemCount() * finished);
|
||||
this.player.getInventory().addItem(addItem);
|
||||
|
||||
this.player.getActiveForges().set(queueId - 1, remainingForge);
|
||||
this.sendForgeQueueDataNotify();
|
||||
}
|
||||
// Otherwise, completely remove it.
|
||||
else {
|
||||
this.player.getActiveForges().remove(queueId - 1);
|
||||
// this.sendForgeQueueDataNotify(queueId);
|
||||
this.sendForgeQueueDataNotify(true);
|
||||
}
|
||||
// Battle pass trigger handler
|
||||
this.player.getBattlePassManager().triggerMission(WatcherTriggerType.TRIGGER_DO_FORGE, 0, finished);
|
||||
|
||||
// Send response.
|
||||
this.player.sendPacket(new PacketForgeQueueManipulateRsp(Retcode.RET_SUCC, ForgeQueueManipulateType.FORGE_QUEUE_MANIPULATE_TYPE_RECEIVE_OUTPUT, List.of(addItem), List.of(), List.of()));
|
||||
}
|
||||
// Replace active forge with a new one for the unfinished items, if there are any.
|
||||
if (unfinished > 0) {
|
||||
ActiveForgeData remainingForge = new ActiveForgeData();
|
||||
|
||||
private synchronized void cancelForge(int queueId) {
|
||||
// Make sure there are no unfinished items.
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
ActiveForgeData forge = this.player.getActiveForges().get(queueId - 1);
|
||||
remainingForge.setForgeId(forge.getForgeId());
|
||||
remainingForge.setAvatarId(forge.getAvatarId());
|
||||
remainingForge.setCount(unfinished);
|
||||
remainingForge.setForgeTime(forge.getForgeTime());
|
||||
remainingForge.setStartTime(forge.getStartTime() + finished * forge.getForgeTime());
|
||||
|
||||
if (forge.getFinishedCount(currentTime) > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Return material items to the player.
|
||||
ForgeData data = GameData.getForgeDataMap().get(forge.getForgeId());
|
||||
this.player.getActiveForges().set(queueId - 1, remainingForge);
|
||||
this.sendForgeQueueDataNotify();
|
||||
}
|
||||
// Otherwise, completely remove it.
|
||||
else {
|
||||
this.player.getActiveForges().remove(queueId - 1);
|
||||
// this.sendForgeQueueDataNotify(queueId);
|
||||
this.sendForgeQueueDataNotify(true);
|
||||
}
|
||||
|
||||
var returnItems = new ArrayList<GameItem>();
|
||||
for (var material : data.getMaterialItems()) {
|
||||
if (material.getItemId() == 0) {
|
||||
continue;
|
||||
}
|
||||
// Send response.
|
||||
this.player.sendPacket(new PacketForgeQueueManipulateRsp(Retcode.RET_SUCC, ForgeQueueManipulateType.FORGE_QUEUE_MANIPULATE_TYPE_RECEIVE_OUTPUT, List.of(addItem), List.of(), List.of()));
|
||||
}
|
||||
|
||||
ItemData resultItemData = GameData.getItemDataMap().get(material.getItemId());
|
||||
GameItem returnItem = new GameItem(resultItemData, material.getItemCount() * forge.getCount());
|
||||
private synchronized void cancelForge(int queueId) {
|
||||
// Make sure there are no unfinished items.
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
ActiveForgeData forge = this.player.getActiveForges().get(queueId - 1);
|
||||
|
||||
this.player.getInventory().addItem(returnItem);
|
||||
returnItems.add(returnItem);
|
||||
}
|
||||
if (forge.getFinishedCount(currentTime) > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Return Mora to the player.
|
||||
this.player.setMora(this.player.getMora() + data.getScoinCost() * forge.getCount());
|
||||
// Return material items to the player.
|
||||
ForgeData data = GameData.getForgeDataMap().get(forge.getForgeId());
|
||||
|
||||
ItemData moraItem = GameData.getItemDataMap().get(202);
|
||||
GameItem returnMora = new GameItem(moraItem, data.getScoinCost() * forge.getCount());
|
||||
returnItems.add(returnMora);
|
||||
var returnItems = new ArrayList<GameItem>();
|
||||
for (var material : data.getMaterialItems()) {
|
||||
if (material.getItemId() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Return forge points to the player.
|
||||
int requiredPoints = data.getForgePoint() * forge.getCount();
|
||||
int newPoints = Math.min(this.player.getForgePoints() + requiredPoints, 300_000);
|
||||
ItemData resultItemData = GameData.getItemDataMap().get(material.getItemId());
|
||||
GameItem returnItem = new GameItem(resultItemData, material.getItemCount() * forge.getCount());
|
||||
|
||||
this.player.setForgePoints(newPoints);
|
||||
this.player.getInventory().addItem(returnItem);
|
||||
returnItems.add(returnItem);
|
||||
}
|
||||
|
||||
// Remove the forge queue.
|
||||
this.player.getActiveForges().remove(queueId - 1);
|
||||
this.sendForgeQueueDataNotify(true);
|
||||
// Return Mora to the player.
|
||||
this.player.setMora(this.player.getMora() + data.getScoinCost() * forge.getCount());
|
||||
|
||||
// Send response.
|
||||
this.player.sendPacket(new PacketForgeQueueManipulateRsp(Retcode.RET_SUCC, ForgeQueueManipulateType.FORGE_QUEUE_MANIPULATE_TYPE_STOP_FORGE, List.of(), returnItems, List.of()));
|
||||
}
|
||||
ItemData moraItem = GameData.getItemDataMap().get(202);
|
||||
GameItem returnMora = new GameItem(moraItem, data.getScoinCost() * forge.getCount());
|
||||
returnItems.add(returnMora);
|
||||
|
||||
public synchronized void handleForgeQueueManipulateReq(ForgeQueueManipulateReq req) {
|
||||
// Get info from the request.
|
||||
int queueId = req.getForgeQueueId();
|
||||
var manipulateType = req.getManipulateType();
|
||||
|
||||
// Handle according to the manipulation type.
|
||||
switch (manipulateType) {
|
||||
case FORGE_QUEUE_MANIPULATE_TYPE_RECEIVE_OUTPUT:
|
||||
this.obtainItems(queueId);
|
||||
break;
|
||||
case FORGE_QUEUE_MANIPULATE_TYPE_STOP_FORGE:
|
||||
this.cancelForge(queueId);
|
||||
break;
|
||||
default:
|
||||
break; //Should never happen.
|
||||
}
|
||||
}
|
||||
// Return forge points to the player.
|
||||
int requiredPoints = data.getForgePoint() * forge.getCount();
|
||||
int newPoints = Math.min(this.player.getForgePoints() + requiredPoints, 300_000);
|
||||
|
||||
/**********
|
||||
Periodic forging updates.
|
||||
**********/
|
||||
public synchronized void sendPlayerForgingUpdate() {
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
this.player.setForgePoints(newPoints);
|
||||
|
||||
// Determine if sending an update is necessary.
|
||||
// We only send an update if there are forges in the forge queue
|
||||
// that have changed since the last notification.
|
||||
if (this.player.getActiveForges().size() <= 0) {
|
||||
return;
|
||||
}
|
||||
// Remove the forge queue.
|
||||
this.player.getActiveForges().remove(queueId - 1);
|
||||
this.sendForgeQueueDataNotify(true);
|
||||
|
||||
boolean hasChanges = this.player.getActiveForges().stream()
|
||||
.filter(forge -> forge.updateChanged(currentTime))
|
||||
.findAny()
|
||||
.isPresent();
|
||||
// Send response.
|
||||
this.player.sendPacket(new PacketForgeQueueManipulateRsp(Retcode.RET_SUCC, ForgeQueueManipulateType.FORGE_QUEUE_MANIPULATE_TYPE_STOP_FORGE, List.of(), returnItems, List.of()));
|
||||
}
|
||||
|
||||
if (!hasChanges) {
|
||||
return;
|
||||
}
|
||||
public synchronized void handleForgeQueueManipulateReq(ForgeQueueManipulateReq req) {
|
||||
// Get info from the request.
|
||||
int queueId = req.getForgeQueueId();
|
||||
var manipulateType = req.getManipulateType();
|
||||
|
||||
// Send notification.
|
||||
this.sendForgeQueueDataNotify();
|
||||
// Handle according to the manipulation type.
|
||||
switch (manipulateType) {
|
||||
case FORGE_QUEUE_MANIPULATE_TYPE_RECEIVE_OUTPUT:
|
||||
this.obtainItems(queueId);
|
||||
break;
|
||||
case FORGE_QUEUE_MANIPULATE_TYPE_STOP_FORGE:
|
||||
this.cancelForge(queueId);
|
||||
break;
|
||||
default:
|
||||
break; //Should never happen.
|
||||
}
|
||||
}
|
||||
|
||||
// Reset changed flags.
|
||||
this.player.getActiveForges().stream()
|
||||
.forEach(forge -> forge.setChanged(false));
|
||||
}
|
||||
/**********
|
||||
Periodic forging updates.
|
||||
**********/
|
||||
public synchronized void sendPlayerForgingUpdate() {
|
||||
int currentTime = Utils.getCurrentSeconds();
|
||||
|
||||
// Determine if sending an update is necessary.
|
||||
// We only send an update if there are forges in the forge queue
|
||||
// that have changed since the last notification.
|
||||
if (this.player.getActiveForges().size() <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean hasChanges = this.player.getActiveForges().stream()
|
||||
.filter(forge -> forge.updateChanged(currentTime))
|
||||
.findAny()
|
||||
.isPresent();
|
||||
|
||||
if (!hasChanges) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Send notification.
|
||||
this.sendForgeQueueDataNotify();
|
||||
|
||||
// Reset changed flags.
|
||||
this.player.getActiveForges().stream()
|
||||
.forEach(forge -> forge.setChanged(false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
public MapMarksManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
|
||||
public Map<String, MapMark> getMapMarks() {
|
||||
return getPlayer().getMapMarks();
|
||||
}
|
||||
@@ -51,7 +51,7 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
}
|
||||
player.getSession().send(new PacketMarkMapRsp(getMapMarks()));
|
||||
}
|
||||
|
||||
|
||||
public String getMapMarkKey(Position position) {
|
||||
return "x" + (int)position.getX()+ "z" + (int)position.getZ();
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ public class StaminaManager extends BasePlayerManager {
|
||||
}};
|
||||
|
||||
public static void initialize() {
|
||||
// TODO: Initialize foods etc.
|
||||
// TODO: Initialize foods etc.
|
||||
}
|
||||
|
||||
public StaminaManager(Player player) {
|
||||
@@ -529,20 +529,20 @@ public class StaminaManager extends BasePlayerManager {
|
||||
}
|
||||
// Bow avatar charged attack
|
||||
Avatar currentAvatar = player.getTeamManager().getCurrentAvatarEntity().getAvatar();
|
||||
|
||||
|
||||
switch (currentAvatar.getAvatarData().getWeaponType()) {
|
||||
case WEAPON_BOW:
|
||||
return getBowSustainedCost(skillCasting);
|
||||
case WEAPON_CLAYMORE:
|
||||
return getClaymoreSustainedCost(skillCasting);
|
||||
case WEAPON_CATALYST:
|
||||
return getCatalystCost(skillCasting);
|
||||
case WEAPON_POLE:
|
||||
return getPolearmCost(skillCasting);
|
||||
case WEAPON_SWORD_ONE_HAND:
|
||||
return getSwordCost(skillCasting);
|
||||
case WEAPON_BOW:
|
||||
return getBowSustainedCost(skillCasting);
|
||||
case WEAPON_CLAYMORE:
|
||||
return getClaymoreSustainedCost(skillCasting);
|
||||
case WEAPON_CATALYST:
|
||||
return getCatalystCost(skillCasting);
|
||||
case WEAPON_POLE:
|
||||
return getPolearmCost(skillCasting);
|
||||
case WEAPON_SWORD_ONE_HAND:
|
||||
return getSwordCost(skillCasting);
|
||||
}
|
||||
|
||||
|
||||
return new Consumption();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user