Fix start up errors
This commit is contained in:
@@ -207,7 +207,7 @@ namespace Game.Chat
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Command("info", RBACPermissions.CommandGuildInfo, true)]
|
[Command("list", RBACPermissions.CommandGuildInfo, true)]
|
||||||
static bool HandleGuildListCommand(CommandHandler handler)
|
static bool HandleGuildListCommand(CommandHandler handler)
|
||||||
{
|
{
|
||||||
string titleAndSummaryColor = handler.IsConsole() ? "" : "|cff00ff00";
|
string titleAndSummaryColor = handler.IsConsole() ? "" : "|cff00ff00";
|
||||||
|
|||||||
@@ -212,89 +212,6 @@ namespace Game.Chat
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandNonGroup("damage", RBACPermissions.CommandDamage)]
|
|
||||||
static bool HandleDamageCommand(CommandHandler handler, uint damage, OptionalArg<SpellSchools> school, OptionalArg<SpellInfo> spellInfo)
|
|
||||||
{
|
|
||||||
Unit target = handler.GetSelectedUnit();
|
|
||||||
if (target == null || handler.GetSession().GetPlayer().GetTarget().IsEmpty())
|
|
||||||
{
|
|
||||||
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Player player = target.ToPlayer();
|
|
||||||
if (player != null)
|
|
||||||
if (handler.HasLowerSecurity(player, ObjectGuid.Empty, false))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!target.IsAlive())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
Player attacker = handler.GetSession().GetPlayer();
|
|
||||||
|
|
||||||
// flat melee damage without resistence/etc reduction
|
|
||||||
if (!school.HasValue)
|
|
||||||
{
|
|
||||||
Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, SpellSchoolMask.Normal, null, false);
|
|
||||||
if (target != attacker)
|
|
||||||
attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, SpellSchoolMask.Normal, damage, 0, 0, VictimState.Hit, 0, 0);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SpellSchoolMask schoolmask = (SpellSchoolMask)(1 << (int)school.Value);
|
|
||||||
|
|
||||||
if (Unit.IsDamageReducedByArmor(schoolmask))
|
|
||||||
damage = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage, null, WeaponAttackType.BaseAttack);
|
|
||||||
|
|
||||||
// melee damage by specific school
|
|
||||||
if (!spellInfo.HasValue)
|
|
||||||
{
|
|
||||||
DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack);
|
|
||||||
Unit.CalcAbsorbResist(dmgInfo);
|
|
||||||
|
|
||||||
if (dmgInfo.GetDamage() == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
damage = dmgInfo.GetDamage();
|
|
||||||
|
|
||||||
uint absorb = dmgInfo.GetAbsorb();
|
|
||||||
uint resist = dmgInfo.GetResist();
|
|
||||||
Unit.DealDamageMods(attacker, target, ref damage, ref absorb);
|
|
||||||
Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, schoolmask, null, false);
|
|
||||||
attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, schoolmask, damage, absorb, resist, VictimState.Hit, 0, 0);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// non-melee damage
|
|
||||||
|
|
||||||
SpellNonMeleeDamage damageInfo = new(attacker, target, spellInfo, new SpellCastVisual(spellInfo.Value.GetSpellXSpellVisualId(attacker), 0), spellInfo.Value.SchoolMask);
|
|
||||||
damageInfo.damage = damage;
|
|
||||||
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
|
||||||
target.DealSpellDamage(damageInfo, true);
|
|
||||||
target.SendSpellNonMeleeDamageLog(damageInfo);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
[CommandNonGroup("damage go", RBACPermissions.CommandDamage)]
|
|
||||||
static bool HandleDamageGoCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> spawnId, int damage)
|
|
||||||
{
|
|
||||||
GameObject go = handler.GetObjectFromPlayerMapByDbGuid(spawnId);
|
|
||||||
if (go == null)
|
|
||||||
{
|
|
||||||
handler.SendSysMessage(CypherStrings.CommandObjnotfound, spawnId);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!go.IsDestructibleBuilding())
|
|
||||||
{
|
|
||||||
handler.SendSysMessage(CypherStrings.InvalidGameobjectType);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
go.ModifyHealth(-damage, handler.GetSession().GetPlayer());
|
|
||||||
handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), spawnId, -damage, go.GetGoValue().Building.Health);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
[CommandNonGroup("dev", RBACPermissions.CommandDev)]
|
[CommandNonGroup("dev", RBACPermissions.CommandDev)]
|
||||||
static bool HandleDevCommand(CommandHandler handler, OptionalArg<bool> enableArg)
|
static bool HandleDevCommand(CommandHandler handler, OptionalArg<bool> enableArg)
|
||||||
{
|
{
|
||||||
@@ -2163,7 +2080,7 @@ namespace Game.Chat
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Command("", RBACPermissions.CommandAdditem, true)]
|
[Command("", RBACPermissions.CommandAdditem)]
|
||||||
static bool HandleAddItemCommand(CommandHandler handler, VariantArg<ItemLinkData, uint, string> item, OptionalArg<int> countArg, OptionalArg<string> bonusListIdString, OptionalArg<byte> itemContextArg)
|
static bool HandleAddItemCommand(CommandHandler handler, VariantArg<ItemLinkData, uint, string> item, OptionalArg<int> countArg, OptionalArg<string> bonusListIdString, OptionalArg<byte> itemContextArg)
|
||||||
{
|
{
|
||||||
Player player = handler.GetSession().GetPlayer();
|
Player player = handler.GetSession().GetPlayer();
|
||||||
@@ -2265,4 +2182,91 @@ namespace Game.Chat
|
|||||||
return HandleAddItemCommandHelper(handler, player, target.GetConnectedPlayer(), item, countArg, bonusListIdString, itemContextArg);
|
return HandleAddItemCommandHelper(handler, player, target.GetConnectedPlayer(), item, countArg, bonusListIdString, itemContextArg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandGroup("damage")]
|
||||||
|
class MiscDamageCommands
|
||||||
|
{
|
||||||
|
[Command("", RBACPermissions.CommandDamage)]
|
||||||
|
static bool HandleDamageCommand(CommandHandler handler, uint damage, OptionalArg<SpellSchools> school, OptionalArg<SpellInfo> spellInfo)
|
||||||
|
{
|
||||||
|
Unit target = handler.GetSelectedUnit();
|
||||||
|
if (target == null || handler.GetSession().GetPlayer().GetTarget().IsEmpty())
|
||||||
|
{
|
||||||
|
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Player player = target.ToPlayer();
|
||||||
|
if (player != null)
|
||||||
|
if (handler.HasLowerSecurity(player, ObjectGuid.Empty, false))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!target.IsAlive())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Player attacker = handler.GetSession().GetPlayer();
|
||||||
|
|
||||||
|
// flat melee damage without resistence/etc reduction
|
||||||
|
if (!school.HasValue)
|
||||||
|
{
|
||||||
|
Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, SpellSchoolMask.Normal, null, false);
|
||||||
|
if (target != attacker)
|
||||||
|
attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, SpellSchoolMask.Normal, damage, 0, 0, VictimState.Hit, 0, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SpellSchoolMask schoolmask = (SpellSchoolMask)(1 << (int)school.Value);
|
||||||
|
|
||||||
|
if (Unit.IsDamageReducedByArmor(schoolmask))
|
||||||
|
damage = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage, null, WeaponAttackType.BaseAttack);
|
||||||
|
|
||||||
|
// melee damage by specific school
|
||||||
|
if (!spellInfo.HasValue)
|
||||||
|
{
|
||||||
|
DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack);
|
||||||
|
Unit.CalcAbsorbResist(dmgInfo);
|
||||||
|
|
||||||
|
if (dmgInfo.GetDamage() == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
damage = dmgInfo.GetDamage();
|
||||||
|
|
||||||
|
uint absorb = dmgInfo.GetAbsorb();
|
||||||
|
uint resist = dmgInfo.GetResist();
|
||||||
|
Unit.DealDamageMods(attacker, target, ref damage, ref absorb);
|
||||||
|
Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, schoolmask, null, false);
|
||||||
|
attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, schoolmask, damage, absorb, resist, VictimState.Hit, 0, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// non-melee damage
|
||||||
|
|
||||||
|
SpellNonMeleeDamage damageInfo = new(attacker, target, spellInfo, new SpellCastVisual(spellInfo.Value.GetSpellXSpellVisualId(attacker), 0), spellInfo.Value.SchoolMask);
|
||||||
|
damageInfo.damage = damage;
|
||||||
|
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
||||||
|
target.DealSpellDamage(damageInfo, true);
|
||||||
|
target.SendSpellNonMeleeDamageLog(damageInfo);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Command("go", RBACPermissions.CommandDamage)]
|
||||||
|
static bool HandleDamageGoCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> spawnId, int damage)
|
||||||
|
{
|
||||||
|
GameObject go = handler.GetObjectFromPlayerMapByDbGuid(spawnId);
|
||||||
|
if (go == null)
|
||||||
|
{
|
||||||
|
handler.SendSysMessage(CypherStrings.CommandObjnotfound, spawnId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!go.IsDestructibleBuilding())
|
||||||
|
{
|
||||||
|
handler.SendSysMessage(CypherStrings.InvalidGameobjectType);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
go.ModifyHealth(-damage, handler.GetSession().GetPlayer());
|
||||||
|
handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), spawnId, -damage, go.GetGoValue().Building.Health);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -500,7 +500,7 @@ namespace Game
|
|||||||
validateStartLevel(WorldCfg.StartAlliedRaceLevel, "StartDemonHunterPlayerLevel");
|
validateStartLevel(WorldCfg.StartAlliedRaceLevel, "StartDemonHunterPlayerLevel");
|
||||||
validateStartLevel(WorldCfg.MaxRecruitAFriendBonusPlayerLevel, "RecruitAFriend.MaxLevel");
|
validateStartLevel(WorldCfg.MaxRecruitAFriendBonusPlayerLevel, "RecruitAFriend.MaxLevel");
|
||||||
|
|
||||||
if ((int)Values[WorldCfg.StartGmLevel] < (int)Values[WorldCfg.StartPlayerLevel])
|
if ((uint)Values[WorldCfg.StartGmLevel] < (uint)Values[WorldCfg.StartPlayerLevel])
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ServerLoading, $"GM.StartLevel ({Values[WorldCfg.StartGmLevel]}) must be in range StartPlayerLevel({Values[WorldCfg.StartPlayerLevel]})..{SharedConst.MaxLevel}. Set to {Values[WorldCfg.StartPlayerLevel]}.");
|
Log.outError(LogFilter.ServerLoading, $"GM.StartLevel ({Values[WorldCfg.StartGmLevel]}) must be in range StartPlayerLevel({Values[WorldCfg.StartPlayerLevel]})..{SharedConst.MaxLevel}. Set to {Values[WorldCfg.StartPlayerLevel]}.");
|
||||||
Values[WorldCfg.StartGmLevel] = Values[WorldCfg.StartPlayerLevel];
|
Values[WorldCfg.StartGmLevel] = Values[WorldCfg.StartPlayerLevel];
|
||||||
@@ -508,18 +508,13 @@ namespace Game
|
|||||||
|
|
||||||
Log.outInfo(LogFilter.ServerLoading, $"Will clear `logs` table of entries older than {Values[WorldCfg.LogdbCleartime]} seconds every {Values[WorldCfg.LogdbClearinterval]} minutes.");
|
Log.outInfo(LogFilter.ServerLoading, $"Will clear `logs` table of entries older than {Values[WorldCfg.LogdbCleartime]} seconds every {Values[WorldCfg.LogdbClearinterval]} minutes.");
|
||||||
|
|
||||||
if ((int)Values[WorldCfg.MaxOverspeedPings] != 0 && (int)Values[WorldCfg.MaxOverspeedPings] < 2)
|
if ((uint)Values[WorldCfg.MaxOverspeedPings] != 0 && (uint)Values[WorldCfg.MaxOverspeedPings] < 2)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ServerLoading, $"MaxOverspeedPings ({Values[WorldCfg.MaxOverspeedPings]}) must be in range 2..infinity (or 0 to disable check). Set to 2.");
|
Log.outError(LogFilter.ServerLoading, $"MaxOverspeedPings ({Values[WorldCfg.MaxOverspeedPings]}) must be in range 2..infinity (or 0 to disable check). Set to 2.");
|
||||||
Values[WorldCfg.MaxOverspeedPings] = 2;
|
Values[WorldCfg.MaxOverspeedPings] = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// always use declined names in the russian client
|
if ((uint)Values[WorldCfg.ClientCacheVersion] == 0)
|
||||||
Cfg_CategoriesRecord category = CliDB.CfgCategoriesStorage.LookupByKey(Values[WorldCfg.RealmZone]);
|
|
||||||
if (category != null && category.GetCreateCharsetMask().HasFlag(CfgCategoriesCharsets.Russian))
|
|
||||||
Values[WorldCfg.DeclinedNamesUsed] = true;
|
|
||||||
|
|
||||||
if ((int)Values[WorldCfg.ClientCacheVersion] == 0)
|
|
||||||
Values[WorldCfg.ClientCacheVersion] = databaseCacheVersion;
|
Values[WorldCfg.ClientCacheVersion] = databaseCacheVersion;
|
||||||
|
|
||||||
void validateVisibilityDistance(WorldCfg config, string name)
|
void validateVisibilityDistance(WorldCfg config, string name)
|
||||||
@@ -545,17 +540,17 @@ namespace Game
|
|||||||
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceArena, "Visibility.Distance.Arenas");
|
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceArena, "Visibility.Distance.Arenas");
|
||||||
|
|
||||||
// No aggro from gray mobs
|
// No aggro from gray mobs
|
||||||
if ((int)Values[WorldCfg.NoGrayAggroAbove] > (int)Values[WorldCfg.MaxPlayerLevel])
|
if ((uint)Values[WorldCfg.NoGrayAggroAbove] > (uint)Values[WorldCfg.MaxPlayerLevel])
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
|
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
|
||||||
Values[WorldCfg.NoGrayAggroAbove] = Values[WorldCfg.MaxPlayerLevel];
|
Values[WorldCfg.NoGrayAggroAbove] = Values[WorldCfg.MaxPlayerLevel];
|
||||||
}
|
}
|
||||||
if ((int)Values[WorldCfg.NoGrayAggroBelow] > (int)Values[WorldCfg.MaxPlayerLevel])
|
if ((uint)Values[WorldCfg.NoGrayAggroBelow] > (uint)Values[WorldCfg.MaxPlayerLevel])
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
|
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
|
||||||
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.MaxPlayerLevel];
|
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.MaxPlayerLevel];
|
||||||
}
|
}
|
||||||
if ((int)Values[WorldCfg.NoGrayAggroAbove] > 0 && (int)Values[WorldCfg.NoGrayAggroAbove] < (int)Values[WorldCfg.NoGrayAggroBelow])
|
if ((uint)Values[WorldCfg.NoGrayAggroAbove] > 0 && (uint)Values[WorldCfg.NoGrayAggroAbove] < (uint)Values[WorldCfg.NoGrayAggroBelow])
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) cannot be greater than NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}). Set to {Values[WorldCfg.NoGrayAggroAbove]}.");
|
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) cannot be greater than NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}). Set to {Values[WorldCfg.NoGrayAggroAbove]}.");
|
||||||
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.NoGrayAggroAbove];
|
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.NoGrayAggroAbove];
|
||||||
|
|||||||
Reference in New Issue
Block a user