Fix tower mob level and hp scaling (#2430)

This commit is contained in:
longfruit 2023-11-08 18:15:10 -08:00 committed by GitHub
parent 1fac319eb2
commit 0bbeaf254b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 66 additions and 27 deletions

View File

@ -13,6 +13,7 @@ public class TowerLevelData extends GameResource {
private int levelGroupId;
private int dungeonId;
private List<TowerLevelCond> conds;
private int monsterLevel;
public static class TowerLevelCond {
private TowerCondType towerCondType;

View File

@ -49,7 +49,6 @@ public final class AbilityManager extends BasePlayerManager {
}
@Getter private boolean abilityInvulnerable = false;
@Getter private Consumer<Integer> clearBurstEnergy;
private int burstCasterId;
private int burstSkillId;
@ -59,7 +58,6 @@ public final class AbilityManager extends BasePlayerManager {
}
public void removePendingEnergyClear() {
this.clearBurstEnergy = null;
this.burstCasterId = 0;
this.burstSkillId = 0;
}
@ -96,15 +94,16 @@ public final class AbilityManager extends BasePlayerManager {
> 0;
}
if (this.clearBurstEnergy != null
&& this.burstCasterId == entityId
if (this.burstCasterId == entityId
&& (ability.getAvatarSkillStartIds().contains(this.burstSkillId) || skillInvincibility)) {
Grasscutter.getLogger()
.trace(
"Caster ID's {} burst successful, clearing energy and setting invulnerability",
entityId);
this.abilityInvulnerable = true;
this.clearBurstEnergy.accept(entityId);
this.player
.getEnergyManager()
.handleEvtDoSkillSuccNotify(this.player.getSession(), this.burstSkillId, this.burstCasterId);
this.removePendingEnergyClear();
}
}
@ -337,13 +336,8 @@ public final class AbilityManager extends BasePlayerManager {
}
// Track this elemental burst to possibly clear avatar energy later.
this.clearBurstEnergy =
(ignored) ->
player
.getEnergyManager()
.handleEvtDoSkillSuccNotify(player.getSession(), skillId, casterId);
this.burstCasterId = casterId;
this.burstSkillId = skillId;
this.burstCasterId = casterId;
}
/**

View File

@ -82,8 +82,13 @@ public final class DungeonManager {
}
public int getLevelForMonster(int id) {
// TODO should use levelConfigMap? and how?
return dungeonData.getShowLevel();
if (isTowerDungeon()) {
// Tower dungeons have their own level setting in TowerLevelData
return scene.getPlayers().get(0).getTowerManager().getCurrentMonsterLevel();
} else {
// TODO should use levelConfigMap? and how?
return dungeonData.getShowLevel();
}
}
public boolean activateRespawnPoint(int pointId) {

View File

@ -355,6 +355,28 @@ public class EntityMonster extends GameEntity {
+ (this.getFightProperty(c.getBase())
* (1f + this.getFightProperty(c.getPercent())))));
// If in tower, scale max hp by
// +50%: Floors 3 7
// +100%: Floors 8 11
// +150%: Floor 12
var dungeonManager = getScene().getDungeonManager();
var towerManager = getScene().getPlayers().get(0).getTowerManager();
if (dungeonManager != null && dungeonManager.isTowerDungeon() && towerManager != null) {
var floor = towerManager.getCurrentFloorNumber();
float additionalScaleFactor = 0f;
if (floor >= 12) {
additionalScaleFactor = 1.5f;
} else if (floor >= 8) {
additionalScaleFactor = 1.f;
} else if (floor >= 3) {
additionalScaleFactor = .5f;
}
this.setFightProperty(
FightProperty.FIGHT_PROP_MAX_HP,
this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * (1 + additionalScaleFactor));
}
// Set current hp
this.setFightProperty(
FightProperty.FIGHT_PROP_CUR_HP,

View File

@ -29,6 +29,11 @@ public class TowerManager extends BasePlayerManager {
return this.getTowerData().currentFloorId;
}
/** floor number: 1 - 12 **/
public int getCurrentFloorNumber() {
return GameData.getTowerFloorDataMap().get(getCurrentFloorId()).getFloorIndex();
}
public int getCurrentLevelId() {
return this.getTowerData().currentLevelId + this.getTowerData().currentLevel;
}
@ -93,8 +98,17 @@ public class TowerManager extends BasePlayerManager {
player.getTeamManager().setupTemporaryTeam(towerTeams);
}
public TowerLevelData getCurrentTowerLevelDataMap() {
return GameData.getTowerLevelDataMap().get(getCurrentLevelId());
}
public int getCurrentMonsterLevel() {
// monsterLevel given in TowerLevelExcelConfigData.json is off by one.
return getCurrentTowerLevelDataMap().getMonsterLevel() + 1;
}
public void enterLevel(int enterPointId) {
var levelData = GameData.getTowerLevelDataMap().get(getCurrentLevelId());
var levelData = getCurrentTowerLevelDataMap();
var dungeonId = levelData.getDungeonId();
@ -140,7 +154,7 @@ public class TowerManager extends BasePlayerManager {
return 0;
}
var levelData = GameData.getTowerLevelDataMap().get(getCurrentLevelId());
var levelData = getCurrentTowerLevelDataMap();
// 0-based indexing. "star" = 0 means checking for 1-star conditions.
int star;
for (star = 2; star >= 0; star--) {

View File

@ -767,6 +767,20 @@ public class Scene {
return level;
}
public int getLevelForMonster(int configId, int defaultLevel) {
if (getDungeonManager() != null) {
return getDungeonManager().getLevelForMonster(configId);
} else if (getWorld().getWorldLevel() > 0) {
var worldLevelData =
GameData.getWorldLevelDataMap().get(getWorld().getWorldLevel());
if (worldLevelData != null) {
return worldLevelData.getMonsterLevel();
}
}
return defaultLevel;
}
public void checkNpcGroup() {
Set<SceneNpcBornEntry> npcBornEntries = ConcurrentHashMap.newKeySet();
for (Player player : this.getPlayers()) {

View File

@ -1069,18 +1069,7 @@ public class SceneScriptManager {
}
// Calculate level
int level = monster.level;
if (getScene().getDungeonManager() != null) {
level = getScene().getDungeonManager().getLevelForMonster(monster.config_id);
} else if (getScene().getWorld().getWorldLevel() > 0) {
var worldLevelData =
GameData.getWorldLevelDataMap().get(getScene().getWorld().getWorldLevel());
if (worldLevelData != null) {
level = worldLevelData.getMonsterLevel();
}
}
int level = getScene().getLevelForMonster(monster.config_id, monster.level);
// Spawn mob
EntityMonster entity = new EntityMonster(getScene(), data, monster.pos, monster.rot, level);