Hondacrx
2025-09-01 16:48:59 -04:00
parent 2903501994
commit 4be7b55672
37 changed files with 1594 additions and 570 deletions
@@ -177,6 +177,12 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale" + PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale" +
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// BattlePetAbility.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_ABILITY, "SELECT ID, Name, Description, IconFileDataID, PetTypeEnum, Cooldown, BattlePetVisualID, Flags" +
" FROM battle_pet_ability WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_ABILITY_LOCALE, "SELECT ID, Name_lang, Description_lang FROM battle_pet_ability_locale" +
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// BattlePetBreedQuality.db2 // BattlePetBreedQuality.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, MaxQualityRoll, StateMultiplier, QualityEnum FROM battle_pet_breed_quality" + PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, MaxQualityRoll, StateMultiplier, QualityEnum FROM battle_pet_breed_quality" +
" WHERE (`VerifiedBuild` > 0) = ?"); " WHERE (`VerifiedBuild` > 0) = ?");
@@ -1026,6 +1032,12 @@ namespace Framework.Database
// PathProperty.db2 // PathProperty.db2
PrepareStatement(HotfixStatements.SEL_PATH_PROPERTY, "SELECT ID, PathID, PropertyIndex, Value FROM path_property WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_PATH_PROPERTY, "SELECT ID, PathID, PropertyIndex, Value FROM path_property WHERE (`VerifiedBuild` > 0) = ?");
// PerksActivity.db2
PrepareStatement(HotfixStatements.SEL_PERKS_ACTIVITY, "SELECT ActivityName, Description, ID, CriteriaTreeID, ThresholdContributionAmount, Supersedes, " +
"Priority FROM perks_activity WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_PERKS_ACTIVITY_LOCALE, "SELECT ID, ActivityName_lang, Description_lang FROM perks_activity_locale" +
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// Phase.db2 // Phase.db2
PrepareStatement(HotfixStatements.SEL_PHASE, "SELECT ID, Flags FROM phase WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_PHASE, "SELECT ID, Flags FROM phase WHERE (`VerifiedBuild` > 0) = ?");
@@ -1769,6 +1781,9 @@ namespace Framework.Database
SEL_BARBER_SHOP_STYLE, SEL_BARBER_SHOP_STYLE,
SEL_BARBER_SHOP_STYLE_LOCALE, SEL_BARBER_SHOP_STYLE_LOCALE,
SEL_BATTLE_PET_ABILITY,
SEL_BATTLE_PET_ABILITY_LOCALE,
SEL_BATTLE_PET_BREED_QUALITY, SEL_BATTLE_PET_BREED_QUALITY,
SEL_BATTLE_PET_BREED_STATE, SEL_BATTLE_PET_BREED_STATE,
@@ -2169,6 +2184,9 @@ namespace Framework.Database
SEL_PATH_PROPERTY, SEL_PATH_PROPERTY,
SEL_PERKS_ACTIVITY,
SEL_PERKS_ACTIVITY_LOCALE,
SEL_PHASE, SEL_PHASE,
SEL_PHASE_X_PHASE_GROUP, SEL_PHASE_X_PHASE_GROUP,
+93 -19
View File
@@ -26,13 +26,13 @@ namespace Game.Chat
static ChatCommandResult TryConsumeTo(dynamic[] tuple, int offset, ParameterInfo[] parameterInfos, CommandHandler handler, string args) static ChatCommandResult TryConsumeTo(dynamic[] tuple, int offset, ParameterInfo[] parameterInfos, CommandHandler handler, string args)
{ {
var optionalArgAttribute = parameterInfos[offset].GetCustomAttribute<OptionalArgAttribute>(true); if (parameterInfos[offset].ParameterType.IsGenericType && parameterInfos[offset].ParameterType.GetGenericTypeDefinition() == typeof(OptionalArg<>))
if (optionalArgAttribute != null || parameterInfos[offset].ParameterType.IsGenericType && parameterInfos[offset].ParameterType.GetGenericTypeDefinition() == typeof(Nullable<>))
{ {
// try with the argument // try with the argument
Type myArg = Nullable.GetUnderlyingType(parameterInfos[offset].ParameterType) ?? parameterInfos[offset].ParameterType; Type myArg = parameterInfos[offset].ParameterType.GetGenericArguments()?[0];
ChatCommandResult result1 = TryConsume(out tuple[offset], myArg, handler, args); ChatCommandResult result1 = TryConsume(out dynamic tempValue, myArg, handler, args);
tuple[offset] = Activator.CreateInstance(typeof(OptionalArg<>).MakeGenericType(myArg), [tempValue]);
if (result1.IsSuccessful()) if (result1.IsSuccessful())
if ((result1 = ConsumeFromOffset(tuple, offset + 1, parameterInfos, handler, result1)).IsSuccessful()) if ((result1 = ConsumeFromOffset(tuple, offset + 1, parameterInfos, handler, result1)).IsSuccessful())
return result1; return result1;
@@ -55,9 +55,9 @@ namespace Game.Chat
{ {
ChatCommandResult next; ChatCommandResult next;
var variantArgAttribute = parameterInfos[offset].GetCustomAttribute<VariantArgAttribute>(true); var genericTypes = parameterInfos[offset].ParameterType.GetGenericArguments();
if (variantArgAttribute != null) if (!genericTypes.Empty())
next = TryConsumeVariant(out tuple[offset], variantArgAttribute.Types, handler, args); next = TryConsumeVariant(out tuple[offset], parameterInfos[offset].ParameterType, genericTypes, handler, args);
else else
next = TryConsume(out tuple[offset], parameterInfos[offset].ParameterType, handler, args); next = TryConsume(out tuple[offset], parameterInfos[offset].ParameterType, handler, args);
@@ -238,54 +238,123 @@ namespace Game.Chat
return val.TryConsume(handler, args); return val.TryConsume(handler, args);
case nameof(AchievementRecord): case nameof(AchievementRecord):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(AchievementLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Achievement) != null)
return result;
result = TryConsume(out tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful() || (val = CliDB.AchievementStorage.LookupByKey((uint)tempVal)) != null) if (!result.IsSuccessful() || (val = CliDB.AchievementStorage.LookupByKey((uint)tempVal)) != null)
return result; return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserAchievementNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserAchievementNoExist, tempVal));
return result;
} }
case nameof(CurrencyTypesRecord): case nameof(CurrencyTypesRecord):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(CurrencyLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Currency) != null)
return result;
result = TryConsume(out tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful() || (val = CliDB.CurrencyTypesStorage.LookupByKey((uint)tempVal)) != null) if (!result.IsSuccessful() || (val = CliDB.CurrencyTypesStorage.LookupByKey((uint)tempVal)) != null)
return result; return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserCurrencyNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserCurrencyNoExist, tempVal));
return result;
} }
case nameof(GameTele): case nameof(GameTele):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(TeleLinkData), handler, args);
if (!result.IsSuccessful()) if (result.IsSuccessful() && (val = Global.ObjectMgr.GetGameTele(tempVal)) != null)
result = TryConsume(out tempVal, typeof(string), handler, args); return result;
result = TryConsume(out tempVal, typeof(string), handler, args);
if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetGameTele(tempVal)) != null) if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetGameTele(tempVal)) != null)
return result; return result;
if (tempVal is uint)
if (tempVal is not string)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleIdNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleIdNoExist, tempVal));
else else
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleNoExist, tempVal));
} }
case nameof(ItemTemplate): case nameof(ItemTemplate):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(ItemLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Item) != null)
return result;
result = TryConsume(out tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetItemTemplate(tempVal)) != null) if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetItemTemplate(tempVal)) != null)
return result; return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserItemNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserItemNoExist, tempVal));
return result;
} }
case nameof(SpellInfo): case nameof(SpellInfo):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); SpellInfo getSpellInfo(uint spellId)
if (!result.IsSuccessful() || (val = Global.SpellMgr.GetSpellInfo(tempVal, Difficulty.None)) != null) {
return Global.SpellMgr.GetSpellInfo(spellId, Difficulty.None);
}
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(ArtifactPowerLinkData), handler, args);
if (result.IsSuccessful() && (val = getSpellInfo(tempVal.ArtifactPower.SpellID)) != null)
return result;
result = TryConsume(out tempVal, typeof(ConduitLinkData), handler, args);
if (result.IsSuccessful() && (val = getSpellInfo(tempVal.SpellID)) != null)
return result;
result = TryConsume(out tempVal, typeof(EnchantLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal) != null)
return result;
result = TryConsume(out tempVal, typeof(MawPowerLinkData), handler, args);
if (result.IsSuccessful() && (val = getSpellInfo(tempVal.SpellID)) != null)
return result;
result = TryConsume(out tempVal, typeof(MountLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Spell) != null)
return result;
result = TryConsume(out tempVal, typeof(PvpTalLinkData), handler, args);
if (result.IsSuccessful() && (val = getSpellInfo(tempVal.SpellID)) != null)
return result;
result = TryConsume(out tempVal, typeof(SpellLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Spell) != null)
return result;
result = TryConsume(out tempVal, typeof(TalentBuildLinkData), handler, args);
if (result.IsSuccessful() && (val = getSpellInfo(tempVal.SpellID)) != null)
return result;
result = TryConsume(out tempVal, typeof(TradeskillLinkData), handler, args);
if (!result.IsSuccessful() || (val = tempVal.Spell) != null)
return result; return result;
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserSpellNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserSpellNoExist, tempVal));
} }
case nameof(Quest): case nameof(Quest):
{ {
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(QuestLinkData), handler, args);
if (result.IsSuccessful() && (val = tempVal.Quest) != null)
return result;
result = TryConsume(out tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetQuestTemplate(tempVal)) != null) if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetQuestTemplate(tempVal)) != null)
return result; return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserQuestNoExist, tempVal)); return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserQuestNoExist, tempVal));
return result;
} }
} }
break; break;
@@ -295,11 +364,16 @@ namespace Game.Chat
return default; return default;
} }
public static ChatCommandResult TryConsumeVariant(out dynamic val, Type[] types, CommandHandler handler, string args) public static ChatCommandResult TryConsumeVariant(out dynamic val, Type type, Type[] types, CommandHandler handler, string args)
{ {
ChatCommandResult result = TryAtIndex(out val, types, 0, handler, args); val = default;
ChatCommandResult result = TryAtIndex(out dynamic tempVal, types, 0, handler, args);
if (result.HasErrorMessage() && (result.GetErrorMessage().IndexOf('\n') != -1)) if (result.HasErrorMessage() && (result.GetErrorMessage().IndexOf('\n') != -1))
return ChatCommandResult.FromErrorMessage($"{handler.GetCypherString(CypherStrings.CmdparserEither)} {result.GetErrorMessage()}"); return ChatCommandResult.FromErrorMessage($"{handler.GetCypherString(CypherStrings.CmdparserEither)} {result.GetErrorMessage()}");
val = Activator.CreateInstance(type);
val.Set(tempVal);
return result; return result;
} }
+48 -21
View File
@@ -64,40 +64,67 @@ namespace Game.Chat
public CommandNonGroupAttribute(string command, RBACPermissions rbac, bool allowConsole = false) : base(command, rbac, allowConsole) { } public CommandNonGroupAttribute(string command, RBACPermissions rbac, bool allowConsole = false) : base(command, rbac, allowConsole) { }
} }
[AttributeUsage(AttributeTargets.Parameter)] public struct OptionalArg<T>
public class OptionalArgAttribute : Attribute { }
public class VariantArgAttribute : Attribute
{ {
public Type[] Types { get; set; } public T Value { get; set { field = value; HasValue = true; } }
public bool HasValue { get; private set; }
public VariantArgAttribute(params Type[] types) public OptionalArg(T value)
{ {
Types = types; Value = value;
}
} }
[AttributeUsage(AttributeTargets.Parameter)] public T GetValueOrDefault(T defaultValue) => HasValue ? Value : defaultValue;
public class VariantArg<T1> : VariantArgAttribute
{ public static implicit operator T(OptionalArg<T> optionalArg) => optionalArg.Value;
public VariantArg() : base(typeof(T1)) { } public static implicit operator OptionalArg<T>(T value) => new OptionalArg<T>(value);
} }
[AttributeUsage(AttributeTargets.Parameter)] public class VariantArg<T1>
public class VariantArg<T1, T2> : VariantArgAttribute
{ {
public VariantArg() : base(typeof(T1), typeof(T2)) { } dynamic value;
public dynamic GetValue() { return value; }
public bool Set(dynamic val)
{
return CheckAndSet<T1>(val);
} }
[AttributeUsage(AttributeTargets.Parameter)] public bool Is<T>() { return value is T; }
public class VariantArg<T1, T2, T3> : VariantArgAttribute
internal bool CheckAndSet<T>(dynamic val)
{ {
public VariantArg() : base(typeof(T1), typeof(T2), typeof(T3)) { } if (val is not T)
return false;
value = val;
return true;
} }
[AttributeUsage(AttributeTargets.Parameter)] public static implicit operator T1(VariantArg<T1> variant) => variant.GetValue();
public class VariantArg<T1, T2, T3, T4> : VariantArgAttribute }
public class VariantArg<T1, T2> : VariantArg<T1>
{ {
public VariantArg() : base(typeof(T1), typeof(T2), typeof(T3), typeof(T4)) { } public new bool Set(dynamic val)
{
return CheckAndSet<T1>(val) || CheckAndSet<T2>(val);
}
public static implicit operator T1(VariantArg<T1, T2> variant) => variant.GetValue();
public static implicit operator T2(VariantArg<T1, T2> variant) => variant.Is<T2>() ? variant.GetValue() : default;
}
public class VariantArg<T1, T2, T3> : VariantArg<T1, T2>
{
public new bool Set(dynamic val)
{
return CheckAndSet<T1>(val) || CheckAndSet<T2>(val) || CheckAndSet<T3>(val);
}
public static implicit operator T1(VariantArg<T1, T2, T3> variant) => variant.GetValue();
public static implicit operator T2(VariantArg<T1, T2, T3> variant) => variant.GetValue();
public static implicit operator T3(VariantArg<T1, T2, T3> variant) => variant.GetValue();
} }
} }
+1 -1
View File
@@ -399,7 +399,7 @@ namespace Game.Chat
public bool Invoke(CommandHandler handler, string args) public bool Invoke(CommandHandler handler, string args)
{ {
if (parameters.Any(p => p.ParameterType == typeof(StringArguments)))//Old system, can remove once all commands are changed. if (parameters.Any(p => p.ParameterType == typeof(StringArguments)))//Old system, can remove once all commands are changed.
return (bool)_methodInfo.Invoke(null, new object[] { handler, new StringArguments(args) }); return (bool)_methodInfo.Invoke(null, [handler, new StringArguments(args)]);
else else
{ {
var parseArgs = new dynamic[parameters.Length]; var parseArgs = new dynamic[parameters.Length];
+21 -19
View File
@@ -55,7 +55,7 @@ namespace Game.Chat
} }
[Command("2fa remove", CypherStrings.CommandAcc2faRemoveHelp, RBACPermissions.CommandAccount2FaRemove)] [Command("2fa remove", CypherStrings.CommandAcc2faRemoveHelp, RBACPermissions.CommandAccount2FaRemove)]
static bool HandleAccount2FARemoveCommand(CommandHandler handler, uint? token) static bool HandleAccount2FARemoveCommand(CommandHandler handler, OptionalArg<uint> token)
{ {
/*var masterKey = Global.SecretMgr.GetSecret(Secrets.TOTPMasterKey); /*var masterKey = Global.SecretMgr.GetSecret(Secrets.TOTPMasterKey);
if (!masterKey.IsAvailable()) if (!masterKey.IsAvailable())
@@ -118,7 +118,7 @@ namespace Game.Chat
} }
[Command("2fa setup", CypherStrings.CommandAcc2faSetupHelp, RBACPermissions.CommandAccount2FaSetup)] [Command("2fa setup", CypherStrings.CommandAcc2faSetupHelp, RBACPermissions.CommandAccount2FaSetup)]
static bool HandleAccount2FASetupCommand(CommandHandler handler, uint? token) static bool HandleAccount2FASetupCommand(CommandHandler handler, OptionalArg<uint> token)
{ {
/*var masterKey = Global.SecretMgr.GetSecret(Secrets.TOTPMasterKey); /*var masterKey = Global.SecretMgr.GetSecret(Secrets.TOTPMasterKey);
if (!masterKey.IsAvailable()) if (!masterKey.IsAvailable())
@@ -197,7 +197,7 @@ namespace Game.Chat
} }
[Command("create", CypherStrings.CommandAccCreateHelp, RBACPermissions.CommandAccountCreate, true)] [Command("create", CypherStrings.CommandAccCreateHelp, RBACPermissions.CommandAccountCreate, true)]
static bool HandleAccountCreateCommand(CommandHandler handler, string accountName, string password, [OptionalArg] string email) static bool HandleAccountCreateCommand(CommandHandler handler, string accountName, string password, OptionalArg<string> email)
{ {
if (accountName.Contains("@")) if (accountName.Contains("@"))
{ {
@@ -205,7 +205,7 @@ namespace Game.Chat
return false; return false;
} }
AccountOpResult result = Global.AccountMgr.CreateAccount(accountName, password, email ?? ""); AccountOpResult result = Global.AccountMgr.CreateAccount(accountName, password, email.GetValueOrDefault(""));
switch (result) switch (result)
{ {
case AccountOpResult.Ok: case AccountOpResult.Ok:
@@ -215,7 +215,7 @@ namespace Game.Chat
Log.outInfo(LogFilter.Player, "Account: {0} (IP: {1}) Character:[{2}] (GUID: {3}) created Account {4} (Email: '{5}')", Log.outInfo(LogFilter.Player, "Account: {0} (IP: {1}) Character:[{2}] (GUID: {3}) created Account {4} (Email: '{5}')",
handler.GetSession().GetAccountId(), handler.GetSession().GetRemoteAddress(), handler.GetSession().GetAccountId(), handler.GetSession().GetRemoteAddress(),
handler.GetSession().GetPlayer().GetName(), handler.GetSession().GetPlayer().GetGUID().ToString(), handler.GetSession().GetPlayer().GetName(), handler.GetSession().GetPlayer().GetGUID().ToString(),
accountName, email ?? ""); accountName, email.GetValueOrDefault(""));
} }
break; break;
case AccountOpResult.NameTooLong: case AccountOpResult.NameTooLong:
@@ -337,7 +337,7 @@ namespace Game.Chat
} }
[Command("password", CypherStrings.CommandAccPasswordHelp, RBACPermissions.CommandAccountPassword)] [Command("password", CypherStrings.CommandAccPasswordHelp, RBACPermissions.CommandAccountPassword)]
static bool HandleAccountPasswordCommand(CommandHandler handler, string oldPassword, string newPassword, string confirmPassword, [OptionalArg] string confirmEmail) static bool HandleAccountPasswordCommand(CommandHandler handler, string oldPassword, string newPassword, string confirmPassword, OptionalArg<string> confirmEmail)
{ {
// First, we check config. What security type (sec type) is it ? Depending on it, the command branches out // First, we check config. What security type (sec type) is it ? Depending on it, the command branches out
uint pwConfig = WorldConfig.GetUIntValue(WorldCfg.AccPasschangesec); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC uint pwConfig = WorldConfig.GetUIntValue(WorldCfg.AccPasschangesec); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC
@@ -466,34 +466,34 @@ namespace Game.Chat
[Command("", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)] [Command("", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)]
static bool HandleAccountOnlineListCommand(CommandHandler handler) static bool HandleAccountOnlineListCommand(CommandHandler handler)
{ {
return HandleAccountOnlineListCommandWithParameters(handler, null, null, null, null); return HandleAccountOnlineListCommandWithParameters(handler, null, default, default, default);
} }
[Command("ip", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)] [Command("ip", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)]
static bool HandleAccountOnlineListWithIpFilterCommand(CommandHandler handler, string ipAddress) static bool HandleAccountOnlineListWithIpFilterCommand(CommandHandler handler, string ipAddress)
{ {
return HandleAccountOnlineListCommandWithParameters(handler, ipAddress, null, null, null); return HandleAccountOnlineListCommandWithParameters(handler, ipAddress, default, default, default);
} }
[Command("limit", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)] [Command("limit", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)]
static bool HandleAccountOnlineListWithLimitCommand(CommandHandler handler, uint limit) static bool HandleAccountOnlineListWithLimitCommand(CommandHandler handler, uint limit)
{ {
return HandleAccountOnlineListCommandWithParameters(handler, null, limit, null, null); return HandleAccountOnlineListCommandWithParameters(handler, null, limit, default, default);
} }
[Command("map", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)] [Command("map", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)]
static bool HandleAccountOnlineListWithMapFilterCommand(CommandHandler handler, uint mapId) static bool HandleAccountOnlineListWithMapFilterCommand(CommandHandler handler, uint mapId)
{ {
return HandleAccountOnlineListCommandWithParameters(handler, null, null, mapId, null); return HandleAccountOnlineListCommandWithParameters(handler, null, default, mapId, default);
} }
[Command("zone", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)] [Command("zone", CypherStrings.CommandAccOnlinelistHelp, RBACPermissions.CommandAccountOnlineList, true)]
static bool HandleAccountOnlineListWithZoneFilterCommand(CommandHandler handler, uint zoneId) static bool HandleAccountOnlineListWithZoneFilterCommand(CommandHandler handler, uint zoneId)
{ {
return HandleAccountOnlineListCommandWithParameters(handler, null, null, null, zoneId); return HandleAccountOnlineListCommandWithParameters(handler, null, default, default, zoneId);
} }
static bool HandleAccountOnlineListCommandWithParameters(CommandHandler handler, string ipAddress, uint? limit, uint? mapId, uint? zoneId) static bool HandleAccountOnlineListCommandWithParameters(CommandHandler handler, string ipAddress, OptionalArg<uint> limit, OptionalArg<uint> mapId, OptionalArg<uint> zoneId)
{ {
int sessionsMatchCount = 0; int sessionsMatchCount = 0;
@@ -614,13 +614,13 @@ namespace Game.Chat
} }
[Command("addon", CypherStrings.CommandAccSetAddonHelp, RBACPermissions.CommandAccountSetAddon, true)] [Command("addon", CypherStrings.CommandAccSetAddonHelp, RBACPermissions.CommandAccountSetAddon, true)]
static bool HandleAccountSetAddonCommand(CommandHandler handler, [OptionalArg] string accountName, byte expansion) static bool HandleAccountSetAddonCommand(CommandHandler handler, OptionalArg<string> accountName, byte expansion)
{ {
uint accountId; uint accountId;
if (!accountName.IsEmpty()) if (accountName.HasValue)
{ {
// Convert Account name to Upper Format // Convert Account name to Upper Format
accountName = accountName.ToUpper(); accountName = accountName.Value.ToUpper();
accountId = Global.AccountMgr.GetId(accountName); accountId = Global.AccountMgr.GetId(accountName);
if (accountId == 0) if (accountId == 0)
@@ -636,7 +636,8 @@ namespace Game.Chat
return false; return false;
accountId = player.GetSession().GetAccountId(); accountId = player.GetSession().GetAccountId();
Global.AccountMgr.GetName(accountId, out accountName); Global.AccountMgr.GetName(accountId, out string tempAccountName);
accountName = tempAccountName;
} }
// Let set addon state only for lesser (strong) security level // Let set addon state only for lesser (strong) security level
@@ -702,10 +703,10 @@ namespace Game.Chat
[Command("seclevel", CypherStrings.CommandAccSetSeclevelHelp, RBACPermissions.CommandAccountSetSecLevel, true)] [Command("seclevel", CypherStrings.CommandAccSetSeclevelHelp, RBACPermissions.CommandAccountSetSecLevel, true)]
[Command("gmlevel", CypherStrings.CommandAccSetSeclevelHelp, RBACPermissions.CommandAccountSetSecLevel, true)] [Command("gmlevel", CypherStrings.CommandAccSetSeclevelHelp, RBACPermissions.CommandAccountSetSecLevel, true)]
static bool HandleAccountSetSecLevelCommand(CommandHandler handler, [OptionalArg] string accountName, byte securityLevel, int? realmId) static bool HandleAccountSetSecLevelCommand(CommandHandler handler, OptionalArg<string> accountName, byte securityLevel, OptionalArg<int> realmId)
{ {
uint accountId; uint accountId;
if (!accountName.IsEmpty()) if (accountName.HasValue)
{ {
accountId = Global.AccountMgr.GetId(accountName); accountId = Global.AccountMgr.GetId(accountName);
if (accountId == 0) if (accountId == 0)
@@ -721,7 +722,8 @@ namespace Game.Chat
return false; return false;
accountId = player.GetSession().GetAccountId(); accountId = player.GetSession().GetAccountId();
Global.AccountMgr.GetName(accountId, out accountName); Global.AccountMgr.GetName(accountId, out string tempAccountName);
accountName = tempAccountName;
} }
if (securityLevel > (uint)AccountTypes.Console) if (securityLevel > (uint)AccountTypes.Console)
@@ -12,7 +12,7 @@ namespace Game.Chat.Commands
class BNetAccountCommands class BNetAccountCommands
{ {
[Command("create", RBACPermissions.CommandBnetAccountCreate, true)] [Command("create", RBACPermissions.CommandBnetAccountCreate, true)]
static bool HandleAccountCreateCommand(CommandHandler handler, string accountName, string password, bool? createGameAccount) static bool HandleAccountCreateCommand(CommandHandler handler, string accountName, string password, OptionalArg<bool> createGameAccount)
{ {
if (accountName.IsEmpty() || !accountName.Contains('@')) if (accountName.IsEmpty() || !accountName.Contains('@'))
{ {
+4 -4
View File
@@ -269,13 +269,13 @@ namespace Game.Chat.Commands
class BanListCommands class BanListCommands
{ {
[Command("account", RBACPermissions.CommandBanlistAccount, true)] [Command("account", RBACPermissions.CommandBanlistAccount, true)]
static bool HandleBanListAccountCommand(CommandHandler handler, [OptionalArg] string filter) static bool HandleBanListAccountCommand(CommandHandler handler, OptionalArg<string> filter)
{ {
PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS); PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS);
DB.Login.Execute(stmt); DB.Login.Execute(stmt);
SQLResult result; SQLResult result;
if (filter.IsEmpty()) if (!filter.HasValue)
{ {
stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_ACCOUNT_BANNED_ALL); stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_ACCOUNT_BANNED_ALL);
result = DB.Login.Query(stmt); result = DB.Login.Query(stmt);
@@ -378,14 +378,14 @@ namespace Game.Chat.Commands
} }
[Command("ip", RBACPermissions.CommandBanlistIp, true)] [Command("ip", RBACPermissions.CommandBanlistIp, true)]
static bool HandleBanListIPCommand(CommandHandler handler, [OptionalArg] string filter) static bool HandleBanListIPCommand(CommandHandler handler, OptionalArg<string> filter)
{ {
PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS); PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS);
DB.Login.Execute(stmt); DB.Login.Execute(stmt);
SQLResult result; SQLResult result;
if (filter.IsEmpty()) if (!filter.HasValue)
{ {
stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_IP_BANNED_ALL); stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_IP_BANNED_ALL);
result = DB.Login.Query(stmt); result = DB.Login.Query(stmt);
+6 -6
View File
@@ -13,7 +13,7 @@ namespace Game.Chat
class CastCommands class CastCommands
{ {
[Command("", RBACPermissions.CommandCast)] [Command("", RBACPermissions.CommandCast)]
static bool HandleCastCommand(CommandHandler handler, uint spellId, [OptionalArg] string triggeredStr) static bool HandleCastCommand(CommandHandler handler, uint spellId, OptionalArg<string> triggeredStr)
{ {
Unit target = handler.GetSelectedUnit(); Unit target = handler.GetSelectedUnit();
if (target == null) if (target == null)
@@ -34,7 +34,7 @@ namespace Game.Chat
} }
[Command("back", RBACPermissions.CommandCastBack)] [Command("back", RBACPermissions.CommandCastBack)]
static bool HandleCastBackCommand(CommandHandler handler, uint spellId, [OptionalArg] string triggeredStr) static bool HandleCastBackCommand(CommandHandler handler, uint spellId, OptionalArg<string> triggeredStr)
{ {
Creature caster = handler.GetSelectedCreature(); Creature caster = handler.GetSelectedCreature();
if (caster == null) if (caster == null)
@@ -56,7 +56,7 @@ namespace Game.Chat
} }
[Command("dist", RBACPermissions.CommandCastDist)] [Command("dist", RBACPermissions.CommandCastDist)]
static bool HandleCastDistCommand(CommandHandler handler, uint spellId, float dist, [OptionalArg] string triggeredStr) static bool HandleCastDistCommand(CommandHandler handler, uint spellId, float dist, OptionalArg<string> triggeredStr)
{ {
if (CheckSpellExistsAndIsValid(handler, spellId)) if (CheckSpellExistsAndIsValid(handler, spellId))
return false; return false;
@@ -74,7 +74,7 @@ namespace Game.Chat
} }
[Command("self", RBACPermissions.CommandCastSelf)] [Command("self", RBACPermissions.CommandCastSelf)]
static bool HandleCastSelfCommand(CommandHandler handler, uint spellId, [OptionalArg] string triggeredStr) static bool HandleCastSelfCommand(CommandHandler handler, uint spellId, OptionalArg<string> triggeredStr)
{ {
Unit target = handler.GetSelectedUnit(); Unit target = handler.GetSelectedUnit();
if (target == null) if (target == null)
@@ -96,7 +96,7 @@ namespace Game.Chat
} }
[Command("target", RBACPermissions.CommandCastTarget)] [Command("target", RBACPermissions.CommandCastTarget)]
static bool HandleCastTargetCommad(CommandHandler handler, uint spellId, [OptionalArg] string triggeredStr) static bool HandleCastTargetCommad(CommandHandler handler, uint spellId, OptionalArg<string> triggeredStr)
{ {
Creature caster = handler.GetSelectedCreature(); Creature caster = handler.GetSelectedCreature();
if (caster == null) if (caster == null)
@@ -124,7 +124,7 @@ namespace Game.Chat
} }
[Command("dest", RBACPermissions.CommandCastDest)] [Command("dest", RBACPermissions.CommandCastDest)]
static bool HandleCastDestCommand(CommandHandler handler, uint spellId, float x, float y, float z, [OptionalArg] string triggeredStr) static bool HandleCastDestCommand(CommandHandler handler, uint spellId, float x, float y, float z, OptionalArg<string> triggeredStr)
{ {
Unit caster = handler.GetSelectedUnit(); Unit caster = handler.GetSelectedUnit();
if (caster == null) if (caster == null)
+16 -13
View File
@@ -63,9 +63,9 @@ namespace Game.Chat
//rename characters //rename characters
[Command("rename", RBACPermissions.CommandCharacterRename, true)] [Command("rename", RBACPermissions.CommandCharacterRename, true)]
static bool HandleCharacterRenameCommand(CommandHandler handler, PlayerIdentifier player, [OptionalArg] string newName) static bool HandleCharacterRenameCommand(CommandHandler handler, PlayerIdentifier player, OptionalArg<string> newNameV)
{ {
if (player == null && !newName.IsEmpty()) if (player == null && !newNameV.HasValue)
return false; return false;
if (player == null) if (player == null)
@@ -77,8 +77,9 @@ namespace Game.Chat
if (handler.HasLowerSecurity(null, player.GetGUID())) if (handler.HasLowerSecurity(null, player.GetGUID()))
return false; return false;
if (!newName.IsEmpty()) if (newNameV.HasValue)
{ {
string newName = newNameV;
if (!ObjectManager.NormalizePlayerName(ref newName)) if (!ObjectManager.NormalizePlayerName(ref newName))
{ {
handler.SendSysMessage(CypherStrings.BadValue); handler.SendSysMessage(CypherStrings.BadValue);
@@ -455,7 +456,7 @@ namespace Game.Chat
} }
[Command("list", RBACPermissions.CommandCharacterDeletedList, true)] [Command("list", RBACPermissions.CommandCharacterDeletedList, true)]
static bool HandleCharacterDeletedListCommand(CommandHandler handler, [OptionalArg] string needle) static bool HandleCharacterDeletedListCommand(CommandHandler handler, OptionalArg<string> needle)
{ {
List<DeletedInfo> foundList = new(); List<DeletedInfo> foundList = new();
if (!GetDeletedCharacterInfoList(foundList, needle)) if (!GetDeletedCharacterInfoList(foundList, needle))
@@ -474,7 +475,7 @@ namespace Game.Chat
} }
[Command("restore", RBACPermissions.CommandCharacterDeletedRestore, true)] [Command("restore", RBACPermissions.CommandCharacterDeletedRestore, true)]
static bool HandleCharacterDeletedRestoreCommand(CommandHandler handler, string needle, [OptionalArg] string newCharName, AccountIdentifier newAccount) static bool HandleCharacterDeletedRestoreCommand(CommandHandler handler, string needle, OptionalArg<string> newCharName, AccountIdentifier newAccount)
{ {
List<DeletedInfo> foundList = new(); List<DeletedInfo> foundList = new();
if (!GetDeletedCharacterInfoList(foundList, needle)) if (!GetDeletedCharacterInfoList(foundList, needle))
@@ -489,7 +490,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.CharacterDeletedRestore); handler.SendSysMessage(CypherStrings.CharacterDeletedRestore);
HandleCharacterDeletedListHelper(foundList, handler); HandleCharacterDeletedListHelper(foundList, handler);
if (newCharName.IsEmpty()) if (!newCharName.HasValue)
{ {
// Drop not existed account cases // Drop not existed account cases
foreach (var info in foundList) foreach (var info in foundList)
@@ -521,7 +522,7 @@ namespace Game.Chat
} }
[Command("old", RBACPermissions.CommandCharacterDeletedOld, true)] [Command("old", RBACPermissions.CommandCharacterDeletedOld, true)]
static bool HandleCharacterDeletedOldCommand(CommandHandler handler, ushort? days) static bool HandleCharacterDeletedOldCommand(CommandHandler handler, OptionalArg<ushort> days)
{ {
int keepDays = WorldConfig.GetIntValue(WorldCfg.ChardeleteKeepDays); int keepDays = WorldConfig.GetIntValue(WorldCfg.ChardeleteKeepDays);
@@ -658,13 +659,15 @@ namespace Game.Chat
} }
[CommandNonGroup("levelup", RBACPermissions.CommandLevelup)] [CommandNonGroup("levelup", RBACPermissions.CommandLevelup)]
static bool HandleLevelUpCommand(CommandHandler handler, [OptionalArg]PlayerIdentifier player, short level) static bool HandleLevelUpCommand(CommandHandler handler, OptionalArg<PlayerIdentifier> playerIdentifier, short level)
{ {
if (player == null) if (!playerIdentifier.HasValue)
player = PlayerIdentifier.FromTargetOrSelf(handler); playerIdentifier = PlayerIdentifier.FromTargetOrSelf(handler);
if (player == null) if (playerIdentifier.Value == null)
return false; return false;
PlayerIdentifier player = playerIdentifier.Value;
int oldlevel = (int)(player.IsConnected() ? player.GetConnectedPlayer().GetLevel() : Global.CharacterCacheStorage.GetCharacterLevelByGuid(player.GetGUID())); int oldlevel = (int)(player.IsConnected() ? player.GetConnectedPlayer().GetLevel() : Global.CharacterCacheStorage.GetCharacterLevelByGuid(player.GetGUID()));
int newlevel = oldlevel + level; int newlevel = oldlevel + level;
@@ -711,7 +714,7 @@ namespace Game.Chat
class PdumpCommand class PdumpCommand
{ {
[Command("copy", RBACPermissions.CommandPdumpCopy, true)] [Command("copy", RBACPermissions.CommandPdumpCopy, true)]
static bool HandlePDumpCopyCommand(CommandHandler handler, PlayerIdentifier player, AccountIdentifier account, [OptionalArg] string characterName, ulong? characterGUID) static bool HandlePDumpCopyCommand(CommandHandler handler, PlayerIdentifier player, AccountIdentifier account, OptionalArg<string> characterName, OptionalArg<ulong> characterGUID)
{ {
/* /*
std::string name; std::string name;
@@ -757,7 +760,7 @@ namespace Game.Chat
} }
[Command("load", RBACPermissions.CommandPdumpLoad, true)] [Command("load", RBACPermissions.CommandPdumpLoad, true)]
static bool HandlePDumpLoadCommand(CommandHandler handler, string fileName, AccountIdentifier account, [OptionalArg] string characterName, ulong? characterGuid) static bool HandlePDumpLoadCommand(CommandHandler handler, string fileName, AccountIdentifier account, OptionalArg<string> characterName, OptionalArg<ulong> characterGuid)
{ {
/* /*
if (!AccountMgr.normalizeString(accountName)) if (!AccountMgr.normalizeString(accountName))
+6 -6
View File
@@ -11,7 +11,7 @@ namespace Game.Chat.Commands
class CheatCommands class CheatCommands
{ {
[Command("casttime", RBACPermissions.CommandCheatCasttime)] [Command("casttime", RBACPermissions.CommandCheatCasttime)]
static bool HandleCasttimeCheatCommand(CommandHandler handler, bool? enableArg) static bool HandleCasttimeCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Casttime); bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Casttime);
if (enableArg.HasValue) if (enableArg.HasValue)
@@ -32,7 +32,7 @@ namespace Game.Chat.Commands
} }
[Command("cooldown", RBACPermissions.CommandCheatCooldown)] [Command("cooldown", RBACPermissions.CommandCheatCooldown)]
static bool HandleCoolDownCheatCommand(CommandHandler handler, bool? enableArg) static bool HandleCoolDownCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Cooldown); bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Cooldown);
if (enableArg.HasValue) if (enableArg.HasValue)
@@ -87,7 +87,7 @@ namespace Game.Chat.Commands
} }
[Command("god", RBACPermissions.CommandCheatGod)] [Command("god", RBACPermissions.CommandCheatGod)]
static bool HandleGodModeCheatCommand(CommandHandler handler, bool? enableArg) static bool HandleGodModeCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.God); bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.God);
if (enableArg.HasValue) if (enableArg.HasValue)
@@ -108,7 +108,7 @@ namespace Game.Chat.Commands
} }
[Command("power", RBACPermissions.CommandCheatPower)] [Command("power", RBACPermissions.CommandCheatPower)]
static bool HandlePowerCheatCommand(CommandHandler handler, bool? enableArg) static bool HandlePowerCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Power); bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Power);
if (enableArg.HasValue) if (enableArg.HasValue)
@@ -152,7 +152,7 @@ namespace Game.Chat.Commands
} }
[Command("taxi", RBACPermissions.CommandCheatTaxi)] [Command("taxi", RBACPermissions.CommandCheatTaxi)]
static bool HandleTaxiCheatCommand(CommandHandler handler, bool? enableArg) static bool HandleTaxiCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
Player chr = handler.GetSelectedPlayer(); Player chr = handler.GetSelectedPlayer();
if (chr == null) if (chr == null)
@@ -183,7 +183,7 @@ namespace Game.Chat.Commands
} }
[Command("waterwalk", RBACPermissions.CommandCheatWaterwalk)] [Command("waterwalk", RBACPermissions.CommandCheatWaterwalk)]
static bool HandleWaterWalkCheatCommand(CommandHandler handler, bool? enableArg) static bool HandleWaterWalkCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Waterwalk); bool enable = !handler.GetSession().GetPlayer().GetCommandStatus(PlayerCommandStates.Waterwalk);
if (enableArg.HasValue) if (enableArg.HasValue)
+13 -13
View File
@@ -440,7 +440,7 @@ namespace Game.Chat
} }
[Command("instancespawn", RBACPermissions.CommandDebug)] [Command("instancespawn", RBACPermissions.CommandDebug)]
static bool HandleDebugInstanceSpawns(CommandHandler handler, [VariantArg<uint, string>] object optArg) static bool HandleDebugInstanceSpawns(CommandHandler handler, VariantArg<uint, string> optArg)
{ {
Player player = handler.GetPlayer(); Player player = handler.GetPlayer();
if (player == null) if (player == null)
@@ -448,10 +448,10 @@ namespace Game.Chat
bool explain = false; bool explain = false;
uint groupID = 0; uint groupID = 0;
if (optArg is string && (optArg as string).Equals("explain", StringComparison.OrdinalIgnoreCase)) if (optArg.Is<string>() && ((string)optArg).Equals("explain", StringComparison.OrdinalIgnoreCase))
explain = true; explain = true;
else else
groupID = (uint)optArg; groupID = optArg;
if (groupID != 0 && Global.ObjectMgr.GetSpawnGroupData(groupID) == null) if (groupID != 0 && Global.ObjectMgr.GetSpawnGroupData(groupID) == null)
{ {
@@ -560,7 +560,7 @@ namespace Game.Chat
} }
[Command("loadcells", RBACPermissions.CommandDebug, true)] [Command("loadcells", RBACPermissions.CommandDebug, true)]
static bool HandleDebugLoadCellsCommand(CommandHandler handler, uint? mapId, uint? tileX, uint? tileY) static bool HandleDebugLoadCellsCommand(CommandHandler handler, OptionalArg<uint> mapId, OptionalArg<uint> tileX, OptionalArg<uint> tileY)
{ {
if (mapId.HasValue) if (mapId.HasValue)
{ {
@@ -578,7 +578,7 @@ namespace Game.Chat
return false; return false;
} }
static bool HandleDebugLoadCellsCommandHelper(CommandHandler handler, Map map, uint? tileX, uint? tileY) static bool HandleDebugLoadCellsCommandHelper(CommandHandler handler, Map map, OptionalArg<uint> tileX, OptionalArg<uint> tileY)
{ {
if (map == null) if (map == null)
return false; return false;
@@ -640,7 +640,7 @@ namespace Game.Chat
} }
[Command("moveflags", RBACPermissions.CommandDebug)] [Command("moveflags", RBACPermissions.CommandDebug)]
static bool HandleDebugMoveflagsCommand(CommandHandler handler, uint? moveFlags, uint? moveFlagsExtra, uint? moveFlagsExtra2) static bool HandleDebugMoveflagsCommand(CommandHandler handler, OptionalArg<uint> moveFlags, OptionalArg<uint> moveFlagsExtra, OptionalArg<uint> moveFlagsExtra2)
{ {
Unit target = handler.GetSelectedUnit(); Unit target = handler.GetSelectedUnit();
if (target == null) if (target == null)
@@ -653,10 +653,10 @@ namespace Game.Chat
} }
else else
{ {
target.SetUnitMovementFlags((MovementFlag)moveFlags); target.SetUnitMovementFlags((MovementFlag)moveFlags.Value);
if (moveFlagsExtra.HasValue) if (moveFlagsExtra.HasValue)
target.SetUnitMovementFlags2((MovementFlag2)moveFlagsExtra); target.SetUnitMovementFlags2((MovementFlag2)moveFlagsExtra.Value);
if (moveFlagsExtra2.HasValue) if (moveFlagsExtra2.HasValue)
target.SetExtraUnitMovementFlags2((MovementFlags3)moveFlagsExtra2.Value); target.SetExtraUnitMovementFlags2((MovementFlags3)moveFlagsExtra2.Value);
@@ -721,7 +721,7 @@ namespace Game.Chat
} }
[Command("objectcount", RBACPermissions.CommandDebug, true)] [Command("objectcount", RBACPermissions.CommandDebug, true)]
static bool HandleDebugObjectCountCommand(CommandHandler handler, uint? mapId) static bool HandleDebugObjectCountCommand(CommandHandler handler, OptionalArg<uint> mapId)
{ {
void HandleDebugObjectCountMap(Map map) void HandleDebugObjectCountMap(Map map)
{ {
@@ -792,7 +792,7 @@ namespace Game.Chat
} }
[Command("pvp warmode", RBACPermissions.CommandDebug, true)] [Command("pvp warmode", RBACPermissions.CommandDebug, true)]
static bool HandleDebugWarModeBalanceCommand(CommandHandler handler, string command, int? rewardValue) static bool HandleDebugWarModeBalanceCommand(CommandHandler handler, string command, OptionalArg<int> rewardValue)
{ {
// USAGE: .debug pvp fb <alliance|horde|neutral|off> [pct] // USAGE: .debug pvp fb <alliance|horde|neutral|off> [pct]
// neutral Sets faction balance off. // neutral Sets faction balance off.
@@ -888,7 +888,7 @@ namespace Game.Chat
} }
[Command("setaurastate", RBACPermissions.CommandDebug)] [Command("setaurastate", RBACPermissions.CommandDebug)]
static bool HandleDebugSetAuraStateCommand(CommandHandler handler, AuraStateType? state, bool apply) static bool HandleDebugSetAuraStateCommand(CommandHandler handler, OptionalArg<AuraStateType> state, bool apply)
{ {
Unit unit = handler.GetSelectedUnit(); Unit unit = handler.GetSelectedUnit();
if (unit == null) if (unit == null)
@@ -1230,7 +1230,7 @@ namespace Game.Chat
} }
[Command("objectsound", RBACPermissions.CommandDebug)] [Command("objectsound", RBACPermissions.CommandDebug)]
static bool HandleDebugPlayObjectSoundCommand(CommandHandler handler, uint soundKitId, int? broadcastTextId) static bool HandleDebugPlayObjectSoundCommand(CommandHandler handler, uint soundKitId, OptionalArg<int> broadcastTextId)
{ {
if (!CliDB.SoundKitStorage.ContainsKey(soundKitId)) if (!CliDB.SoundKitStorage.ContainsKey(soundKitId))
{ {
@@ -1409,7 +1409,7 @@ namespace Game.Chat
} }
[Command("spellfail", RBACPermissions.CommandDebug)] [Command("spellfail", RBACPermissions.CommandDebug)]
static bool HandleDebugSendSpellFailCommand(CommandHandler handler, SpellCastResult result, int? failArg1, int? failArg2) static bool HandleDebugSendSpellFailCommand(CommandHandler handler, SpellCastResult result, OptionalArg<int> failArg1, OptionalArg<int> failArg2)
{ {
CastFailed castFailed = new(); CastFailed castFailed = new();
castFailed.CastID = ObjectGuid.Empty; castFailed.CastID = ObjectGuid.Empty;
+4 -4
View File
@@ -14,7 +14,7 @@ namespace Game.Chat.Commands
[CommandGroup("add")] [CommandGroup("add")]
class DisableAddCommands class DisableAddCommands
{ {
static bool HandleAddDisables(CommandHandler handler, DisableType disableType, uint entry, uint? flags, Tail disableComment) static bool HandleAddDisables(CommandHandler handler, DisableType disableType, uint entry, OptionalArg<uint> flags, Tail disableComment)
{ {
switch (disableType) switch (disableType)
{ {
@@ -125,19 +125,19 @@ namespace Game.Chat.Commands
} }
[Command("spell", RBACPermissions.CommandDisableAddSpell, true)] [Command("spell", RBACPermissions.CommandDisableAddSpell, true)]
static bool HandleAddDisableSpellCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) static bool HandleAddDisableSpellCommand(CommandHandler handler, uint entry, OptionalArg<uint> flags, Tail disableComment)
{ {
return HandleAddDisables(handler, DisableType.Spell, entry, flags, disableComment); return HandleAddDisables(handler, DisableType.Spell, entry, flags, disableComment);
} }
[Command("quest", RBACPermissions.CommandDisableAddQuest, true)] [Command("quest", RBACPermissions.CommandDisableAddQuest, true)]
static bool HandleAddDisableQuestCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) static bool HandleAddDisableQuestCommand(CommandHandler handler, uint entry, OptionalArg<uint> flags, Tail disableComment)
{ {
return HandleAddDisables(handler, DisableType.Quest, entry, flags, disableComment); return HandleAddDisables(handler, DisableType.Quest, entry, flags, disableComment);
} }
[Command("map", RBACPermissions.CommandDisableAddMap, true)] [Command("map", RBACPermissions.CommandDisableAddMap, true)]
static bool HandleAddDisableMapCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) static bool HandleAddDisableMapCommand(CommandHandler handler, uint entry, OptionalArg<uint> flags, Tail disableComment)
{ {
return HandleAddDisables(handler, DisableType.Map, entry, flags, disableComment); return HandleAddDisables(handler, DisableType.Map, entry, flags, disableComment);
} }
+3 -3
View File
@@ -10,7 +10,7 @@ namespace Game.Chat
class EventCommands class EventCommands
{ {
[Command("info", RBACPermissions.CommandEventInfo, true)] [Command("info", RBACPermissions.CommandEventInfo, true)]
static bool HandleEventInfoCommand(CommandHandler handler, ushort eventId) static bool HandleEventInfoCommand(CommandHandler handler, VariantArg<GameeventLinkData, ushort> eventId)
{ {
var events = Global.GameEventMgr.GetEventMap(); var events = Global.GameEventMgr.GetEventMap();
if (eventId >= events.Length) if (eventId >= events.Length)
@@ -74,7 +74,7 @@ namespace Game.Chat
} }
[Command("start", RBACPermissions.CommandEventStart, true)] [Command("start", RBACPermissions.CommandEventStart, true)]
static bool HandleEventStartCommand(CommandHandler handler, ushort eventId) static bool HandleEventStartCommand(CommandHandler handler, VariantArg<GameeventLinkData, ushort> eventId)
{ {
var events = Global.GameEventMgr.GetEventMap(); var events = Global.GameEventMgr.GetEventMap();
if (eventId < 1 || eventId >= events.Length) if (eventId < 1 || eventId >= events.Length)
@@ -102,7 +102,7 @@ namespace Game.Chat
} }
[Command("stop", RBACPermissions.CommandEventStop, true)] [Command("stop", RBACPermissions.CommandEventStop, true)]
static bool HandleEventStopCommand(CommandHandler handler, ushort eventId) static bool HandleEventStopCommand(CommandHandler handler, VariantArg<GameeventLinkData, ushort> eventId)
{ {
var events = Global.GameEventMgr.GetEventMap(); var events = Global.GameEventMgr.GetEventMap();
if (eventId < 1 || eventId >= events.Length) if (eventId < 1 || eventId >= events.Length)
+2 -2
View File
@@ -12,7 +12,7 @@ namespace Game.Chat
class GMCommands class GMCommands
{ {
[Command("chat", RBACPermissions.CommandGmChat)] [Command("chat", RBACPermissions.CommandGmChat)]
static bool HandleGMChatCommand(CommandHandler handler, bool? enableArg) static bool HandleGMChatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
WorldSession session = handler.GetSession(); WorldSession session = handler.GetSession();
if (session != null) if (session != null)
@@ -160,7 +160,7 @@ namespace Game.Chat
} }
[Command("visible", RBACPermissions.CommandGmVisible)] [Command("visible", RBACPermissions.CommandGmVisible)]
static bool HandleGMVisibleCommand(CommandHandler handler, bool? visibleArg) static bool HandleGMVisibleCommand(CommandHandler handler, OptionalArg<bool> visibleArg)
{ {
Player _player = handler.GetSession().GetPlayer(); Player _player = handler.GetSession().GetPlayer();
+23 -22
View File
@@ -18,7 +18,7 @@ namespace Game.Chat
class GameObjectCommands class GameObjectCommands
{ {
[Command("activate", RBACPermissions.CommandGobjectActivate)] [Command("activate", RBACPermissions.CommandGobjectActivate)]
static bool HandleGameObjectActivateCommand(CommandHandler handler, ulong guidLow) static bool HandleGameObjectActivateCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> guidLow)
{ {
GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow); GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow);
if (obj == null) if (obj == null)
@@ -38,7 +38,7 @@ namespace Game.Chat
} }
[Command("delete", RBACPermissions.CommandGobjectDelete)] [Command("delete", RBACPermissions.CommandGobjectDelete)]
static bool HandleGameObjectDeleteCommand(CommandHandler handler, ulong spawnId) static bool HandleGameObjectDeleteCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> spawnId)
{ {
GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(spawnId); GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(spawnId);
if (obj != null) if (obj != null)
@@ -101,14 +101,14 @@ namespace Game.Chat
} }
[Command("info", RBACPermissions.CommandGobjectInfo)] [Command("info", RBACPermissions.CommandGobjectInfo)]
static bool HandleGameObjectInfoCommand(CommandHandler handler, [OptionalArg] string isGuid, ulong data) static bool HandleGameObjectInfoCommand(CommandHandler handler, OptionalArg<string> isGuid, VariantArg<GameobjectEntryLinkData, GameobjectLinkData, uint> data)
{ {
GameObject thisGO = null; GameObject thisGO = null;
GameObjectData spawnData = null; GameObjectData spawnData = null;
uint entry; uint entry;
ulong spawnId = 0; ulong spawnId = 0;
if (!isGuid.IsEmpty() && isGuid.Equals("guid", StringComparison.OrdinalIgnoreCase)) if (!isGuid.HasValue && isGuid.Value.Equals("guid", StringComparison.OrdinalIgnoreCase))
{ {
spawnId = data; spawnId = data;
spawnData = Global.ObjectMgr.GetGameObjectData(spawnId); spawnData = Global.ObjectMgr.GetGameObjectData(spawnId);
@@ -186,7 +186,7 @@ namespace Game.Chat
} }
[Command("move", RBACPermissions.CommandGobjectMove)] [Command("move", RBACPermissions.CommandGobjectMove)]
static bool HandleGameObjectMoveCommand(CommandHandler handler, ulong guidLow, float[] xyz) static bool HandleGameObjectMoveCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> guidLow, OptionalArg<float[]> xyz)
{ {
GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow); GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow);
if (obj == null) if (obj == null)
@@ -196,9 +196,9 @@ namespace Game.Chat
} }
Position pos; Position pos;
if (xyz != null) if (xyz.HasValue)
{ {
pos = new Position(xyz[0], xyz[1], xyz[2]); pos = new Position(xyz.Value[0], xyz.Value[1], xyz.Value[2]);
if (!GridDefines.IsValidMapCoord(obj.GetMapId(), pos)) if (!GridDefines.IsValidMapCoord(obj.GetMapId(), pos))
{ {
handler.SendSysMessage(CypherStrings.InvalidTargetCoord, pos.GetPositionX(), pos.GetPositionY(), obj.GetMapId()); handler.SendSysMessage(CypherStrings.InvalidTargetCoord, pos.GetPositionX(), pos.GetPositionY(), obj.GetMapId());
@@ -236,7 +236,7 @@ namespace Game.Chat
} }
[Command("near", RBACPermissions.CommandGobjectNear)] [Command("near", RBACPermissions.CommandGobjectNear)]
static bool HandleGameObjectNearCommand(CommandHandler handler, float? dist) static bool HandleGameObjectNearCommand(CommandHandler handler, OptionalArg<float> dist)
{ {
float distance = dist.GetValueOrDefault(10f); float distance = dist.GetValueOrDefault(10f);
uint count = 0; uint count = 0;
@@ -323,23 +323,24 @@ namespace Game.Chat
} }
[Command("target", RBACPermissions.CommandGobjectTarget)] [Command("target", RBACPermissions.CommandGobjectTarget)]
static bool HandleGameObjectTargetCommand(CommandHandler handler, string objectIdStr) static bool HandleGameObjectTargetCommand(CommandHandler handler, OptionalArg<VariantArg<VariantArg<GameobjectEntryLinkData, uint>, string>> objectId)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
SQLResult result; SQLResult result;
var activeEventsList = Global.GameEventMgr.GetActiveEventList(); var activeEventsList = Global.GameEventMgr.GetActiveEventList();
if (objectIdStr.IsEmpty()) if (objectId.HasValue)
{ {
if (uint.TryParse(objectIdStr, out uint objectId)) if (objectId.Value.Is<VariantArg<GameobjectEntryLinkData, uint>>())
result = DB.World.Query("SELECT guid, id, position_x, position_y, position_z, orientation, map, PhaseId, PhaseGroup, (POW(position_x - '{0}', 2) + POW(position_y - '{1}', 2) + POW(position_z - '{2}', 2)) AS order_ FROM gameobject WHERE map = '{3}' AND id = '{4}' ORDER BY order_ ASC LIMIT 1", result = DB.World.Query("SELECT guid, id, position_x, position_y, position_z, orientation, map, PhaseId, PhaseGroup, (POW(position_x - '{0}', 2) + POW(position_y - '{1}', 2) + POW(position_z - '{2}', 2)) AS order_ FROM gameobject WHERE map = '{3}' AND id = '{4}' ORDER BY order_ ASC LIMIT 1",
player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), objectId); player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), objectId);
else else
{ {
string name = objectId.Value.GetValue();
result = DB.World.Query( result = DB.World.Query(
"SELECT guid, id, position_x, position_y, position_z, orientation, map, PhaseId, PhaseGroup, (POW(position_x - {0}, 2) + POW(position_y - {1}, 2) + POW(position_z - {2}, 2)) AS order_ " + "SELECT guid, id, position_x, position_y, position_z, orientation, map, PhaseId, PhaseGroup, (POW(position_x - {0}, 2) + POW(position_y - {1}, 2) + POW(position_z - {2}, 2)) AS order_ " +
"FROM gameobject LEFT JOIN gameobject_template ON gameobject_template.entry = gameobject.id WHERE map = {3} AND name LIKE CONCAT('%%', '{4}', '%%') ORDER BY order_ ASC LIMIT 1", "FROM gameobject LEFT JOIN gameobject_template ON gameobject_template.entry = gameobject.id WHERE map = {3} AND name LIKE CONCAT('%%', '{4}', '%%') ORDER BY order_ ASC LIMIT 1",
player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), objectIdStr); player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), name);
} }
} }
else else
@@ -433,7 +434,7 @@ namespace Game.Chat
} }
[Command("turn", RBACPermissions.CommandGobjectTurn)] [Command("turn", RBACPermissions.CommandGobjectTurn)]
static bool HandleGameObjectTurnCommand(CommandHandler handler, ulong guidLow, float? oz, float? oy, float? ox) static bool HandleGameObjectTurnCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> guidLow, OptionalArg<float> oz, OptionalArg<float> oy, OptionalArg<float> ox)
{ {
GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow); GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow);
if (obj == null) if (obj == null)
@@ -470,7 +471,7 @@ namespace Game.Chat
class AddCommands class AddCommands
{ {
[Command("", RBACPermissions.CommandGobjectAdd)] [Command("", RBACPermissions.CommandGobjectAdd)]
static bool HandleGameObjectAddCommand(CommandHandler handler, uint objectId, int? spawnTimeSecs) static bool HandleGameObjectAddCommand(CommandHandler handler, VariantArg<GameobjectEntryLinkData, uint> objectId, OptionalArg<int> spawnTimeSecs)
{ {
if (objectId == 0) if (objectId == 0)
return false; return false;
@@ -518,7 +519,7 @@ namespace Game.Chat
} }
[Command("temp", RBACPermissions.CommandGobjectAddTemp)] [Command("temp", RBACPermissions.CommandGobjectAddTemp)]
static bool HandleGameObjectAddTempCommand(CommandHandler handler, uint objectId, ulong? spawntime) static bool HandleGameObjectAddTempCommand(CommandHandler handler, VariantArg<GameobjectEntryLinkData, uint> objectId, OptionalArg<ulong> spawntime)
{ {
Player player = handler.GetPlayer(); Player player = handler.GetPlayer();
TimeSpan spawntm = TimeSpan.FromSeconds(spawntime.GetValueOrDefault(300)); TimeSpan spawntm = TimeSpan.FromSeconds(spawntime.GetValueOrDefault(300));
@@ -540,7 +541,7 @@ namespace Game.Chat
class SetCommands class SetCommands
{ {
[Command("phase", RBACPermissions.CommandGobjectSetPhase)] [Command("phase", RBACPermissions.CommandGobjectSetPhase)]
static bool HandleGameObjectSetPhaseCommand(CommandHandler handler, ulong guidLow, uint phaseId) static bool HandleGameObjectSetPhaseCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> guidLow, uint phaseId)
{ {
if (guidLow == 0) if (guidLow == 0)
return false; return false;
@@ -564,7 +565,7 @@ namespace Game.Chat
} }
[Command("state", RBACPermissions.CommandGobjectSetState)] [Command("state", RBACPermissions.CommandGobjectSetState)]
static bool HandleGameObjectSetStateCommand(CommandHandler handler, ulong guidLow, int objectType, uint? objectState) static bool HandleGameObjectSetStateCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> guidLow, int objectType, OptionalArg<uint> objectState)
{ {
if (guidLow == 0) if (guidLow == 0)
return false; return false;
@@ -585,16 +586,16 @@ namespace Game.Chat
return true; return true;
} }
if (objectState == 0) if (!objectState.HasValue)
return false; return false;
switch (objectType) switch (objectType)
{ {
case 0: case 0:
obj.SetGoState((GameObjectState)objectState); obj.SetGoState((GameObjectState)objectState.Value);
break; break;
case 1: case 1:
obj.SetGoType((GameObjectTypes)objectState); obj.SetGoType((GameObjectTypes)objectState.Value);
break; break;
case 2: case 2:
obj.SetGoArtKit(objectState.Value); obj.SetGoArtKit(objectState.Value);
@@ -606,10 +607,10 @@ namespace Game.Chat
obj.SendCustomAnim(objectState.Value); obj.SendCustomAnim(objectState.Value);
break; break;
case 5: case 5:
if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding) if (objectState.Value < 0 || objectState.Value > (uint)GameObjectDestructibleState.Rebuilding)
return false; return false;
obj.SetDestructibleState((GameObjectDestructibleState)objectState); obj.SetDestructibleState((GameObjectDestructibleState)objectState.Value);
break; break;
default: default:
break; break;
+12 -12
View File
@@ -17,7 +17,7 @@ namespace Game.Chat.Commands
class GoCommands class GoCommands
{ {
[Command("areatrigger", RBACPermissions.CommandGo)] [Command("areatrigger", RBACPermissions.CommandGo)]
static bool HandleGoAreaTriggerCommand(CommandHandler handler, uint areaTriggerId) static bool HandleGoAreaTriggerCommand(CommandHandler handler, VariantArg<AreatriggerLinkData, uint> areaTriggerId)
{ {
var at = CliDB.AreaTriggerStorage.LookupByKey(areaTriggerId); var at = CliDB.AreaTriggerStorage.LookupByKey(areaTriggerId);
if (at == null) if (at == null)
@@ -168,7 +168,7 @@ namespace Game.Chat.Commands
} }
[Command("grid", RBACPermissions.CommandGo)] [Command("grid", RBACPermissions.CommandGo)]
static bool HandleGoGridCommand(CommandHandler handler, float gridX, float gridY, uint? mapIdArg) static bool HandleGoGridCommand(CommandHandler handler, float gridX, float gridY, OptionalArg<uint> mapIdArg)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
uint mapId = mapIdArg.GetValueOrDefault(player.GetMapId()); uint mapId = mapIdArg.GetValueOrDefault(player.GetMapId());
@@ -286,7 +286,7 @@ namespace Game.Chat.Commands
} }
[Command("offset", RBACPermissions.CommandGo)] [Command("offset", RBACPermissions.CommandGo)]
static bool HandleGoOffsetCommand(CommandHandler handler, float dX, float? dY, float? dZ, float? dO) static bool HandleGoOffsetCommand(CommandHandler handler, float dX, OptionalArg<float> dY, OptionalArg<float> dZ, OptionalArg<float> dO)
{ {
Position loc = handler.GetSession().GetPlayer().GetPosition(); Position loc = handler.GetSession().GetPlayer().GetPosition();
loc.RelocateOffset(new Position(dX, dY.GetValueOrDefault(0f), dZ.GetValueOrDefault(0f), dO.GetValueOrDefault(0f))); loc.RelocateOffset(new Position(dX, dY.GetValueOrDefault(0f), dZ.GetValueOrDefault(0f), dO.GetValueOrDefault(0f)));
@@ -295,7 +295,7 @@ namespace Game.Chat.Commands
} }
[Command("quest", RBACPermissions.CommandGo)] [Command("quest", RBACPermissions.CommandGo)]
static bool HandleGoQuestCommand(CommandHandler handler, uint questId) static bool HandleGoQuestCommand(CommandHandler handler, VariantArg<QuestLinkData, uint> questId)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -350,7 +350,7 @@ namespace Game.Chat.Commands
} }
[Command("taxinode", RBACPermissions.CommandGo)] [Command("taxinode", RBACPermissions.CommandGo)]
static bool HandleGoTaxinodeCommand(CommandHandler handler, uint nodeId) static bool HandleGoTaxinodeCommand(CommandHandler handler, VariantArg<TaxiNodeLinkData, uint> nodeId)
{ {
var node = CliDB.TaxiNodesStorage.LookupByKey(nodeId); var node = CliDB.TaxiNodesStorage.LookupByKey(nodeId);
if (node == null) if (node == null)
@@ -363,7 +363,7 @@ namespace Game.Chat.Commands
//teleport at coordinates, including Z and orientation //teleport at coordinates, including Z and orientation
[Command("xyz", RBACPermissions.CommandGo)] [Command("xyz", RBACPermissions.CommandGo)]
static bool HandleGoXYZCommand(CommandHandler handler, float x, float y, float? z, uint? id, float? o) static bool HandleGoXYZCommand(CommandHandler handler, float x, float y, OptionalArg<float> z, OptionalArg<uint> id, OptionalArg<float> o)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
uint mapId = id.GetValueOrDefault(player.GetMapId()); uint mapId = id.GetValueOrDefault(player.GetMapId());
@@ -386,12 +386,12 @@ namespace Game.Chat.Commands
z = Math.Max(terrain.GetStaticHeight(PhasingHandler.EmptyPhaseShift, mapId, x, y, MapConst.MaxHeight), terrain.GetWaterLevel(PhasingHandler.EmptyPhaseShift, mapId, x, y)); z = Math.Max(terrain.GetStaticHeight(PhasingHandler.EmptyPhaseShift, mapId, x, y, MapConst.MaxHeight), terrain.GetWaterLevel(PhasingHandler.EmptyPhaseShift, mapId, x, y));
} }
return DoTeleport(handler, new Position(x, y, z.Value, o.GetValueOrDefault()), mapId); return DoTeleport(handler, new Position(x, y, z.Value, o.GetValueOrDefault(0f)), mapId);
} }
//teleport at coordinates //teleport at coordinates
[Command("zonexy", RBACPermissions.CommandGo)] [Command("zonexy", RBACPermissions.CommandGo)]
static bool HandleGoZoneXYCommand(CommandHandler handler, float x, float y, uint? areaIdArg) static bool HandleGoZoneXYCommand(CommandHandler handler, float x, float y, OptionalArg<VariantArg<AreaLinkData, uint>> areaIdArg)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -486,7 +486,7 @@ namespace Game.Chat.Commands
class GoCommandCreature class GoCommandCreature
{ {
[Command("", RBACPermissions.CommandGo)] [Command("", RBACPermissions.CommandGo)]
static bool HandleGoCreatureSpawnIdCommand(CommandHandler handler, ulong spawnId) static bool HandleGoCreatureSpawnIdCommand(CommandHandler handler, VariantArg<CreatureLinkData, ulong> spawnId)
{ {
CreatureData spawnpoint = Global.ObjectMgr.GetCreatureData(spawnId); CreatureData spawnpoint = Global.ObjectMgr.GetCreatureData(spawnId);
if (spawnpoint == null) if (spawnpoint == null)
@@ -499,7 +499,7 @@ namespace Game.Chat.Commands
} }
[Command("id", RBACPermissions.CommandGo)] [Command("id", RBACPermissions.CommandGo)]
static bool HandleGoCreatureCIdCommand(CommandHandler handler, uint id) static bool HandleGoCreatureCIdCommand(CommandHandler handler, VariantArg<CreatureEntryLinkData, uint> id)
{ {
CreatureData spawnpoint = null; CreatureData spawnpoint = null;
foreach (var pair in Global.ObjectMgr.GetAllCreatureData()) foreach (var pair in Global.ObjectMgr.GetAllCreatureData())
@@ -530,7 +530,7 @@ namespace Game.Chat.Commands
class GoCommandGameobject class GoCommandGameobject
{ {
[Command("", RBACPermissions.CommandGo)] [Command("", RBACPermissions.CommandGo)]
static bool HandleGoGameObjectSpawnIdCommand(CommandHandler handler, ulong spawnId) static bool HandleGoGameObjectSpawnIdCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> spawnId)
{ {
GameObjectData spawnpoint = Global.ObjectMgr.GetGameObjectData(spawnId); GameObjectData spawnpoint = Global.ObjectMgr.GetGameObjectData(spawnId);
if (spawnpoint == null) if (spawnpoint == null)
@@ -543,7 +543,7 @@ namespace Game.Chat.Commands
} }
[Command("id", RBACPermissions.CommandGo)] [Command("id", RBACPermissions.CommandGo)]
static bool HandleGoGameObjectGOIdCommand(CommandHandler handler, uint goId) static bool HandleGoGameObjectGOIdCommand(CommandHandler handler, VariantArg<GameobjectEntryLinkData, uint> goId)
{ {
GameObjectData spawnpoint = null; GameObjectData spawnpoint = null;
foreach (var pair in Global.ObjectMgr.GetAllGameObjectData()) foreach (var pair in Global.ObjectMgr.GetAllGameObjectData())
+5 -5
View File
@@ -167,16 +167,16 @@ namespace Game.Chat
} }
[Command("info", RBACPermissions.CommandGuildInfo, true)] [Command("info", RBACPermissions.CommandGuildInfo, true)]
static bool HandleGuildInfoCommand(CommandHandler handler, [OptionalArg][VariantArg<ulong, string>] dynamic guildIdentifier) static bool HandleGuildInfoCommand(CommandHandler handler, OptionalArg<VariantArg<ulong, string>> guildIdentifier)
{ {
Guild guild = null; Guild guild = null;
if (guildIdentifier != null) if (guildIdentifier.HasValue)
{ {
if (guildIdentifier is ulong) if (guildIdentifier.Value.Is<ulong>())
guild = Global.GuildMgr.GetGuildById(guildIdentifier); guild = Global.GuildMgr.GetGuildById(guildIdentifier.Value);
else else
guild = Global.GuildMgr.GetGuildByName(guildIdentifier); guild = Global.GuildMgr.GetGuildByName(guildIdentifier.Value);
} }
else else
{ {
@@ -141,7 +141,7 @@ namespace Game.Chat
} }
[Command("unbind", RBACPermissions.CommandInstanceUnbind)] [Command("unbind", RBACPermissions.CommandInstanceUnbind)]
static bool HandleInstanceUnbindCommand(CommandHandler handler, [VariantArg<uint, string>] object mapArg, uint? difficultyArg) static bool HandleInstanceUnbindCommand(CommandHandler handler, VariantArg<uint, string> mapArg, OptionalArg<uint> difficultyArg)
{ {
Player player = handler.GetSelectedPlayer(); Player player = handler.GetSelectedPlayer();
if (player == null) if (player == null)
@@ -150,11 +150,11 @@ namespace Game.Chat
uint? mapId = null; uint? mapId = null;
Difficulty? difficulty = null; Difficulty? difficulty = null;
if (mapArg is uint) if (mapArg.Is<uint>())
mapId = (uint)mapArg; mapId = mapArg;
if (difficultyArg.HasValue && CliDB.DifficultyStorage.ContainsKey(difficultyArg.Value)) if (difficultyArg.HasValue && CliDB.DifficultyStorage.ContainsKey(difficultyArg.Value))
difficulty = (Difficulty)difficultyArg; difficulty = (Difficulty)difficultyArg.Value;
List<InstanceLock> locksReset = new(); List<InstanceLock> locksReset = new();
List<InstanceLock> locksNotReset = new(); List<InstanceLock> locksNotReset = new();
+1 -1
View File
@@ -74,7 +74,7 @@ namespace Game.Chat
} }
[Command("options", RBACPermissions.CommandLfgOptions, true)] [Command("options", RBACPermissions.CommandLfgOptions, true)]
static bool HandleLfgOptionsCommand(CommandHandler handler, uint? optionsArg) static bool HandleLfgOptionsCommand(CommandHandler handler, OptionalArg<uint> optionsArg)
{ {
if (optionsArg.HasValue) if (optionsArg.HasValue)
{ {
+4 -4
View File
@@ -15,7 +15,7 @@ namespace Game.Chat.Commands
class LearnCommands class LearnCommands
{ {
[Command("", CypherStrings.CommandLearnHelp, RBACPermissions.CommandLearn)] [Command("", CypherStrings.CommandLearnHelp, RBACPermissions.CommandLearn)]
static bool HandleLearnCommand(CommandHandler handler, uint spellId, [OptionalArg] string allRanksStr) static bool HandleLearnCommand(CommandHandler handler, uint spellId, OptionalArg<string> allRanksStr)
{ {
Player targetPlayer = handler.GetSelectedPlayerOrSelf(); Player targetPlayer = handler.GetSelectedPlayerOrSelf();
if (targetPlayer == null) if (targetPlayer == null)
@@ -30,7 +30,7 @@ namespace Game.Chat.Commands
return false; return false;
} }
bool allRanks = !allRanksStr.IsEmpty() && allRanksStr.Equals("all", StringComparison.OrdinalIgnoreCase); bool allRanks = allRanksStr.HasValue && allRanksStr.Value.Equals("all", StringComparison.OrdinalIgnoreCase);
if (!allRanks && targetPlayer.HasSpell(spellId)) if (!allRanks && targetPlayer.HasSpell(spellId))
{ {
@@ -314,7 +314,7 @@ namespace Game.Chat.Commands
} }
[CommandNonGroup("unlearn", CypherStrings.CommandUnlearnHelp, RBACPermissions.CommandUnlearn)] [CommandNonGroup("unlearn", CypherStrings.CommandUnlearnHelp, RBACPermissions.CommandUnlearn)]
static bool HandleUnLearnCommand(CommandHandler handler, uint spellId, [OptionalArg] string allRanksStr) static bool HandleUnLearnCommand(CommandHandler handler, uint spellId, OptionalArg<string> allRanksStr)
{ {
Player target = handler.GetSelectedPlayer(); Player target = handler.GetSelectedPlayer();
if (target == null) if (target == null)
@@ -323,7 +323,7 @@ namespace Game.Chat.Commands
return false; return false;
} }
bool allRanks = !allRanksStr.IsEmpty() && allRanksStr.Equals("all", StringComparison.OrdinalIgnoreCase); bool allRanks = allRanksStr.HasValue && allRanksStr.Value.Equals("all", StringComparison.OrdinalIgnoreCase);
if (allRanks) if (allRanks)
spellId = Global.SpellMgr.GetFirstSpellInChain(spellId); spellId = Global.SpellMgr.GetFirstSpellInChain(spellId);
+16 -15
View File
@@ -17,7 +17,7 @@ namespace Game.Chat.Commands
class ListCommands class ListCommands
{ {
[Command("creature", RBACPermissions.CommandListCreature, true)] [Command("creature", RBACPermissions.CommandListCreature, true)]
static bool HandleListCreatureCommand(CommandHandler handler, uint creatureId, uint? countArg) static bool HandleListCreatureCommand(CommandHandler handler, VariantArg<CreatureEntryLinkData, uint> creatureId, OptionalArg<uint> countArg)
{ {
CreatureTemplate cInfo = Global.ObjectMgr.GetCreatureTemplate(creatureId); CreatureTemplate cInfo = Global.ObjectMgr.GetCreatureTemplate(creatureId);
if (cInfo == null) if (cInfo == null)
@@ -88,8 +88,9 @@ namespace Game.Chat.Commands
} }
[Command("item", RBACPermissions.CommandListItem, true)] [Command("item", RBACPermissions.CommandListItem, true)]
static bool HandleListItemCommand(CommandHandler handler, uint itemId, uint? countArg) static bool HandleListItemCommand(CommandHandler handler, VariantArg<ItemLinkData> item, OptionalArg<uint> countArg)
{ {
uint itemId = item.GetValue().Item.GetId();
uint count = countArg.GetValueOrDefault(10); uint count = countArg.GetValueOrDefault(10);
if (count == 0) if (count == 0)
@@ -258,26 +259,26 @@ namespace Game.Chat.Commands
} }
[Command("mail", RBACPermissions.CommandListMail, true)] [Command("mail", RBACPermissions.CommandListMail, true)]
static bool HandleListMailCommand(CommandHandler handler, PlayerIdentifier player) static bool HandleListMailCommand(CommandHandler handler, OptionalArg<PlayerIdentifier> player)
{ {
if (player == null) if (!player.HasValue)
player = PlayerIdentifier.FromTargetOrSelf(handler); player = PlayerIdentifier.FromTargetOrSelf(handler);
if (player == null) if (player.Value == null)
return false; return false;
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_MAIL_LIST_COUNT); PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_MAIL_LIST_COUNT);
stmt.AddValue(0, player.GetGUID().GetCounter()); stmt.AddValue(0, player.Value.GetGUID().GetCounter());
SQLResult result = DB.Characters.Query(stmt); SQLResult result = DB.Characters.Query(stmt);
if (!result.IsEmpty()) if (!result.IsEmpty())
{ {
uint countMail = result.Read<uint>(0); uint countMail = result.Read<uint>(0);
string nameLink = handler.PlayerLink(player.GetName()); string nameLink = handler.PlayerLink(player.Value.GetName());
handler.SendSysMessage(CypherStrings.ListMailHeader, countMail, nameLink, player.GetGUID().ToString()); handler.SendSysMessage(CypherStrings.ListMailHeader, countMail, nameLink, player.Value.GetGUID().ToString());
handler.SendSysMessage(CypherStrings.AccountListBar); handler.SendSysMessage(CypherStrings.AccountListBar);
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_MAIL_LIST_INFO); stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_MAIL_LIST_INFO);
stmt.AddValue(0, player.GetGUID().GetCounter()); stmt.AddValue(0, player.Value.GetGUID().GetCounter());
SQLResult result1 = DB.Characters.Query(stmt); SQLResult result1 = DB.Characters.Query(stmt);
if (!result1.IsEmpty()) if (!result1.IsEmpty())
@@ -354,7 +355,7 @@ namespace Game.Chat.Commands
} }
[Command("object", RBACPermissions.CommandListObject, true)] [Command("object", RBACPermissions.CommandListObject, true)]
static bool HandleListObjectCommand(CommandHandler handler, uint gameObjectId, uint? countArg) static bool HandleListObjectCommand(CommandHandler handler, VariantArg<GameobjectEntryLinkData, uint> gameObjectId, OptionalArg<uint> countArg)
{ {
GameObjectTemplate gInfo = Global.ObjectMgr.GetGameObjectTemplate(gameObjectId); GameObjectTemplate gInfo = Global.ObjectMgr.GetGameObjectTemplate(gameObjectId);
if (gInfo == null) if (gInfo == null)
@@ -426,7 +427,7 @@ namespace Game.Chat.Commands
} }
[Command("respawns", RBACPermissions.CommandListRespawns)] [Command("respawns", RBACPermissions.CommandListRespawns)]
static bool HandleListRespawnsCommand(CommandHandler handler, uint? range) static bool HandleListRespawnsCommand(CommandHandler handler, OptionalArg<uint> range)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
Map map = player.GetMap(); Map map = player.GetMap();
@@ -552,7 +553,7 @@ namespace Game.Chat.Commands
[Command("", RBACPermissions.CommandListAuras)] [Command("", RBACPermissions.CommandListAuras)]
static bool HandleListAllAurasCommand(CommandHandler handler) static bool HandleListAllAurasCommand(CommandHandler handler)
{ {
return ListAurasCommand(handler, null, null); return ListAurasCommand(handler, default, null);
} }
[Command("id", RBACPermissions.CommandListAuras)] [Command("id", RBACPermissions.CommandListAuras)]
@@ -564,10 +565,10 @@ namespace Game.Chat.Commands
[Command("name", RBACPermissions.CommandListAuras)] [Command("name", RBACPermissions.CommandListAuras)]
static bool HandleListAurasByNameCommand(CommandHandler handler, Tail namePart) static bool HandleListAurasByNameCommand(CommandHandler handler, Tail namePart)
{ {
return ListAurasCommand(handler, null, namePart); return ListAurasCommand(handler, default, namePart);
} }
static bool ListAurasCommand(CommandHandler handler, uint? spellId, string namePart) static bool ListAurasCommand(CommandHandler handler, OptionalArg<uint> spellId, string namePart)
{ {
Unit unit = handler.GetSelectedUnit(); Unit unit = handler.GetSelectedUnit();
if (unit == null) if (unit == null)
@@ -625,7 +626,7 @@ namespace Game.Chat.Commands
return true; return true;
} }
static bool ShouldListAura(SpellInfo spellInfo, uint? spellId, string namePart, Locale locale) static bool ShouldListAura(SpellInfo spellInfo, OptionalArg<uint> spellId, string namePart, Locale locale)
{ {
if (spellId.HasValue) if (spellId.HasValue)
return spellInfo.Id == spellId.Value; return spellInfo.Id == spellId.Value;
+1 -1
View File
@@ -92,7 +92,7 @@ namespace Game.Chat
} }
[CommandNonGroup("whispers", RBACPermissions.CommandWhispers)] [CommandNonGroup("whispers", RBACPermissions.CommandWhispers)]
static bool HandleWhispersCommand(CommandHandler handler, bool? operationArg, [OptionalArg] string playerNameArg) static bool HandleWhispersCommand(CommandHandler handler, OptionalArg<bool> operationArg, OptionalArg<string> playerNameArg)
{ {
if (!operationArg.HasValue) if (!operationArg.HasValue)
{ {
+85 -235
View File
@@ -213,7 +213,7 @@ namespace Game.Chat
} }
[CommandNonGroup("damage", RBACPermissions.CommandDamage)] [CommandNonGroup("damage", RBACPermissions.CommandDamage)]
static bool HandleDamageCommand(CommandHandler handler, uint damage, SpellSchools? school, [OptionalArg] SpellInfo spellInfo) static bool HandleDamageCommand(CommandHandler handler, uint damage, OptionalArg<SpellSchools> school, OptionalArg<SpellInfo> spellInfo)
{ {
Unit target = handler.GetSelectedUnit(); Unit target = handler.GetSelectedUnit();
if (target == null || handler.GetSession().GetPlayer().GetTarget().IsEmpty()) if (target == null || handler.GetSession().GetPlayer().GetTarget().IsEmpty())
@@ -246,7 +246,7 @@ namespace Game.Chat
damage = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage, null, WeaponAttackType.BaseAttack); damage = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage, null, WeaponAttackType.BaseAttack);
// melee damage by specific school // melee damage by specific school
if (spellInfo == null) if (!spellInfo.HasValue)
{ {
DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack); DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack);
Unit.CalcAbsorbResist(dmgInfo); Unit.CalcAbsorbResist(dmgInfo);
@@ -266,7 +266,7 @@ namespace Game.Chat
// non-melee damage // non-melee damage
SpellNonMeleeDamage damageInfo = new(attacker, target, spellInfo, new SpellCastVisual(spellInfo.GetSpellXSpellVisualId(attacker), 0), spellInfo.SchoolMask); SpellNonMeleeDamage damageInfo = new(attacker, target, spellInfo, new SpellCastVisual(spellInfo.Value.GetSpellXSpellVisualId(attacker), 0), spellInfo.Value.SchoolMask);
damageInfo.damage = damage; damageInfo.damage = damage;
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb); Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
target.DealSpellDamage(damageInfo, true); target.DealSpellDamage(damageInfo, true);
@@ -275,7 +275,7 @@ namespace Game.Chat
} }
[CommandNonGroup("damage go", RBACPermissions.CommandDamage)] [CommandNonGroup("damage go", RBACPermissions.CommandDamage)]
static bool HandleDamageGoCommand(CommandHandler handler, ulong spawnId, int damage) static bool HandleDamageGoCommand(CommandHandler handler, VariantArg<GameobjectLinkData, ulong> spawnId, int damage)
{ {
GameObject go = handler.GetObjectFromPlayerMapByDbGuid(spawnId); GameObject go = handler.GetObjectFromPlayerMapByDbGuid(spawnId);
if (go == null) if (go == null)
@@ -296,7 +296,7 @@ namespace Game.Chat
} }
[CommandNonGroup("dev", RBACPermissions.CommandDev)] [CommandNonGroup("dev", RBACPermissions.CommandDev)]
static bool HandleDevCommand(CommandHandler handler, bool? enableArg) static bool HandleDevCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -755,14 +755,14 @@ namespace Game.Chat
} }
[CommandNonGroup("linkgrave", RBACPermissions.CommandLinkgrave)] [CommandNonGroup("linkgrave", RBACPermissions.CommandLinkgrave)]
static bool HandleLinkGraveCommand(CommandHandler handler, uint graveyardId, [OptionalArg] string teamArg) static bool HandleLinkGraveCommand(CommandHandler handler, uint graveyardId, OptionalArg<string> teamArg)
{ {
Team team; Team team;
if (teamArg.IsEmpty()) if (!teamArg.HasValue)
team = 0; team = 0;
else if (teamArg.Equals("horde", StringComparison.OrdinalIgnoreCase)) else if (teamArg.Value.Equals("horde", StringComparison.OrdinalIgnoreCase))
team = Team.Horde; team = Team.Horde;
else if (teamArg.Equals("alliance", StringComparison.OrdinalIgnoreCase)) else if (teamArg.Value.Equals("alliance", StringComparison.OrdinalIgnoreCase))
team = Team.Alliance; team = Team.Alliance;
else else
return false; return false;
@@ -925,22 +925,22 @@ namespace Game.Chat
// mute player for the specified duration // mute player for the specified duration
[CommandNonGroup("mute", RBACPermissions.CommandMute, true)] [CommandNonGroup("mute", RBACPermissions.CommandMute, true)]
static bool HandleMuteCommand(CommandHandler handler, PlayerIdentifier player, uint muteTime, Tail muteReason) static bool HandleMuteCommand(CommandHandler handler, OptionalArg<PlayerIdentifier> player, uint muteTime, Tail muteReason)
{ {
string muteReasonStr = muteReason; string muteReasonStr = muteReason;
if (muteReason.IsEmpty()) if (muteReason.IsEmpty())
muteReasonStr = handler.GetCypherString(CypherStrings.NoReason); muteReasonStr = handler.GetCypherString(CypherStrings.NoReason);
if (player == null) if (!player.HasValue)
player = PlayerIdentifier.FromTarget(handler); player = PlayerIdentifier.FromTarget(handler);
if (player == null) if (player.Value == null)
{ {
handler.SendSysMessage(CypherStrings.PlayerNotFound); handler.SendSysMessage(CypherStrings.PlayerNotFound);
return false; return false;
} }
Player target = player.GetConnectedPlayer(); Player target = player.Value.GetConnectedPlayer();
uint accountId = target != null ? target.GetSession().GetAccountId() : Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(player.GetGUID()); uint accountId = target != null ? target.GetSession().GetAccountId() : Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(player.Value.GetGUID());
// find only player from same account if any // find only player from same account if any
if (target == null) if (target == null)
@@ -951,7 +951,7 @@ namespace Game.Chat
} }
// must have strong lesser security level // must have strong lesser security level
if (handler.HasLowerSecurity(target, player.GetGUID(), true)) if (handler.HasLowerSecurity(target, player.Value.GetGUID(), true))
return false; return false;
PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.UPD_MUTE_TIME); PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.UPD_MUTE_TIME);
@@ -986,7 +986,7 @@ namespace Game.Chat
stmt.AddValue(3, muteReasonStr); stmt.AddValue(3, muteReasonStr);
DB.Login.Execute(stmt); DB.Login.Execute(stmt);
string nameLink = handler.PlayerLink(player.GetName()); string nameLink = handler.PlayerLink(player.Value.GetName());
if (WorldConfig.GetBoolValue(WorldCfg.ShowMuteInWorld)) if (WorldConfig.GetBoolValue(WorldCfg.ShowMuteInWorld))
Global.WorldMgr.SendWorldText(CypherStrings.CommandMutemessageWorld, muteBy, nameLink, muteTime, muteReasonStr); Global.WorldMgr.SendWorldText(CypherStrings.CommandMutemessageWorld, muteBy, nameLink, muteTime, muteReasonStr);
@@ -1040,14 +1040,14 @@ namespace Game.Chat
} }
[CommandNonGroup("neargrave", RBACPermissions.CommandNeargrave)] [CommandNonGroup("neargrave", RBACPermissions.CommandNeargrave)]
static bool HandleNearGraveCommand(CommandHandler handler, [OptionalArg] string teamArg) static bool HandleNearGraveCommand(CommandHandler handler, OptionalArg<string> teamArg)
{ {
Team team; Team team;
if (teamArg.IsEmpty()) if (!teamArg.HasValue)
team = 0; team = 0;
else if (teamArg.Equals("horde", StringComparison.OrdinalIgnoreCase)) else if (teamArg.Value.Equals("horde", StringComparison.OrdinalIgnoreCase))
team = Team.Horde; team = Team.Horde;
else if (teamArg.Equals("alliance", StringComparison.OrdinalIgnoreCase)) else if (teamArg.Value.Equals("alliance", StringComparison.OrdinalIgnoreCase))
team = Team.Alliance; team = Team.Alliance;
else else
return false; return false;
@@ -1097,18 +1097,17 @@ namespace Game.Chat
} }
[CommandNonGroup("pinfo", RBACPermissions.CommandPinfo, true)] [CommandNonGroup("pinfo", RBACPermissions.CommandPinfo, true)]
static bool HandlePInfoCommand(CommandHandler handler, [OptionalArg] PlayerIdentifier arg) static bool HandlePInfoCommand(CommandHandler handler, OptionalArg<PlayerIdentifier> arg)
{ {
if (arg == null) if (!arg.HasValue)
arg = PlayerIdentifier.FromTargetOrSelf(handler); arg = PlayerIdentifier.FromTargetOrSelf(handler);
if (arg.Value == null)
if (arg == null)
return false; return false;
// Define ALL the player variables! // Define ALL the player variables!
Player target = arg.GetConnectedPlayer(); Player target = arg.Value.GetConnectedPlayer();
ObjectGuid targetGuid = arg.GetGUID(); ObjectGuid targetGuid = arg.Value.GetGUID();
string targetName = arg.GetName(); string targetName = arg.Value.GetName();
PreparedStatement stmt; PreparedStatement stmt;
/* The variables we extract for the command. They are /* The variables we extract for the command. They are
@@ -1450,7 +1449,7 @@ namespace Game.Chat
} }
[CommandNonGroup("playall", RBACPermissions.CommandPlayall)] [CommandNonGroup("playall", RBACPermissions.CommandPlayall)]
static bool HandlePlayAllCommand(CommandHandler handler, uint soundId, uint? broadcastTextId) static bool HandlePlayAllCommand(CommandHandler handler, uint soundId, OptionalArg<uint> broadcastTextId)
{ {
if (!CliDB.SoundKitStorage.ContainsKey(soundId)) if (!CliDB.SoundKitStorage.ContainsKey(soundId))
{ {
@@ -1801,12 +1800,12 @@ namespace Game.Chat
} }
[CommandNonGroup("unfreeze", RBACPermissions.CommandUnfreeze)] [CommandNonGroup("unfreeze", RBACPermissions.CommandUnfreeze)]
static bool HandleUnFreezeCommand(CommandHandler handler, [OptionalArg] string targetNameArg) static bool HandleUnFreezeCommand(CommandHandler handler, OptionalArg<string> targetNameArg)
{ {
string name = ""; string name = "";
Player player; Player player;
if (!targetNameArg.IsEmpty()) if (targetNameArg.HasValue)
{ {
name = targetNameArg; name = targetNameArg;
ObjectManager.NormalizePlayerName(ref name); ObjectManager.NormalizePlayerName(ref name);
@@ -1830,7 +1829,7 @@ namespace Game.Chat
} }
else else
{ {
if (!targetNameArg.IsEmpty()) if (!targetNameArg.HasValue)
{ {
// Check for offline players // Check for offline players
ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(name); ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(name);
@@ -2022,24 +2021,32 @@ namespace Game.Chat
[CommandGroup("additem")] [CommandGroup("additem")]
class MiscAddItemCommands class MiscAddItemCommands
{ {
[Command("", RBACPermissions.CommandAdditem)] static bool HandleAddItemCommandHelper(CommandHandler handler, Player player, Player playerTarget, VariantArg<ItemLinkData, uint, string> itemArg, OptionalArg<int> countArg, OptionalArg<string> bonusListIdString, OptionalArg<byte> itemContextArg)
static bool HandleAddItemCommand(CommandHandler handler, StringArguments args)
{ {
if (args.Empty())
return false;
uint itemId = 0; uint itemId = 0;
List<uint> bonusListIDs = new();
ItemContext itemContext = ItemContext.None;
if (itemArg.Is<ItemLinkData>())
{
ItemLinkData itemLinkData = itemArg.GetValue();
itemId = itemLinkData.Item.GetId();
bonusListIDs = itemLinkData.ItemBonusListIDs;
itemContext = (ItemContext)itemLinkData.Context;
}
else if (itemArg.Is<uint>())
itemId = itemArg;
else if (itemArg.Is<string>())
{
string itemName = itemArg;
if (itemName.StartsWith('['))
itemName.Remove(0, 1);
if (itemName.EndsWith(']'))
itemName.Remove(itemName.Length - 1, 1);
if (args[0] == '[') // [name] manual form var record = CliDB.ItemSparseStorage.Values.FirstOrDefault(sparse =>
{ {
string itemName = args.NextString("]").Substring(1); for (Locale i = Locale.enUS; i < Locale.Total; i += 1)
if (itemName == sparse.Display[i])
if (!string.IsNullOrEmpty(itemName))
{
var record = CliDB.ItemSparseStorage.Values.FirstOrDefault(itemSparse =>
{
for (Locale i = 0; i < Locale.Total; ++i)
if (itemName == itemSparse.Display[i])
return true; return true;
return false; return false;
}); });
@@ -2049,56 +2056,36 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.CommandCouldnotfind, itemName); handler.SendSysMessage(CypherStrings.CommandCouldnotfind, itemName);
return false; return false;
} }
itemId = record.Id; itemId = record.Id;
} }
else
return false;
}
else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r
{
string idStr = handler.ExtractKeyFromLink(args, "Hitem");
if (string.IsNullOrEmpty(idStr))
return false;
if (!uint.TryParse(idStr, out itemId)) int count = countArg.GetValueOrDefault(1);
return false;
}
int count = args.NextInt32();
if (count == 0) if (count == 0)
count = 1; count = 1;
List<uint> bonusListIDs = new();
var bonuses = args.NextString();
var context = args.NextString();
// semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!) // semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!)
if (!bonuses.IsEmpty()) if (bonusListIdString.HasValue)
{ {
var tokens = new StringArray(bonuses, ';'); var tokens = new StringArray(bonusListIdString.Value, ';');
for (var i = 0; i < tokens.Length; ++i) foreach (string token in tokens)
{ {
if (uint.TryParse(tokens[i], out uint id)) if (uint.TryParse(token, out uint bonusListId))
bonusListIDs.Add(id); bonusListIDs.Add(bonusListId);
} }
} }
ItemContext itemContext = ItemContext.None; if (itemContextArg.HasValue)
if (!context.IsEmpty())
{ {
itemContext = context.ToEnum<ItemContext>(); itemContext = (ItemContext)itemContextArg.Value;
if (itemContext < ItemContext.Max) if (itemContext < ItemContext.Max)
{ {
var contextBonuses = ItemBonusMgr.GetBonusListsForItem(itemId, new(itemContext)); var contextBonuses = ItemBonusMgr.GetBonusListsForItem(itemId, new(itemContext));
bonusListIDs.AddRange(contextBonuses); bonusListIDs.AddRange(contextBonuses);
bonusListIDs.Sort();
} }
} }
Player player = handler.GetSession().GetPlayer();
Player playerTarget = handler.GetSelectedPlayer();
if (playerTarget == null)
playerTarget = player;
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemId); ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemId);
if (itemTemplate == null) if (itemTemplate == null)
{ {
@@ -2129,15 +2116,14 @@ namespace Game.Chat
// failed to destroy items of the amount requested // failed to destroy items of the amount requested
handler.SendSysMessage(CypherStrings.RemoveitemFailure, itemId, -count, handler.GetNameLink(playerTarget)); handler.SendSysMessage(CypherStrings.RemoveitemFailure, itemId, -count, handler.GetNameLink(playerTarget));
} }
return true; return true;
} }
// Adding items // Adding items
uint noSpaceForCount = 0;
// check space and find places // check space and find places
List<ItemPosCount> dest = new(); List<ItemPosCount> dest = new();
InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, (uint)count, out noSpaceForCount); InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, (uint)count, out uint noSpaceForCount);
if (msg != InventoryResult.Ok) // convert to possible store amount if (msg != InventoryResult.Ok) // convert to possible store amount
count -= (int)noSpaceForCount; count -= (int)noSpaceForCount;
@@ -2147,14 +2133,15 @@ namespace Game.Chat
return false; return false;
} }
Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, itemContext, bonusListIDs.Empty() ? null : bonusListIDs); Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, itemContext,
bonusListIDs.Empty() ? null : bonusListIDs);
// remove binding (let GM give it to another player later) // remove binding (let GM give it to another player later)
if (player == playerTarget) if (player == playerTarget)
{ {
foreach (var posCount in dest) foreach (var itemPosCount in dest)
{ {
Item item1 = player.GetItemByPos(posCount.pos); Item item1 = player.GetItemByPos(itemPosCount.pos);
if (item1 != null) if (item1 != null)
item1.SetBinding(false); item1.SetBinding(false);
} }
@@ -2172,10 +2159,21 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.ItemCannotCreate, itemId, noSpaceForCount); handler.SendSysMessage(CypherStrings.ItemCannotCreate, itemId, noSpaceForCount);
return true; return true;
}
[Command("", RBACPermissions.CommandAdditem, true)]
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 playerTarget = handler.GetSelectedPlayerOrSelf();
return HandleAddItemCommandHelper(handler, player, playerTarget, item, countArg, bonusListIdString, itemContextArg);
} }
[Command("set", RBACPermissions.CommandAdditemset)] [Command("set", RBACPermissions.CommandAdditemset)]
static bool HandleAddItemSetCommand(CommandHandler handler, uint itemSetId, [OptionalArg] string bonuses, byte? context) static bool HandleAddItemSetCommand(CommandHandler handler, VariantArg<ItemLinkData, uint> itemSetId, OptionalArg<string> bonuses, OptionalArg<byte> context)
{ {
// prevent generation all items with itemset field value '0' // prevent generation all items with itemset field value '0'
if (itemSetId == 0) if (itemSetId == 0)
@@ -2187,7 +2185,7 @@ namespace Game.Chat
List<uint> bonusListIDs = new(); List<uint> bonusListIDs = new();
// semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!) // semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!)
if (!bonuses.IsEmpty()) if (bonuses.HasValue)
{ {
var tokens = new StringArray(bonuses, ';'); var tokens = new StringArray(bonuses, ';');
for (var i = 0; i < tokens.Length; ++i) for (var i = 0; i < tokens.Length; ++i)
@@ -2255,164 +2253,16 @@ namespace Game.Chat
} }
[Command("to", RBACPermissions.CommandAdditemset)] [Command("to", RBACPermissions.CommandAdditemset)]
static bool HandleAddItemToCommand(CommandHandler handler, StringArguments args) static bool HandleAddItemToCommand(CommandHandler handler, PlayerIdentifier target, VariantArg<ItemLinkData, uint, string> item, OptionalArg<int> countArg, OptionalArg<string> bonusListIdString, OptionalArg<byte> itemContextArg)
{ {
if (args.Empty())
return false;
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
Player playerTarget = null; if (!target.IsConnected())
if (!handler.ExtractPlayerTarget(args, out playerTarget))
return false;
StringArguments tailArgs = new StringArguments(args.NextString(""));
if (tailArgs.Empty())
return false;
uint itemId = 0;
if (tailArgs[0] == '[') // [name] manual form
{ {
string itemNameStr = tailArgs.NextString("]"); handler.SendSysMessage(CypherStrings.PlayerNotFound);
if (!itemNameStr.IsEmpty())
{
string itemName = itemNameStr.Substring(1);
var itr = CliDB.ItemSparseStorage.Values.FirstOrDefault(sparse =>
{
for (Locale i = Locale.enUS; i < Locale.Total; ++i)
if (itemName == sparse.Display[i])
return true;
return false;
});
if (itr == null)
{
handler.SendSysMessage(CypherStrings.CommandCouldnotfind, itemName);
return false; return false;
} }
itemId = itr.Id; return HandleAddItemCommandHelper(handler, player, target.GetConnectedPlayer(), item, countArg, bonusListIdString, itemContextArg);
}
else
return false;
}
else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r
{
string id = handler.ExtractKeyFromLink(tailArgs, "Hitem");
if (id.IsEmpty())
return false;
itemId = uint.Parse(id);
}
string ccount = tailArgs.NextString();
int count = 1;
if (!ccount.IsEmpty())
count = int.Parse(ccount);
if (count == 0)
count = 1;
List<uint> bonusListIDs = new();
string bonuses = tailArgs.NextString();
string context = tailArgs.NextString();
ItemContext itemContext = ItemContext.None;
if (!context.IsEmpty())
{
itemContext = context.ToEnum<ItemContext>();
if (itemContext < ItemContext.Max)
{
var contextBonuses = ItemBonusMgr.GetBonusListsForItem(itemId, new(itemContext));
bonusListIDs.AddRange(contextBonuses);
}
}
// semicolon separated bonuslist ids
if (!bonuses.IsEmpty())
{
foreach (var token in bonuses.Split(';', StringSplitOptions.RemoveEmptyEntries))
{
if (uint.TryParse(token, out uint bonusListId))
bonusListIDs.Add(bonusListId);
}
}
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemId);
if (itemTemplate == null)
{
handler.SendSysMessage(CypherStrings.CommandItemidinvalid, itemId);
return false;
}
// Subtract
if (count < 0)
{
uint destroyedItemCount = playerTarget.DestroyItemCount(itemId, (uint)-count, true, false);
if (destroyedItemCount > 0)
{
// output the amount of items successfully destroyed
handler.SendSysMessage(CypherStrings.Removeitem, itemId, destroyedItemCount, handler.GetNameLink(playerTarget));
// check to see if we were unable to destroy all of the amount requested.
uint unableToDestroyItemCount = (uint)(-count - destroyedItemCount);
if (unableToDestroyItemCount > 0)
{
// output message for the amount of items we couldn't destroy
handler.SendSysMessage(CypherStrings.RemoveitemFailure, itemId, unableToDestroyItemCount, handler.GetNameLink(playerTarget));
}
}
else
{
// failed to destroy items of the amount requested
handler.SendSysMessage(CypherStrings.RemoveitemFailure, itemId, -count, handler.GetNameLink(playerTarget));
}
return true;
}
// Adding items
uint noSpaceForCount = 0;
// check space and find places
List<ItemPosCount> dest = new();
InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, (uint)count, out noSpaceForCount);
if (msg != InventoryResult.Ok) // convert to possible store amount
count -= (int)noSpaceForCount;
if (count == 0 || dest.Empty()) // can't add any
{
handler.SendSysMessage(CypherStrings.ItemCannotCreate, itemId, noSpaceForCount);
return false;
}
Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, itemContext, bonusListIDs.Empty() ? null : bonusListIDs);
// remove binding (let GM give it to another player later)
if (player == playerTarget)
{
foreach (var itemPostCount in dest)
{
Item item1 = player.GetItemByPos(itemPostCount.pos);
if (item1 != null)
item1.SetBinding(false);
}
}
if (count > 0 && item != null)
{
player.SendNewItem(item, (uint)count, false, true);
if (player != playerTarget)
playerTarget.SendNewItem(item, (uint)count, true, false);
}
if (noSpaceForCount > 0)
handler.SendSysMessage(CypherStrings.ItemCannotCreate, itemId, noSpaceForCount);
return true;
} }
} }
} }
+6 -6
View File
@@ -94,7 +94,7 @@ namespace Game.Chat
} }
[Command("faction", RBACPermissions.CommandModifyFaction)] [Command("faction", RBACPermissions.CommandModifyFaction)]
static bool HandleModifyFactionCommand(CommandHandler handler, uint? factionid, uint? flag, ulong? npcflag, uint? dyflag) static bool HandleModifyFactionCommand(CommandHandler handler, OptionalArg<uint> factionid, OptionalArg<uint> flag, OptionalArg<ulong> npcflag, OptionalArg<uint> dyflag)
{ {
Creature target = handler.GetSelectedCreature(); Creature target = handler.GetSelectedCreature();
if (target == null) if (target == null)
@@ -104,13 +104,13 @@ namespace Game.Chat
} }
if (!flag.HasValue) if (!flag.HasValue)
flag = target.m_unitData.Flags; flag = (uint)target.m_unitData.Flags;
if (!npcflag.HasValue) if (!npcflag.HasValue)
npcflag = (ulong)target.m_unitData.NpcFlags2 << 32 | target.m_unitData.NpcFlags; npcflag = (ulong)target.m_unitData.NpcFlags2 << 32 | target.m_unitData.NpcFlags;
if (!dyflag.HasValue) if (!dyflag.HasValue)
dyflag = target.m_objectData.DynamicFlags; dyflag = (uint)target.m_objectData.DynamicFlags;
if (!factionid.HasValue) if (!factionid.HasValue)
{ {
@@ -127,10 +127,10 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid.Value, flag.Value, npcflag.Value, dyflag.Value); handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid.Value, flag.Value, npcflag.Value, dyflag.Value);
target.SetFaction(factionid.Value); target.SetFaction(factionid.Value);
target.ReplaceAllUnitFlags((UnitFlags)flag); target.ReplaceAllUnitFlags((UnitFlags)flag.Value);
target.ReplaceAllNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF)); target.ReplaceAllNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF));
target.ReplaceAllNpcFlags2((NPCFlags2)(npcflag >> 32)); target.ReplaceAllNpcFlags2((NPCFlags2)(npcflag >> 32));
target.ReplaceAllDynamicFlags((UnitDynFlags)dyflag); target.ReplaceAllDynamicFlags((UnitDynFlags)dyflag.Value);
return true; return true;
} }
@@ -427,7 +427,7 @@ namespace Game.Chat
} }
[Command("phase", RBACPermissions.CommandModifyPhase)] [Command("phase", RBACPermissions.CommandModifyPhase)]
static bool HandleModifyPhaseCommand(CommandHandler handler, uint phaseId, uint? visibleMapId) static bool HandleModifyPhaseCommand(CommandHandler handler, uint phaseId, OptionalArg<uint> visibleMapId)
{ {
if (phaseId != 0 && !CliDB.PhaseStorage.ContainsKey(phaseId)) if (phaseId != 0 && !CliDB.PhaseStorage.ContainsKey(phaseId))
{ {
+12 -12
View File
@@ -47,7 +47,7 @@ namespace Game.Chat
} }
[Command("evade", RBACPermissions.CommandNpcEvade)] [Command("evade", RBACPermissions.CommandNpcEvade)]
static bool HandleNpcEvadeCommand(CommandHandler handler, EvadeReason? why, string force) static bool HandleNpcEvadeCommand(CommandHandler handler, OptionalArg<EvadeReason> why, string force)
{ {
Creature creatureTarget = handler.GetSelectedCreature(); Creature creatureTarget = handler.GetSelectedCreature();
if (creatureTarget == null || creatureTarget.IsPet()) if (creatureTarget == null || creatureTarget.IsPet())
@@ -165,7 +165,7 @@ namespace Game.Chat
} }
[Command("move", RBACPermissions.CommandNpcMove)] [Command("move", RBACPermissions.CommandNpcMove)]
static bool HandleNpcMoveCommand(CommandHandler handler, ulong? spawnId) static bool HandleNpcMoveCommand(CommandHandler handler, OptionalArg<ulong> spawnId)
{ {
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -214,7 +214,7 @@ namespace Game.Chat
} }
[Command("near", RBACPermissions.CommandNpcNear)] [Command("near", RBACPermissions.CommandNpcNear)]
static bool HandleNpcNearCommand(CommandHandler handler, float? dist) static bool HandleNpcNearCommand(CommandHandler handler, OptionalArg<float> dist)
{ {
float distance = dist.GetValueOrDefault(10.0f); float distance = dist.GetValueOrDefault(10.0f);
uint count = 0; uint count = 0;
@@ -699,7 +699,7 @@ namespace Game.Chat
} }
[Command("item", RBACPermissions.CommandNpcAddItem)] [Command("item", RBACPermissions.CommandNpcAddItem)]
static bool HandleNpcAddVendorItemCommand(CommandHandler handler, uint itemId, uint? mc, uint? it, uint? ec, [OptionalArg] string bonusListIds) static bool HandleNpcAddVendorItemCommand(CommandHandler handler, uint itemId, OptionalArg<uint> mc, OptionalArg<uint> it, OptionalArg<uint> ec, OptionalArg<string> bonusListIds)
{ {
if (itemId == 0) if (itemId == 0)
{ {
@@ -726,7 +726,7 @@ namespace Game.Chat
vItem.ExtendedCost = extendedcost; vItem.ExtendedCost = extendedcost;
vItem.Type = ItemVendorType.Item; vItem.Type = ItemVendorType.Item;
if (!bonusListIds.IsEmpty()) if (bonusListIds.HasValue)
{ {
var bonusListIDsTok = new StringArray(bonusListIds, ';'); var bonusListIDsTok = new StringArray(bonusListIds, ';');
if (!bonusListIDsTok.IsEmpty()) if (!bonusListIDsTok.IsEmpty())
@@ -773,7 +773,7 @@ namespace Game.Chat
} }
[Command("formation", RBACPermissions.CommandNpcAddFormation)] [Command("formation", RBACPermissions.CommandNpcAddFormation)]
static bool HandleNpcAddFormationCommand(CommandHandler handler, ulong leaderGUID, bool? linkedAggro, bool? formationMovement) static bool HandleNpcAddFormationCommand(CommandHandler handler, ulong leaderGUID, OptionalArg<bool> linkedAggro, OptionalArg<bool> formationMovement)
{ {
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (creature == null || creature.GetSpawnId() == 0) if (creature == null || creature.GetSpawnId() == 0)
@@ -819,14 +819,14 @@ namespace Game.Chat
} }
[Command("temp", RBACPermissions.CommandNpcAddTemp)] [Command("temp", RBACPermissions.CommandNpcAddTemp)]
static bool HandleNpcAddTempSpawnCommand(CommandHandler handler, [OptionalArg] string lootStr, uint id) static bool HandleNpcAddTempSpawnCommand(CommandHandler handler, OptionalArg<string> lootStr, uint id)
{ {
bool loot = false; bool loot = false;
if (!lootStr.IsEmpty()) if (lootStr.HasValue)
{ {
if (lootStr.Equals("loot", StringComparison.OrdinalIgnoreCase)) if (lootStr.Value.Equals("loot", StringComparison.OrdinalIgnoreCase))
loot = true; loot = true;
else if (lootStr.Equals("noloot", StringComparison.OrdinalIgnoreCase)) else if (lootStr.Value.Equals("noloot", StringComparison.OrdinalIgnoreCase))
loot = false; loot = false;
else else
return false; return false;
@@ -846,7 +846,7 @@ namespace Game.Chat
class DeleteCommands class DeleteCommands
{ {
[Command("", RBACPermissions.CommandNpcDelete)] [Command("", RBACPermissions.CommandNpcDelete)]
static bool HandleNpcDeleteCommand(CommandHandler handler, ulong? spawnIdArg) static bool HandleNpcDeleteCommand(CommandHandler handler, OptionalArg<ulong> spawnIdArg)
{ {
ulong spawnId; ulong spawnId;
if (spawnIdArg.HasValue) if (spawnIdArg.HasValue)
@@ -1151,7 +1151,7 @@ namespace Game.Chat
} }
[Command("movetype", RBACPermissions.CommandNpcSetMovetype)] [Command("movetype", RBACPermissions.CommandNpcSetMovetype)]
static bool HandleNpcSetMoveTypeCommand(CommandHandler handler, ulong? lowGuid, string type, string nodel) static bool HandleNpcSetMoveTypeCommand(CommandHandler handler, OptionalArg<ulong> lowGuid, string type, string nodel)
{ {
// 3 arguments: // 3 arguments:
// GUID (optional - you can also select the creature) // GUID (optional - you can also select the creature)
+1 -1
View File
@@ -119,7 +119,7 @@ namespace Game.Chat
} }
[Command("level", RBACPermissions.CommandPetLevel)] [Command("level", RBACPermissions.CommandPetLevel)]
static bool HandlePetLevelCommand(CommandHandler handler, int? level) static bool HandlePetLevelCommand(CommandHandler handler, OptionalArg<int> level)
{ {
Pet pet = GetSelectedPlayerPetOrOwn(handler); Pet pet = GetSelectedPlayerPetOrOwn(handler);
Player owner = pet != null ? pet.GetOwner() : null; Player owner = pet != null ? pet.GetOwner() : null;
+4 -4
View File
@@ -13,7 +13,7 @@ namespace Game.Chat.Commands
class RbacComands class RbacComands
{ {
[Command("list", RBACPermissions.CommandRbacList, true)] [Command("list", RBACPermissions.CommandRbacList, true)]
static bool HandleRBACListPermissionsCommand(CommandHandler handler, uint? permId) static bool HandleRBACListPermissionsCommand(CommandHandler handler, OptionalArg<uint> permId)
{ {
if (!permId.HasValue) if (!permId.HasValue)
{ {
@@ -49,7 +49,7 @@ namespace Game.Chat.Commands
class RbacAccountCommands class RbacAccountCommands
{ {
[Command("deny", RBACPermissions.CommandRbacAccPermDeny, true)] [Command("deny", RBACPermissions.CommandRbacAccPermDeny, true)]
static bool HandleRBACPermDenyCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId) static bool HandleRBACPermDenyCommand(CommandHandler handler, AccountIdentifier account, uint permId, OptionalArg<int> realmId)
{ {
if (account == null) if (account == null)
account = AccountIdentifier.FromTarget(handler); account = AccountIdentifier.FromTarget(handler);
@@ -92,7 +92,7 @@ namespace Game.Chat.Commands
} }
[Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)] [Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)]
static bool HandleRBACPermGrantCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId) static bool HandleRBACPermGrantCommand(CommandHandler handler, AccountIdentifier account, uint permId, OptionalArg<int> realmId)
{ {
if (account == null) if (account == null)
account = AccountIdentifier.FromTarget(handler); account = AccountIdentifier.FromTarget(handler);
@@ -186,7 +186,7 @@ namespace Game.Chat.Commands
} }
[Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)] [Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)]
static bool HandleRBACPermRevokeCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId) static bool HandleRBACPermRevokeCommand(CommandHandler handler, AccountIdentifier account, uint permId, OptionalArg<int> realmId)
{ {
if (account == null) if (account == null)
account = AccountIdentifier.FromTarget(handler); account = AccountIdentifier.FromTarget(handler);
+1 -1
View File
@@ -59,7 +59,7 @@ namespace Game.Chat
} }
[Command("playpackage", RBACPermissions.CommandScenePlayPackage)] [Command("playpackage", RBACPermissions.CommandScenePlayPackage)]
static bool HandlePlayScenePackageCommand(CommandHandler handler, uint sceneScriptPackageId, SceneFlags? flags) static bool HandlePlayScenePackageCommand(CommandHandler handler, uint sceneScriptPackageId, OptionalArg<SceneFlags> flags)
{ {
Player target = handler.GetSelectedPlayerOrSelf(); Player target = handler.GetSelectedPlayerOrSelf();
if (target == null) if (target == null)
+9 -10
View File
@@ -13,7 +13,7 @@ namespace Game.Chat
class SpellCommands class SpellCommands
{ {
[CommandNonGroup("cooldown", RBACPermissions.CommandCooldown)] [CommandNonGroup("cooldown", RBACPermissions.CommandCooldown)]
static bool HandleCooldownCommand(CommandHandler handler, uint? spellIdArg) static bool HandleCooldownCommand(CommandHandler handler, OptionalArg<SpellInfo> spellIdArg)
{ {
Unit target = handler.GetSelectedUnit(); Unit target = handler.GetSelectedUnit();
if (target == null) if (target == null)
@@ -38,16 +38,15 @@ namespace Game.Chat
} }
else else
{ {
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellIdArg.Value, target.GetMap().GetDifficultyID()); if (spellIdArg.Value == null)
if (spellInfo == null)
{ {
handler.SendSysMessage(CypherStrings.UnknownSpell, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink); handler.SendSysMessage(CypherStrings.UnknownSpell, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink);
return false; return false;
} }
target.GetSpellHistory().ResetCooldown(spellInfo.Id, true); target.GetSpellHistory().ResetCooldown(spellIdArg.Value.Id, true);
target.GetSpellHistory().ResetCharges(spellInfo.ChargeCategoryId); target.GetSpellHistory().ResetCharges(spellIdArg.Value.ChargeCategoryId);
handler.SendSysMessage(CypherStrings.RemoveallCooldown, spellInfo.Id, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink); handler.SendSysMessage(CypherStrings.RemoveallCooldown, spellIdArg.Value.Id, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink);
} }
return true; return true;
} }
@@ -104,7 +103,7 @@ namespace Game.Chat
} }
[CommandNonGroup("setskill", RBACPermissions.CommandSetskill)] [CommandNonGroup("setskill", RBACPermissions.CommandSetskill)]
static bool HandleSetSkillCommand(CommandHandler handler, uint skillId, uint level, uint? maxSkillArg) static bool HandleSetSkillCommand(CommandHandler handler, VariantArg<SkillLinkData, uint> skillId, uint level, OptionalArg<uint> maxSkillArg)
{ {
Player target = handler.GetSelectedPlayerOrSelf(); Player target = handler.GetSelectedPlayerOrSelf();
if (target == null) if (target == null)
@@ -120,11 +119,11 @@ namespace Game.Chat
return false; return false;
} }
bool targetHasSkill = target.GetSkillValue((SkillType)skillId) != 0; bool targetHasSkill = target.GetSkillValue((SkillType)skillId.GetValue()) != 0;
// If our target does not yet have the skill they are trying to add to them, the chosen level also becomes // If our target does not yet have the skill they are trying to add to them, the chosen level also becomes
// the max level of the new profession. // the max level of the new profession.
ushort max = (ushort)maxSkillArg.GetValueOrDefault(targetHasSkill ? target.GetPureMaxSkillValue((SkillType)skillId) : level); ushort max = (ushort)maxSkillArg.GetValueOrDefault(targetHasSkill ? target.GetPureMaxSkillValue((SkillType)skillId.GetValue()) : level);
if (level == 0 || level > max) if (level == 0 || level > max)
return false; return false;
@@ -132,7 +131,7 @@ namespace Game.Chat
// If the player has the skill, we get the current skill step. If they don't have the skill, we // If the player has the skill, we get the current skill step. If they don't have the skill, we
// add the skill to the player's book with step 1 (which is the first rank, in most cases something // add the skill to the player's book with step 1 (which is the first rank, in most cases something
// like 'Apprentice <skill>'. // like 'Apprentice <skill>'.
target.SetSkill((SkillType)skillId, (uint)(targetHasSkill ? target.GetSkillStep((SkillType)skillId) : 1), level, max); target.SetSkill((SkillType)skillId.GetValue(), (uint)(targetHasSkill ? target.GetSkillStep((SkillType)skillId.GetValue()) : 1), level, max);
handler.SendSysMessage(CypherStrings.SetSkill, skillId, skillLine.DisplayName[handler.GetSessionDbcLocale()], handler.GetNameLink(target), level, max); handler.SendSysMessage(CypherStrings.SetSkill, skillId, skillLine.DisplayName[handler.GetSessionDbcLocale()], handler.GetNameLink(target), level, max);
return true; return true;
} }
+8 -8
View File
@@ -223,23 +223,23 @@ namespace Game.Chat
class TeleNameCommands class TeleNameCommands
{ {
[Command("", RBACPermissions.CommandTeleName, true)] [Command("", RBACPermissions.CommandTeleName, true)]
static bool HandleTeleNameCommand(CommandHandler handler, [OptionalArg] PlayerIdentifier player, [VariantArg<GameTele, string>] object where) static bool HandleTeleNameCommand(CommandHandler handler, OptionalArg<PlayerIdentifier> player, VariantArg<GameTele, string> where)
{ {
if (player == null) if (!player.HasValue)
player = PlayerIdentifier.FromTargetOrSelf(handler); player = PlayerIdentifier.FromTargetOrSelf(handler);
if (player == null) if (player.Value == null)
return false; return false;
Player target = player.GetConnectedPlayer(); Player target = player.Value.GetConnectedPlayer();
if (where is string && where.Equals("$home")) // References target's homebind if (where.Is<string>() && ((string)where).Equals("$home")) // References target's homebind
{ {
if (target != null) if (target != null)
target.TeleportTo(target.GetHomebind()); target.TeleportTo(target.GetHomebind());
else else
{ {
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHAR_HOMEBIND); PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHAR_HOMEBIND);
stmt.AddValue(0, player.GetGUID().GetCounter()); stmt.AddValue(0, player.Value.GetGUID().GetCounter());
SQLResult result = DB.Characters.Query(stmt); SQLResult result = DB.Characters.Query(stmt);
if (!result.IsEmpty()) if (!result.IsEmpty())
@@ -247,7 +247,7 @@ namespace Game.Chat
WorldLocation loc = new(result.Read<ushort>(0), result.Read<float>(2), result.Read<float>(3), result.Read<float>(4), 0.0f); WorldLocation loc = new(result.Read<ushort>(0), result.Read<float>(2), result.Read<float>(3), result.Read<float>(4), 0.0f);
uint zoneId = result.Read<ushort>(1); uint zoneId = result.Read<ushort>(1);
Player.SavePositionInDB(loc, zoneId, player.GetGUID()); Player.SavePositionInDB(loc, zoneId, player.Value.GetGUID());
} }
} }
@@ -255,7 +255,7 @@ namespace Game.Chat
} }
// id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
GameTele tele = where as GameTele; GameTele tele = where;
return DoNameTeleport(handler, player, tele.mapId, new Position(tele.posX, tele.posY, tele.posZ, tele.orientation), tele.name); return DoNameTeleport(handler, player, tele.mapId, new Position(tele.posX, tele.posY, tele.posZ, tele.orientation), tele.name);
} }
+3 -3
View File
@@ -16,7 +16,7 @@ namespace Game.Chat.Commands
class WPCommands class WPCommands
{ {
[Command("add", RBACPermissions.CommandWpAdd)] [Command("add", RBACPermissions.CommandWpAdd)]
static bool HandleWpAddCommand(CommandHandler handler, uint? pathId) static bool HandleWpAddCommand(CommandHandler handler, OptionalArg<uint> pathId)
{ {
Creature target = handler.GetSelectedCreature(); Creature target = handler.GetSelectedCreature();
@@ -91,7 +91,7 @@ namespace Game.Chat.Commands
} }
[Command("load", RBACPermissions.CommandWpLoad)] [Command("load", RBACPermissions.CommandWpLoad)]
static bool HandleWpLoadCommand(CommandHandler handler, uint? pathId) static bool HandleWpLoadCommand(CommandHandler handler, OptionalArg<uint> pathId)
{ {
Creature target = handler.GetSelectedCreature(); Creature target = handler.GetSelectedCreature();
if (target == null) if (target == null)
@@ -224,7 +224,7 @@ namespace Game.Chat.Commands
} }
[Command("show", RBACPermissions.CommandWpShow)] [Command("show", RBACPermissions.CommandWpShow)]
static bool HandleWpShowCommand(CommandHandler handler, string subCommand, uint? pathId) static bool HandleWpShowCommand(CommandHandler handler, string subCommand, OptionalArg<uint> pathId)
{ {
// first arg: on, off, first, last // first arg: on, off, first, last
if (subCommand.IsEmpty()) if (subCommand.IsEmpty())
+104 -75
View File
@@ -12,16 +12,26 @@ namespace Game.Chat
{ {
value = default; value = default;
HyperlinkInfo info = ParseHyperlink(arg); HyperlinkInfo info = ParseSingleHyperlink(arg);
// invalid hyperlinks cannot be consumed // invalid hyperlinks cannot be consumed
if (info == null) if (info == null)
return default; return default;
if (!typeof(IHyperlink).IsAssignableFrom(type))
return default;
IHyperlink hyperLinkValue = (IHyperlink)Activator.CreateInstance(type);
// check if we got the right tag
if (info.Tag != hyperLinkValue.tag())
return default;
// store value // store value
HyperlinkDataTokenizer t = new(info.Data, true); if (!hyperLinkValue.Parse(info.Data))
if (!t.TryConsumeTo(out value, type))
return new ChatCommandResult(handler.GetCypherString(CypherStrings.CmdparserLinkdataInvalid)); return new ChatCommandResult(handler.GetCypherString(CypherStrings.CmdparserLinkdataInvalid));
value = hyperLinkValue;
// finally, skip any potential delimiters // finally, skip any potential delimiters
var (token, next) = info.Tail.Tokenize(); var (token, next) = info.Tail.Tokenize();
if (token.IsEmpty()) /* empty token = first character is delimiter, skip past it */ if (token.IsEmpty()) /* empty token = first character is delimiter, skip past it */
@@ -61,7 +71,7 @@ namespace Game.Chat
continue; continue;
} }
HyperlinkInfo info = ParseHyperlink(str.Substring(pos)); HyperlinkInfo info = ParseSingleHyperlink(str.Substring(pos));
if (info == null)// todo fix me || !ValidateLinkInfo(info)) if (info == null)// todo fix me || !ValidateLinkInfo(info))
return false; return false;
@@ -74,107 +84,126 @@ namespace Game.Chat
return true; return true;
} }
static byte toHex(char c) { return (byte)((c >= '0' && c <= '9') ? c - '0' + 0x10 : (c >= 'a' && c <= 'f') ? c - 'a' + 0x1a : 0x00); } public static HyperlinkInfo ParseSingleHyperlink(string str)
public static HyperlinkInfo ParseHyperlink(string currentString)
{ {
if (currentString.IsEmpty()) if (str.IsEmpty())
return null; return null;
string color = "";
string tag = "";
string data = "";
string text = "";
int pos = 0; int pos = 0;
//color tag //color tag
if (currentString[pos++] != '|' || currentString[pos++] != 'c') if (str[pos++] != '|' || str[pos++] != 'c')
return null; return null;
uint color = 0; if (str.Length < 8)
for (byte i = 0; i < 8; ++i) return null;
if (str[pos] == 'n')
{ {
byte hex = toHex(currentString[pos++]); // numeric color id
if (hex != 0) pos++;
color = (uint)((int)(color << 4) | (hex & 0xf)); int endOfColor = str.IndexOf(":", pos);
if (endOfColor != -1)
{
color = str.Substring(pos, endOfColor - pos);
pos = endOfColor + 1;
}
else else
return null; return null;
} }
else
// link data start tag
if (currentString[pos++] != '|' || currentString[pos++] != 'H')
return null;
// link tag, find next : or |
int tagStart = pos;
int tagLength = 0;
while (pos < currentString.Length && currentString[pos] != '|' && currentString[pos++] != ':') // we only advance pointer to one past if the last thing is : (not for |), this is intentional!
++tagLength;
// ok, link data, skip to next |
int dataStart = pos;
int dataLength = 0;
while (pos < currentString.Length && currentString[pos++] != '|')
++dataLength;
// ok, next should be link data end tag...
if (currentString[pos++] != 'h')
return null;
// then visible link text, starts with [
if (currentString[pos++] != '[')
return null;
// skip until we hit the next ], abort on unexpected |
int textStart = pos;
int textLength = 0;
while (pos < currentString.Length)
{ {
if (currentString[pos] == '|') // hex color
return null; color = str.Substring(pos, 8);
pos += 8;
if (currentString[pos++] == ']')
break;
++textLength;
} }
// link end tag if (str[pos++] != '|' || str[pos++] != 'H')
if (currentString[pos++] != '|' || currentString[pos++] != 'h' || currentString[pos++] != '|' || currentString[pos++] != 'r') return null;
// tag+data part follows
int delimPos = str.IndexOf('|', pos);
if (delimPos != -1)
{
tag = str.Substring(pos, delimPos - pos);
pos = (delimPos + 1);
}
else
return null;
// split tag if : is present (data separator)
int dataStart = tag.IndexOf(':');
if (dataStart != -1)
{
data = tag.Substring(dataStart + 1);
tag = tag.Substring(0, dataStart);
}
// ok, next should be link data end tag...
if (str[pos++] != 'h')
return null;
// extract text, must be between []
if (str[pos] != '[')
return null;
int openBrackets = 0;
for (int nameItr = pos; nameItr < str.Length; ++nameItr)
{
switch (str[nameItr])
{
case '[':
++openBrackets;
break;
case ']':
--openBrackets;
break;
default:
break;
}
if (openBrackets == 0)
{
text = str.Substring(pos + 1, (nameItr - 1) - pos);
pos = nameItr + 1;
break;
}
}
// check end tag
if (str[pos++] != '|' || str[pos++] != 'h' || str[pos++] != '|' || str[pos++] != 'r')
return null; return null;
// ok, valid hyperlink, return info // ok, valid hyperlink, return info
return new HyperlinkInfo(currentString.Substring(pos), color, currentString.Substring(tagStart, tagLength), currentString.Substring(dataStart, dataLength), currentString.Substring(textStart, textLength)); return new(str.Substring(pos), color, tag, data, text);
} }
} }
class HyperlinkInfo class HyperlinkInfo
{ {
public HyperlinkInfo(string t = null, uint c = 0, string tag = null, string data = null, string text = null)
{
Tail = t;
color = new(c);
Tag = tag;
Data = data;
Text = text;
}
public string Tail; public string Tail;
public HyperlinkColor color; public HyperlinkColor color;
public string Tag; public string Tag;
public string Data; public string Data;
public string Text; public string Text;
public HyperlinkInfo(string t, string c, string ta, string d, string te)
{
Tail = t;
color = new(c);
Tag = ta;
Data = d;
Text = te;
}
} }
struct HyperlinkColor struct HyperlinkColor(string c)
{ {
public byte r; public string data = c;
public byte g;
public byte b;
public byte a;
public HyperlinkColor(uint c)
{
r = (byte)(c >> 16);
g = (byte)(c >> 8);
b = (byte)c;
a = (byte)(c >> 24);
}
} }
} }
File diff suppressed because it is too large Load Diff
+4
View File
@@ -86,6 +86,7 @@ namespace Game.DataStorage
BankTabStorage = ReadDB2<BankTabRecord>("BankTab.db2", HotfixStatements.SEL_BANK_TAB); BankTabStorage = ReadDB2<BankTabRecord>("BankTab.db2", HotfixStatements.SEL_BANK_TAB);
BannedAddOnsStorage = ReadDB2<BannedAddonsRecord>("BannedAddons.db2", HotfixStatements.SEL_BANNED_ADDONS); BannedAddOnsStorage = ReadDB2<BannedAddonsRecord>("BannedAddons.db2", HotfixStatements.SEL_BANNED_ADDONS);
BarberShopStyleStorage = ReadDB2<BarberShopStyleRecord>("BarberShopStyle.db2", HotfixStatements.SEL_BARBER_SHOP_STYLE, HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE); BarberShopStyleStorage = ReadDB2<BarberShopStyleRecord>("BarberShopStyle.db2", HotfixStatements.SEL_BARBER_SHOP_STYLE, HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE);
BattlePetAbilityStorage = ReadDB2<BattlePetAbilityRecord>("BattlePetAbility.db2", HotfixStatements.SEL_BATTLE_PET_ABILITY, HotfixStatements.SEL_BATTLE_PET_ABILITY_LOCALE);
BattlePetBreedQualityStorage = ReadDB2<BattlePetBreedQualityRecord>("BattlePetBreedQuality.db2", HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY); BattlePetBreedQualityStorage = ReadDB2<BattlePetBreedQualityRecord>("BattlePetBreedQuality.db2", HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY);
BattlePetBreedStateStorage = ReadDB2<BattlePetBreedStateRecord>("BattlePetBreedState.db2", HotfixStatements.SEL_BATTLE_PET_BREED_STATE); BattlePetBreedStateStorage = ReadDB2<BattlePetBreedStateRecord>("BattlePetBreedState.db2", HotfixStatements.SEL_BATTLE_PET_BREED_STATE);
BattlePetSpeciesStorage = ReadDB2<BattlePetSpeciesRecord>("BattlePetSpecies.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES, HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE); BattlePetSpeciesStorage = ReadDB2<BattlePetSpeciesRecord>("BattlePetSpecies.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES, HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE);
@@ -261,6 +262,7 @@ namespace Game.DataStorage
PathStorage = ReadDB2<PathRecord>("Path.db2", HotfixStatements.SEL_PATH); PathStorage = ReadDB2<PathRecord>("Path.db2", HotfixStatements.SEL_PATH);
PathNodeStorage = ReadDB2<PathNodeRecord>("PathNode.db2", HotfixStatements.SEL_PATH_NODE); PathNodeStorage = ReadDB2<PathNodeRecord>("PathNode.db2", HotfixStatements.SEL_PATH_NODE);
PathPropertyStorage = ReadDB2<PathPropertyRecord>("PathProperty.db2", HotfixStatements.SEL_PATH_PROPERTY); PathPropertyStorage = ReadDB2<PathPropertyRecord>("PathProperty.db2", HotfixStatements.SEL_PATH_PROPERTY);
PerksActivityStorage = ReadDB2<PerksActivityRecord>("PerksActivity.db2", HotfixStatements.SEL_PERKS_ACTIVITY, HotfixStatements.SEL_PERKS_ACTIVITY_LOCALE);
PhaseStorage = ReadDB2<PhaseRecord>("Phase.db2", HotfixStatements.SEL_PHASE); PhaseStorage = ReadDB2<PhaseRecord>("Phase.db2", HotfixStatements.SEL_PHASE);
PhaseXPhaseGroupStorage = ReadDB2<PhaseXPhaseGroupRecord>("PhaseXPhaseGroup.db2", HotfixStatements.SEL_PHASE_X_PHASE_GROUP); PhaseXPhaseGroupStorage = ReadDB2<PhaseXPhaseGroupRecord>("PhaseXPhaseGroup.db2", HotfixStatements.SEL_PHASE_X_PHASE_GROUP);
PlayerConditionStorage = ReadDB2<PlayerConditionRecord>("PlayerCondition.db2", HotfixStatements.SEL_PLAYER_CONDITION, HotfixStatements.SEL_PLAYER_CONDITION_LOCALE); PlayerConditionStorage = ReadDB2<PlayerConditionRecord>("PlayerCondition.db2", HotfixStatements.SEL_PLAYER_CONDITION, HotfixStatements.SEL_PLAYER_CONDITION_LOCALE);
@@ -492,6 +494,7 @@ namespace Game.DataStorage
public static DB6Storage<BankTabRecord> BankTabStorage; public static DB6Storage<BankTabRecord> BankTabStorage;
public static DB6Storage<BannedAddonsRecord> BannedAddOnsStorage; public static DB6Storage<BannedAddonsRecord> BannedAddOnsStorage;
public static DB6Storage<BarberShopStyleRecord> BarberShopStyleStorage; public static DB6Storage<BarberShopStyleRecord> BarberShopStyleStorage;
public static DB6Storage<BattlePetAbilityRecord> BattlePetAbilityStorage;
public static DB6Storage<BattlePetBreedQualityRecord> BattlePetBreedQualityStorage; public static DB6Storage<BattlePetBreedQualityRecord> BattlePetBreedQualityStorage;
public static DB6Storage<BattlePetBreedStateRecord> BattlePetBreedStateStorage; public static DB6Storage<BattlePetBreedStateRecord> BattlePetBreedStateStorage;
public static DB6Storage<BattlePetSpeciesRecord> BattlePetSpeciesStorage; public static DB6Storage<BattlePetSpeciesRecord> BattlePetSpeciesStorage;
@@ -664,6 +667,7 @@ namespace Game.DataStorage
public static DB6Storage<NumTalentsAtLevelRecord> NumTalentsAtLevelStorage; public static DB6Storage<NumTalentsAtLevelRecord> NumTalentsAtLevelStorage;
public static DB6Storage<OverrideSpellDataRecord> OverrideSpellDataStorage; public static DB6Storage<OverrideSpellDataRecord> OverrideSpellDataStorage;
public static DB6Storage<ParagonReputationRecord> ParagonReputationStorage; public static DB6Storage<ParagonReputationRecord> ParagonReputationStorage;
public static DB6Storage<PerksActivityRecord> PerksActivityStorage;
public static DB6Storage<PathRecord> PathStorage; public static DB6Storage<PathRecord> PathStorage;
public static DB6Storage<PathNodeRecord> PathNodeStorage; public static DB6Storage<PathNodeRecord> PathNodeStorage;
public static DB6Storage<PathPropertyRecord> PathPropertyStorage; public static DB6Storage<PathPropertyRecord> PathPropertyStorage;
@@ -39,6 +39,18 @@ namespace Game.DataStorage
public byte Data; // real ID to hair/facial hair public byte Data; // real ID to hair/facial hair
} }
public sealed class BattlePetAbilityRecord
{
public uint Id;
public LocalizedString Name;
public LocalizedString Description;
public int IconFileDataID;
public sbyte PetTypeEnum;
public uint Cooldown;
public ushort BattlePetVisualID;
public byte Flags;
}
public sealed class BattlePetBreedQualityRecord public sealed class BattlePetBreedQualityRecord
{ {
public uint Id; public uint Id;
@@ -43,6 +43,17 @@ namespace Game.DataStorage
public PathPropertyIndex GetPropertyIndex() { return (PathPropertyIndex)PropertyIndex; } public PathPropertyIndex GetPropertyIndex() { return (PathPropertyIndex)PropertyIndex; }
} }
public sealed class PerksActivityRecord
{
public LocalizedString ActivityName;
public LocalizedString Description;
public uint Id;
public int CriteriaTreeID;
public int ThresholdContributionAmount;
public int Supersedes;
public int Priority;
}
public sealed class PhaseRecord public sealed class PhaseRecord
{ {
public uint Id; public uint Id;
+1 -1
View File
@@ -2481,7 +2481,7 @@ namespace Game.Entities
return null; return null;
} }
bool AddSpell(uint spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, uint fromSkill = 0, bool favorite = false, PlayerSpellTrait? trait = null) bool AddSpell(uint spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, uint fromSkill = 0, bool favorite = false, PlayerSpellTrait trait = null)
{ {
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, Difficulty.None); SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, Difficulty.None);
if (spellInfo == null) if (spellInfo == null)