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" +
" 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
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, MaxQualityRoll, StateMultiplier, QualityEnum FROM battle_pet_breed_quality" +
" WHERE (`VerifiedBuild` > 0) = ?");
@@ -1026,6 +1032,12 @@ namespace Framework.Database
// PathProperty.db2
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
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_LOCALE,
SEL_BATTLE_PET_ABILITY,
SEL_BATTLE_PET_ABILITY_LOCALE,
SEL_BATTLE_PET_BREED_QUALITY,
SEL_BATTLE_PET_BREED_STATE,
@@ -2169,6 +2184,9 @@ namespace Framework.Database
SEL_PATH_PROPERTY,
SEL_PERKS_ACTIVITY,
SEL_PERKS_ACTIVITY_LOCALE,
SEL_PHASE,
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)
{
var optionalArgAttribute = parameterInfos[offset].GetCustomAttribute<OptionalArgAttribute>(true);
if (optionalArgAttribute != null || parameterInfos[offset].ParameterType.IsGenericType && parameterInfos[offset].ParameterType.GetGenericTypeDefinition() == typeof(Nullable<>))
if (parameterInfos[offset].ParameterType.IsGenericType && parameterInfos[offset].ParameterType.GetGenericTypeDefinition() == typeof(OptionalArg<>))
{
// 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 = ConsumeFromOffset(tuple, offset + 1, parameterInfos, handler, result1)).IsSuccessful())
return result1;
@@ -55,9 +55,9 @@ namespace Game.Chat
{
ChatCommandResult next;
var variantArgAttribute = parameterInfos[offset].GetCustomAttribute<VariantArgAttribute>(true);
if (variantArgAttribute != null)
next = TryConsumeVariant(out tuple[offset], variantArgAttribute.Types, handler, args);
var genericTypes = parameterInfos[offset].ParameterType.GetGenericArguments();
if (!genericTypes.Empty())
next = TryConsumeVariant(out tuple[offset], parameterInfos[offset].ParameterType, genericTypes, handler, args);
else
next = TryConsume(out tuple[offset], parameterInfos[offset].ParameterType, handler, args);
@@ -238,54 +238,123 @@ namespace Game.Chat
return val.TryConsume(handler, args);
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)
return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserAchievementNoExist, tempVal));
return result;
}
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)
return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserCurrencyNoExist, tempVal));
return result;
}
case nameof(GameTele):
{
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful())
result = TryConsume(out tempVal, typeof(string), handler, args);
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(TeleLinkData), handler, args);
if (result.IsSuccessful() && (val = Global.ObjectMgr.GetGameTele(tempVal)) != null)
return result;
result = TryConsume(out tempVal, typeof(string), handler, args);
if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetGameTele(tempVal)) != null)
return result;
if (tempVal is uint)
if (tempVal is not string)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleIdNoExist, tempVal));
else
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserGameTeleNoExist, tempVal));
}
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)
return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserItemNoExist, tempVal));
return result;
}
case nameof(SpellInfo):
{
ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args);
if (!result.IsSuccessful() || (val = Global.SpellMgr.GetSpellInfo(tempVal, Difficulty.None)) != null)
SpellInfo getSpellInfo(uint spellId)
{
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 ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserSpellNoExist, tempVal));
}
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)
return result;
if (val is uint)
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserQuestNoExist, tempVal));
return result;
}
}
break;
@@ -295,11 +364,16 @@ namespace Game.Chat
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))
return ChatCommandResult.FromErrorMessage($"{handler.GetCypherString(CypherStrings.CmdparserEither)} {result.GetErrorMessage()}");
val = Activator.CreateInstance(type);
val.Set(tempVal);
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) { }
}
[AttributeUsage(AttributeTargets.Parameter)]
public class OptionalArgAttribute : Attribute { }
public class VariantArgAttribute : Attribute
public struct OptionalArg<T>
{
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 class VariantArg<T1> : VariantArgAttribute
{
public VariantArg() : base(typeof(T1)) { }
public T GetValueOrDefault(T defaultValue) => HasValue ? Value : defaultValue;
public static implicit operator T(OptionalArg<T> optionalArg) => optionalArg.Value;
public static implicit operator OptionalArg<T>(T value) => new OptionalArg<T>(value);
}
[AttributeUsage(AttributeTargets.Parameter)]
public class VariantArg<T1, T2> : VariantArgAttribute
public class VariantArg<T1>
{
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 class VariantArg<T1, T2, T3> : VariantArgAttribute
public bool Is<T>() { return value is T; }
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 class VariantArg<T1, T2, T3, T4> : VariantArgAttribute
public static implicit operator T1(VariantArg<T1> variant) => variant.GetValue();
}
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)
{
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
{
var parseArgs = new dynamic[parameters.Length];
+21 -19
View File
@@ -55,7 +55,7 @@ namespace Game.Chat
}
[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);
if (!masterKey.IsAvailable())
@@ -118,7 +118,7 @@ namespace Game.Chat
}
[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);
if (!masterKey.IsAvailable())
@@ -197,7 +197,7 @@ namespace Game.Chat
}
[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("@"))
{
@@ -205,7 +205,7 @@ namespace Game.Chat
return false;
}
AccountOpResult result = Global.AccountMgr.CreateAccount(accountName, password, email ?? "");
AccountOpResult result = Global.AccountMgr.CreateAccount(accountName, password, email.GetValueOrDefault(""));
switch (result)
{
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}')",
handler.GetSession().GetAccountId(), handler.GetSession().GetRemoteAddress(),
handler.GetSession().GetPlayer().GetName(), handler.GetSession().GetPlayer().GetGUID().ToString(),
accountName, email ?? "");
accountName, email.GetValueOrDefault(""));
}
break;
case AccountOpResult.NameTooLong:
@@ -337,7 +337,7 @@ namespace Game.Chat
}
[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
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)]
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)]
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)]
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)]
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)]
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;
@@ -614,13 +614,13 @@ namespace Game.Chat
}
[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;
if (!accountName.IsEmpty())
if (accountName.HasValue)
{
// Convert Account name to Upper Format
accountName = accountName.ToUpper();
accountName = accountName.Value.ToUpper();
accountId = Global.AccountMgr.GetId(accountName);
if (accountId == 0)
@@ -636,7 +636,8 @@ namespace Game.Chat
return false;
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
@@ -702,10 +703,10 @@ namespace Game.Chat
[Command("seclevel", 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;
if (!accountName.IsEmpty())
if (accountName.HasValue)
{
accountId = Global.AccountMgr.GetId(accountName);
if (accountId == 0)
@@ -721,7 +722,8 @@ namespace Game.Chat
return false;
accountId = player.GetSession().GetAccountId();
Global.AccountMgr.GetName(accountId, out accountName);
Global.AccountMgr.GetName(accountId, out string tempAccountName);
accountName = tempAccountName;
}
if (securityLevel > (uint)AccountTypes.Console)
@@ -12,7 +12,7 @@ namespace Game.Chat.Commands
class BNetAccountCommands
{
[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('@'))
{
+4 -4
View File
@@ -269,13 +269,13 @@ namespace Game.Chat.Commands
class BanListCommands
{
[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);
DB.Login.Execute(stmt);
SQLResult result;
if (filter.IsEmpty())
if (!filter.HasValue)
{
stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_ACCOUNT_BANNED_ALL);
result = DB.Login.Query(stmt);
@@ -378,14 +378,14 @@ namespace Game.Chat.Commands
}
[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);
DB.Login.Execute(stmt);
SQLResult result;
if (filter.IsEmpty())
if (!filter.HasValue)
{
stmt = LoginDatabase.GetPreparedStatement(LoginStatements.SEL_IP_BANNED_ALL);
result = DB.Login.Query(stmt);
+6 -6
View File
@@ -13,7 +13,7 @@ namespace Game.Chat
class CastCommands
{
[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();
if (target == null)
@@ -34,7 +34,7 @@ namespace Game.Chat
}
[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();
if (caster == null)
@@ -56,7 +56,7 @@ namespace Game.Chat
}
[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))
return false;
@@ -74,7 +74,7 @@ namespace Game.Chat
}
[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();
if (target == null)
@@ -96,7 +96,7 @@ namespace Game.Chat
}
[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();
if (caster == null)
@@ -124,7 +124,7 @@ namespace Game.Chat
}
[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();
if (caster == null)
+16 -13
View File
@@ -63,9 +63,9 @@ namespace Game.Chat
//rename characters
[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;
if (player == null)
@@ -77,8 +77,9 @@ namespace Game.Chat
if (handler.HasLowerSecurity(null, player.GetGUID()))
return false;
if (!newName.IsEmpty())
if (newNameV.HasValue)
{
string newName = newNameV;
if (!ObjectManager.NormalizePlayerName(ref newName))
{
handler.SendSysMessage(CypherStrings.BadValue);
@@ -455,7 +456,7 @@ namespace Game.Chat
}
[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();
if (!GetDeletedCharacterInfoList(foundList, needle))
@@ -474,7 +475,7 @@ namespace Game.Chat
}
[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();
if (!GetDeletedCharacterInfoList(foundList, needle))
@@ -489,7 +490,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.CharacterDeletedRestore);
HandleCharacterDeletedListHelper(foundList, handler);
if (newCharName.IsEmpty())
if (!newCharName.HasValue)
{
// Drop not existed account cases
foreach (var info in foundList)
@@ -521,7 +522,7 @@ namespace Game.Chat
}
[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);
@@ -658,13 +659,15 @@ namespace Game.Chat
}
[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)
player = PlayerIdentifier.FromTargetOrSelf(handler);
if (player == null)
if (!playerIdentifier.HasValue)
playerIdentifier = PlayerIdentifier.FromTargetOrSelf(handler);
if (playerIdentifier.Value == null)
return false;
PlayerIdentifier player = playerIdentifier.Value;
int oldlevel = (int)(player.IsConnected() ? player.GetConnectedPlayer().GetLevel() : Global.CharacterCacheStorage.GetCharacterLevelByGuid(player.GetGUID()));
int newlevel = oldlevel + level;
@@ -711,7 +714,7 @@ namespace Game.Chat
class PdumpCommand
{
[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;
@@ -757,7 +760,7 @@ namespace Game.Chat
}
[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))
+6 -6
View File
@@ -11,7 +11,7 @@ namespace Game.Chat.Commands
class CheatCommands
{
[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);
if (enableArg.HasValue)
@@ -32,7 +32,7 @@ namespace Game.Chat.Commands
}
[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);
if (enableArg.HasValue)
@@ -87,7 +87,7 @@ namespace Game.Chat.Commands
}
[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);
if (enableArg.HasValue)
@@ -108,7 +108,7 @@ namespace Game.Chat.Commands
}
[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);
if (enableArg.HasValue)
@@ -152,7 +152,7 @@ namespace Game.Chat.Commands
}
[Command("taxi", RBACPermissions.CommandCheatTaxi)]
static bool HandleTaxiCheatCommand(CommandHandler handler, bool? enableArg)
static bool HandleTaxiCheatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{
Player chr = handler.GetSelectedPlayer();
if (chr == null)
@@ -183,7 +183,7 @@ namespace Game.Chat.Commands
}
[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);
if (enableArg.HasValue)
+13 -13
View File
@@ -440,7 +440,7 @@ namespace Game.Chat
}
[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();
if (player == null)
@@ -448,10 +448,10 @@ namespace Game.Chat
bool explain = false;
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;
else
groupID = (uint)optArg;
groupID = optArg;
if (groupID != 0 && Global.ObjectMgr.GetSpawnGroupData(groupID) == null)
{
@@ -560,7 +560,7 @@ namespace Game.Chat
}
[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)
{
@@ -578,7 +578,7 @@ namespace Game.Chat
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)
return false;
@@ -640,7 +640,7 @@ namespace Game.Chat
}
[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();
if (target == null)
@@ -653,10 +653,10 @@ namespace Game.Chat
}
else
{
target.SetUnitMovementFlags((MovementFlag)moveFlags);
target.SetUnitMovementFlags((MovementFlag)moveFlags.Value);
if (moveFlagsExtra.HasValue)
target.SetUnitMovementFlags2((MovementFlag2)moveFlagsExtra);
target.SetUnitMovementFlags2((MovementFlag2)moveFlagsExtra.Value);
if (moveFlagsExtra2.HasValue)
target.SetExtraUnitMovementFlags2((MovementFlags3)moveFlagsExtra2.Value);
@@ -721,7 +721,7 @@ namespace Game.Chat
}
[Command("objectcount", RBACPermissions.CommandDebug, true)]
static bool HandleDebugObjectCountCommand(CommandHandler handler, uint? mapId)
static bool HandleDebugObjectCountCommand(CommandHandler handler, OptionalArg<uint> mapId)
{
void HandleDebugObjectCountMap(Map map)
{
@@ -792,7 +792,7 @@ namespace Game.Chat
}
[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]
// neutral Sets faction balance off.
@@ -888,7 +888,7 @@ namespace Game.Chat
}
[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();
if (unit == null)
@@ -1230,7 +1230,7 @@ namespace Game.Chat
}
[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))
{
@@ -1409,7 +1409,7 @@ namespace Game.Chat
}
[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.CastID = ObjectGuid.Empty;
+4 -4
View File
@@ -14,7 +14,7 @@ namespace Game.Chat.Commands
[CommandGroup("add")]
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)
{
@@ -125,19 +125,19 @@ namespace Game.Chat.Commands
}
[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);
}
[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);
}
[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);
}
+3 -3
View File
@@ -10,7 +10,7 @@ namespace Game.Chat
class EventCommands
{
[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();
if (eventId >= events.Length)
@@ -74,7 +74,7 @@ namespace Game.Chat
}
[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();
if (eventId < 1 || eventId >= events.Length)
@@ -102,7 +102,7 @@ namespace Game.Chat
}
[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();
if (eventId < 1 || eventId >= events.Length)
+2 -2
View File
@@ -12,7 +12,7 @@ namespace Game.Chat
class GMCommands
{
[Command("chat", RBACPermissions.CommandGmChat)]
static bool HandleGMChatCommand(CommandHandler handler, bool? enableArg)
static bool HandleGMChatCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{
WorldSession session = handler.GetSession();
if (session != null)
@@ -160,7 +160,7 @@ namespace Game.Chat
}
[Command("visible", RBACPermissions.CommandGmVisible)]
static bool HandleGMVisibleCommand(CommandHandler handler, bool? visibleArg)
static bool HandleGMVisibleCommand(CommandHandler handler, OptionalArg<bool> visibleArg)
{
Player _player = handler.GetSession().GetPlayer();
+23 -22
View File
@@ -18,7 +18,7 @@ namespace Game.Chat
class GameObjectCommands
{
[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);
if (obj == null)
@@ -38,7 +38,7 @@ namespace Game.Chat
}
[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);
if (obj != null)
@@ -101,14 +101,14 @@ namespace Game.Chat
}
[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;
GameObjectData spawnData = null;
uint entry;
ulong spawnId = 0;
if (!isGuid.IsEmpty() && isGuid.Equals("guid", StringComparison.OrdinalIgnoreCase))
if (!isGuid.HasValue && isGuid.Value.Equals("guid", StringComparison.OrdinalIgnoreCase))
{
spawnId = data;
spawnData = Global.ObjectMgr.GetGameObjectData(spawnId);
@@ -186,7 +186,7 @@ namespace Game.Chat
}
[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);
if (obj == null)
@@ -196,9 +196,9 @@ namespace Game.Chat
}
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))
{
handler.SendSysMessage(CypherStrings.InvalidTargetCoord, pos.GetPositionX(), pos.GetPositionY(), obj.GetMapId());
@@ -236,7 +236,7 @@ namespace Game.Chat
}
[Command("near", RBACPermissions.CommandGobjectNear)]
static bool HandleGameObjectNearCommand(CommandHandler handler, float? dist)
static bool HandleGameObjectNearCommand(CommandHandler handler, OptionalArg<float> dist)
{
float distance = dist.GetValueOrDefault(10f);
uint count = 0;
@@ -323,23 +323,24 @@ namespace Game.Chat
}
[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();
SQLResult result;
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",
player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), objectId);
else
{
string name = objectId.Value.GetValue();
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 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
@@ -433,7 +434,7 @@ namespace Game.Chat
}
[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);
if (obj == null)
@@ -470,7 +471,7 @@ namespace Game.Chat
class AddCommands
{
[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)
return false;
@@ -518,7 +519,7 @@ namespace Game.Chat
}
[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();
TimeSpan spawntm = TimeSpan.FromSeconds(spawntime.GetValueOrDefault(300));
@@ -540,7 +541,7 @@ namespace Game.Chat
class SetCommands
{
[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)
return false;
@@ -564,7 +565,7 @@ namespace Game.Chat
}
[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)
return false;
@@ -585,16 +586,16 @@ namespace Game.Chat
return true;
}
if (objectState == 0)
if (!objectState.HasValue)
return false;
switch (objectType)
{
case 0:
obj.SetGoState((GameObjectState)objectState);
obj.SetGoState((GameObjectState)objectState.Value);
break;
case 1:
obj.SetGoType((GameObjectTypes)objectState);
obj.SetGoType((GameObjectTypes)objectState.Value);
break;
case 2:
obj.SetGoArtKit(objectState.Value);
@@ -606,10 +607,10 @@ namespace Game.Chat
obj.SendCustomAnim(objectState.Value);
break;
case 5:
if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding)
if (objectState.Value < 0 || objectState.Value > (uint)GameObjectDestructibleState.Rebuilding)
return false;
obj.SetDestructibleState((GameObjectDestructibleState)objectState);
obj.SetDestructibleState((GameObjectDestructibleState)objectState.Value);
break;
default:
break;
+12 -12
View File
@@ -17,7 +17,7 @@ namespace Game.Chat.Commands
class GoCommands
{
[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);
if (at == null)
@@ -168,7 +168,7 @@ namespace Game.Chat.Commands
}
[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();
uint mapId = mapIdArg.GetValueOrDefault(player.GetMapId());
@@ -286,7 +286,7 @@ namespace Game.Chat.Commands
}
[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();
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)]
static bool HandleGoQuestCommand(CommandHandler handler, uint questId)
static bool HandleGoQuestCommand(CommandHandler handler, VariantArg<QuestLinkData, uint> questId)
{
Player player = handler.GetSession().GetPlayer();
@@ -350,7 +350,7 @@ namespace Game.Chat.Commands
}
[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);
if (node == null)
@@ -363,7 +363,7 @@ namespace Game.Chat.Commands
//teleport at coordinates, including Z and orientation
[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();
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));
}
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
[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();
@@ -486,7 +486,7 @@ namespace Game.Chat.Commands
class GoCommandCreature
{
[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);
if (spawnpoint == null)
@@ -499,7 +499,7 @@ namespace Game.Chat.Commands
}
[Command("id", RBACPermissions.CommandGo)]
static bool HandleGoCreatureCIdCommand(CommandHandler handler, uint id)
static bool HandleGoCreatureCIdCommand(CommandHandler handler, VariantArg<CreatureEntryLinkData, uint> id)
{
CreatureData spawnpoint = null;
foreach (var pair in Global.ObjectMgr.GetAllCreatureData())
@@ -530,7 +530,7 @@ namespace Game.Chat.Commands
class GoCommandGameobject
{
[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);
if (spawnpoint == null)
@@ -543,7 +543,7 @@ namespace Game.Chat.Commands
}
[Command("id", RBACPermissions.CommandGo)]
static bool HandleGoGameObjectGOIdCommand(CommandHandler handler, uint goId)
static bool HandleGoGameObjectGOIdCommand(CommandHandler handler, VariantArg<GameobjectEntryLinkData, uint> goId)
{
GameObjectData spawnpoint = null;
foreach (var pair in Global.ObjectMgr.GetAllGameObjectData())
+5 -5
View File
@@ -167,16 +167,16 @@ namespace Game.Chat
}
[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;
if (guildIdentifier != null)
if (guildIdentifier.HasValue)
{
if (guildIdentifier is ulong)
guild = Global.GuildMgr.GetGuildById(guildIdentifier);
if (guildIdentifier.Value.Is<ulong>())
guild = Global.GuildMgr.GetGuildById(guildIdentifier.Value);
else
guild = Global.GuildMgr.GetGuildByName(guildIdentifier);
guild = Global.GuildMgr.GetGuildByName(guildIdentifier.Value);
}
else
{
@@ -141,7 +141,7 @@ namespace Game.Chat
}
[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();
if (player == null)
@@ -150,11 +150,11 @@ namespace Game.Chat
uint? mapId = null;
Difficulty? difficulty = null;
if (mapArg is uint)
mapId = (uint)mapArg;
if (mapArg.Is<uint>())
mapId = mapArg;
if (difficultyArg.HasValue && CliDB.DifficultyStorage.ContainsKey(difficultyArg.Value))
difficulty = (Difficulty)difficultyArg;
difficulty = (Difficulty)difficultyArg.Value;
List<InstanceLock> locksReset = new();
List<InstanceLock> locksNotReset = new();
+1 -1
View File
@@ -74,7 +74,7 @@ namespace Game.Chat
}
[Command("options", RBACPermissions.CommandLfgOptions, true)]
static bool HandleLfgOptionsCommand(CommandHandler handler, uint? optionsArg)
static bool HandleLfgOptionsCommand(CommandHandler handler, OptionalArg<uint> optionsArg)
{
if (optionsArg.HasValue)
{
+4 -4
View File
@@ -15,7 +15,7 @@ namespace Game.Chat.Commands
class LearnCommands
{
[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();
if (targetPlayer == null)
@@ -30,7 +30,7 @@ namespace Game.Chat.Commands
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))
{
@@ -314,7 +314,7 @@ namespace Game.Chat.Commands
}
[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();
if (target == null)
@@ -323,7 +323,7 @@ namespace Game.Chat.Commands
return false;
}
bool allRanks = !allRanksStr.IsEmpty() && allRanksStr.Equals("all", StringComparison.OrdinalIgnoreCase);
bool allRanks = allRanksStr.HasValue && allRanksStr.Value.Equals("all", StringComparison.OrdinalIgnoreCase);
if (allRanks)
spellId = Global.SpellMgr.GetFirstSpellInChain(spellId);
+16 -15
View File
@@ -17,7 +17,7 @@ namespace Game.Chat.Commands
class ListCommands
{
[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);
if (cInfo == null)
@@ -88,8 +88,9 @@ namespace Game.Chat.Commands
}
[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);
if (count == 0)
@@ -258,26 +259,26 @@ namespace Game.Chat.Commands
}
[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);
if (player == null)
if (player.Value == null)
return false;
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);
if (!result.IsEmpty())
{
uint countMail = result.Read<uint>(0);
string nameLink = handler.PlayerLink(player.GetName());
handler.SendSysMessage(CypherStrings.ListMailHeader, countMail, nameLink, player.GetGUID().ToString());
string nameLink = handler.PlayerLink(player.Value.GetName());
handler.SendSysMessage(CypherStrings.ListMailHeader, countMail, nameLink, player.Value.GetGUID().ToString());
handler.SendSysMessage(CypherStrings.AccountListBar);
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);
if (!result1.IsEmpty())
@@ -354,7 +355,7 @@ namespace Game.Chat.Commands
}
[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);
if (gInfo == null)
@@ -426,7 +427,7 @@ namespace Game.Chat.Commands
}
[Command("respawns", RBACPermissions.CommandListRespawns)]
static bool HandleListRespawnsCommand(CommandHandler handler, uint? range)
static bool HandleListRespawnsCommand(CommandHandler handler, OptionalArg<uint> range)
{
Player player = handler.GetSession().GetPlayer();
Map map = player.GetMap();
@@ -552,7 +553,7 @@ namespace Game.Chat.Commands
[Command("", RBACPermissions.CommandListAuras)]
static bool HandleListAllAurasCommand(CommandHandler handler)
{
return ListAurasCommand(handler, null, null);
return ListAurasCommand(handler, default, null);
}
[Command("id", RBACPermissions.CommandListAuras)]
@@ -564,10 +565,10 @@ namespace Game.Chat.Commands
[Command("name", RBACPermissions.CommandListAuras)]
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();
if (unit == null)
@@ -625,7 +626,7 @@ namespace Game.Chat.Commands
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)
return spellInfo.Id == spellId.Value;
+1 -1
View File
@@ -92,7 +92,7 @@ namespace Game.Chat
}
[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)
{
+85 -235
View File
@@ -213,7 +213,7 @@ namespace Game.Chat
}
[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();
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);
// melee damage by specific school
if (spellInfo == null)
if (!spellInfo.HasValue)
{
DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack);
Unit.CalcAbsorbResist(dmgInfo);
@@ -266,7 +266,7 @@ namespace Game.Chat
// 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;
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
target.DealSpellDamage(damageInfo, true);
@@ -275,7 +275,7 @@ namespace Game.Chat
}
[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);
if (go == null)
@@ -296,7 +296,7 @@ namespace Game.Chat
}
[CommandNonGroup("dev", RBACPermissions.CommandDev)]
static bool HandleDevCommand(CommandHandler handler, bool? enableArg)
static bool HandleDevCommand(CommandHandler handler, OptionalArg<bool> enableArg)
{
Player player = handler.GetSession().GetPlayer();
@@ -755,14 +755,14 @@ namespace Game.Chat
}
[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;
if (teamArg.IsEmpty())
if (!teamArg.HasValue)
team = 0;
else if (teamArg.Equals("horde", StringComparison.OrdinalIgnoreCase))
else if (teamArg.Value.Equals("horde", StringComparison.OrdinalIgnoreCase))
team = Team.Horde;
else if (teamArg.Equals("alliance", StringComparison.OrdinalIgnoreCase))
else if (teamArg.Value.Equals("alliance", StringComparison.OrdinalIgnoreCase))
team = Team.Alliance;
else
return false;
@@ -925,22 +925,22 @@ namespace Game.Chat
// mute player for the specified duration
[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;
if (muteReason.IsEmpty())
muteReasonStr = handler.GetCypherString(CypherStrings.NoReason);
if (player == null)
if (!player.HasValue)
player = PlayerIdentifier.FromTarget(handler);
if (player == null)
if (player.Value == null)
{
handler.SendSysMessage(CypherStrings.PlayerNotFound);
return false;
}
Player target = player.GetConnectedPlayer();
uint accountId = target != null ? target.GetSession().GetAccountId() : Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(player.GetGUID());
Player target = player.Value.GetConnectedPlayer();
uint accountId = target != null ? target.GetSession().GetAccountId() : Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(player.Value.GetGUID());
// find only player from same account if any
if (target == null)
@@ -951,7 +951,7 @@ namespace Game.Chat
}
// must have strong lesser security level
if (handler.HasLowerSecurity(target, player.GetGUID(), true))
if (handler.HasLowerSecurity(target, player.Value.GetGUID(), true))
return false;
PreparedStatement stmt = LoginDatabase.GetPreparedStatement(LoginStatements.UPD_MUTE_TIME);
@@ -986,7 +986,7 @@ namespace Game.Chat
stmt.AddValue(3, muteReasonStr);
DB.Login.Execute(stmt);
string nameLink = handler.PlayerLink(player.GetName());
string nameLink = handler.PlayerLink(player.Value.GetName());
if (WorldConfig.GetBoolValue(WorldCfg.ShowMuteInWorld))
Global.WorldMgr.SendWorldText(CypherStrings.CommandMutemessageWorld, muteBy, nameLink, muteTime, muteReasonStr);
@@ -1040,14 +1040,14 @@ namespace Game.Chat
}
[CommandNonGroup("neargrave", RBACPermissions.CommandNeargrave)]
static bool HandleNearGraveCommand(CommandHandler handler, [OptionalArg] string teamArg)
static bool HandleNearGraveCommand(CommandHandler handler, OptionalArg<string> teamArg)
{
Team team;
if (teamArg.IsEmpty())
if (!teamArg.HasValue)
team = 0;
else if (teamArg.Equals("horde", StringComparison.OrdinalIgnoreCase))
else if (teamArg.Value.Equals("horde", StringComparison.OrdinalIgnoreCase))
team = Team.Horde;
else if (teamArg.Equals("alliance", StringComparison.OrdinalIgnoreCase))
else if (teamArg.Value.Equals("alliance", StringComparison.OrdinalIgnoreCase))
team = Team.Alliance;
else
return false;
@@ -1097,18 +1097,17 @@ namespace Game.Chat
}
[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);
if (arg == null)
if (arg.Value == null)
return false;
// Define ALL the player variables!
Player target = arg.GetConnectedPlayer();
ObjectGuid targetGuid = arg.GetGUID();
string targetName = arg.GetName();
Player target = arg.Value.GetConnectedPlayer();
ObjectGuid targetGuid = arg.Value.GetGUID();
string targetName = arg.Value.GetName();
PreparedStatement stmt;
/* The variables we extract for the command. They are
@@ -1450,7 +1449,7 @@ namespace Game.Chat
}
[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))
{
@@ -1801,12 +1800,12 @@ namespace Game.Chat
}
[CommandNonGroup("unfreeze", RBACPermissions.CommandUnfreeze)]
static bool HandleUnFreezeCommand(CommandHandler handler, [OptionalArg] string targetNameArg)
static bool HandleUnFreezeCommand(CommandHandler handler, OptionalArg<string> targetNameArg)
{
string name = "";
Player player;
if (!targetNameArg.IsEmpty())
if (targetNameArg.HasValue)
{
name = targetNameArg;
ObjectManager.NormalizePlayerName(ref name);
@@ -1830,7 +1829,7 @@ namespace Game.Chat
}
else
{
if (!targetNameArg.IsEmpty())
if (!targetNameArg.HasValue)
{
// Check for offline players
ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(name);
@@ -2022,24 +2021,32 @@ namespace Game.Chat
[CommandGroup("additem")]
class MiscAddItemCommands
{
[Command("", RBACPermissions.CommandAdditem)]
static bool HandleAddItemCommand(CommandHandler handler, StringArguments args)
static bool HandleAddItemCommandHelper(CommandHandler handler, Player player, Player playerTarget, VariantArg<ItemLinkData, uint, string> itemArg, OptionalArg<int> countArg, OptionalArg<string> bonusListIdString, OptionalArg<byte> itemContextArg)
{
if (args.Empty())
return false;
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);
if (!string.IsNullOrEmpty(itemName))
{
var record = CliDB.ItemSparseStorage.Values.FirstOrDefault(itemSparse =>
{
for (Locale i = 0; i < Locale.Total; ++i)
if (itemName == itemSparse.Display[i])
for (Locale i = Locale.enUS; i < Locale.Total; i += 1)
if (itemName == sparse.Display[i])
return true;
return false;
});
@@ -2049,56 +2056,36 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.CommandCouldnotfind, itemName);
return false;
}
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))
return false;
}
int count = args.NextInt32();
int count = countArg.GetValueOrDefault(1);
if (count == 0)
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!)
if (!bonuses.IsEmpty())
if (bonusListIdString.HasValue)
{
var tokens = new StringArray(bonuses, ';');
for (var i = 0; i < tokens.Length; ++i)
var tokens = new StringArray(bonusListIdString.Value, ';');
foreach (string token in tokens)
{
if (uint.TryParse(tokens[i], out uint id))
bonusListIDs.Add(id);
if (uint.TryParse(token, out uint bonusListId))
bonusListIDs.Add(bonusListId);
}
}
ItemContext itemContext = ItemContext.None;
if (!context.IsEmpty())
if (itemContextArg.HasValue)
{
itemContext = context.ToEnum<ItemContext>();
itemContext = (ItemContext)itemContextArg.Value;
if (itemContext < ItemContext.Max)
{
var contextBonuses = ItemBonusMgr.GetBonusListsForItem(itemId, new(itemContext));
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);
if (itemTemplate == null)
{
@@ -2129,15 +2116,14 @@ namespace Game.Chat
// 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);
InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, (uint)count, out uint noSpaceForCount);
if (msg != InventoryResult.Ok) // convert to possible store amount
count -= (int)noSpaceForCount;
@@ -2147,14 +2133,15 @@ namespace Game.Chat
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)
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)
item1.SetBinding(false);
}
@@ -2172,10 +2159,21 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.ItemCannotCreate, itemId, noSpaceForCount);
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)]
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'
if (itemSetId == 0)
@@ -2187,7 +2185,7 @@ namespace Game.Chat
List<uint> bonusListIDs = new();
// semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!)
if (!bonuses.IsEmpty())
if (bonuses.HasValue)
{
var tokens = new StringArray(bonuses, ';');
for (var i = 0; i < tokens.Length; ++i)
@@ -2255,164 +2253,16 @@ namespace Game.Chat
}
[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 playerTarget = null;
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
if (!target.IsConnected())
{
string itemNameStr = tailArgs.NextString("]");
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);
handler.SendSysMessage(CypherStrings.PlayerNotFound);
return false;
}
itemId = itr.Id;
}
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;
return HandleAddItemCommandHelper(handler, player, target.GetConnectedPlayer(), item, countArg, bonusListIdString, itemContextArg);
}
}
}
+6 -6
View File
@@ -94,7 +94,7 @@ namespace Game.Chat
}
[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();
if (target == null)
@@ -104,13 +104,13 @@ namespace Game.Chat
}
if (!flag.HasValue)
flag = target.m_unitData.Flags;
flag = (uint)target.m_unitData.Flags;
if (!npcflag.HasValue)
npcflag = (ulong)target.m_unitData.NpcFlags2 << 32 | target.m_unitData.NpcFlags;
if (!dyflag.HasValue)
dyflag = target.m_objectData.DynamicFlags;
dyflag = (uint)target.m_objectData.DynamicFlags;
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);
target.SetFaction(factionid.Value);
target.ReplaceAllUnitFlags((UnitFlags)flag);
target.ReplaceAllUnitFlags((UnitFlags)flag.Value);
target.ReplaceAllNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF));
target.ReplaceAllNpcFlags2((NPCFlags2)(npcflag >> 32));
target.ReplaceAllDynamicFlags((UnitDynFlags)dyflag);
target.ReplaceAllDynamicFlags((UnitDynFlags)dyflag.Value);
return true;
}
@@ -427,7 +427,7 @@ namespace Game.Chat
}
[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))
{
+12 -12
View File
@@ -47,7 +47,7 @@ namespace Game.Chat
}
[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();
if (creatureTarget == null || creatureTarget.IsPet())
@@ -165,7 +165,7 @@ namespace Game.Chat
}
[Command("move", RBACPermissions.CommandNpcMove)]
static bool HandleNpcMoveCommand(CommandHandler handler, ulong? spawnId)
static bool HandleNpcMoveCommand(CommandHandler handler, OptionalArg<ulong> spawnId)
{
Creature creature = handler.GetSelectedCreature();
Player player = handler.GetSession().GetPlayer();
@@ -214,7 +214,7 @@ namespace Game.Chat
}
[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);
uint count = 0;
@@ -699,7 +699,7 @@ namespace Game.Chat
}
[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)
{
@@ -726,7 +726,7 @@ namespace Game.Chat
vItem.ExtendedCost = extendedcost;
vItem.Type = ItemVendorType.Item;
if (!bonusListIds.IsEmpty())
if (bonusListIds.HasValue)
{
var bonusListIDsTok = new StringArray(bonusListIds, ';');
if (!bonusListIDsTok.IsEmpty())
@@ -773,7 +773,7 @@ namespace Game.Chat
}
[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();
if (creature == null || creature.GetSpawnId() == 0)
@@ -819,14 +819,14 @@ namespace Game.Chat
}
[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;
if (!lootStr.IsEmpty())
if (lootStr.HasValue)
{
if (lootStr.Equals("loot", StringComparison.OrdinalIgnoreCase))
if (lootStr.Value.Equals("loot", StringComparison.OrdinalIgnoreCase))
loot = true;
else if (lootStr.Equals("noloot", StringComparison.OrdinalIgnoreCase))
else if (lootStr.Value.Equals("noloot", StringComparison.OrdinalIgnoreCase))
loot = false;
else
return false;
@@ -846,7 +846,7 @@ namespace Game.Chat
class DeleteCommands
{
[Command("", RBACPermissions.CommandNpcDelete)]
static bool HandleNpcDeleteCommand(CommandHandler handler, ulong? spawnIdArg)
static bool HandleNpcDeleteCommand(CommandHandler handler, OptionalArg<ulong> spawnIdArg)
{
ulong spawnId;
if (spawnIdArg.HasValue)
@@ -1151,7 +1151,7 @@ namespace Game.Chat
}
[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:
// GUID (optional - you can also select the creature)
+1 -1
View File
@@ -119,7 +119,7 @@ namespace Game.Chat
}
[Command("level", RBACPermissions.CommandPetLevel)]
static bool HandlePetLevelCommand(CommandHandler handler, int? level)
static bool HandlePetLevelCommand(CommandHandler handler, OptionalArg<int> level)
{
Pet pet = GetSelectedPlayerPetOrOwn(handler);
Player owner = pet != null ? pet.GetOwner() : null;
+4 -4
View File
@@ -13,7 +13,7 @@ namespace Game.Chat.Commands
class RbacComands
{
[Command("list", RBACPermissions.CommandRbacList, true)]
static bool HandleRBACListPermissionsCommand(CommandHandler handler, uint? permId)
static bool HandleRBACListPermissionsCommand(CommandHandler handler, OptionalArg<uint> permId)
{
if (!permId.HasValue)
{
@@ -49,7 +49,7 @@ namespace Game.Chat.Commands
class RbacAccountCommands
{
[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)
account = AccountIdentifier.FromTarget(handler);
@@ -92,7 +92,7 @@ namespace Game.Chat.Commands
}
[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)
account = AccountIdentifier.FromTarget(handler);
@@ -186,7 +186,7 @@ namespace Game.Chat.Commands
}
[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)
account = AccountIdentifier.FromTarget(handler);
+1 -1
View File
@@ -59,7 +59,7 @@ namespace Game.Chat
}
[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();
if (target == null)
+9 -10
View File
@@ -13,7 +13,7 @@ namespace Game.Chat
class SpellCommands
{
[CommandNonGroup("cooldown", RBACPermissions.CommandCooldown)]
static bool HandleCooldownCommand(CommandHandler handler, uint? spellIdArg)
static bool HandleCooldownCommand(CommandHandler handler, OptionalArg<SpellInfo> spellIdArg)
{
Unit target = handler.GetSelectedUnit();
if (target == null)
@@ -38,16 +38,15 @@ namespace Game.Chat
}
else
{
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellIdArg.Value, target.GetMap().GetDifficultyID());
if (spellInfo == null)
if (spellIdArg.Value == null)
{
handler.SendSysMessage(CypherStrings.UnknownSpell, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink);
return false;
}
target.GetSpellHistory().ResetCooldown(spellInfo.Id, true);
target.GetSpellHistory().ResetCharges(spellInfo.ChargeCategoryId);
handler.SendSysMessage(CypherStrings.RemoveallCooldown, spellInfo.Id, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink);
target.GetSpellHistory().ResetCooldown(spellIdArg.Value.Id, true);
target.GetSpellHistory().ResetCharges(spellIdArg.Value.ChargeCategoryId);
handler.SendSysMessage(CypherStrings.RemoveallCooldown, spellIdArg.Value.Id, owner == handler.GetSession().GetPlayer() ? handler.GetCypherString(CypherStrings.You) : nameLink);
}
return true;
}
@@ -104,7 +103,7 @@ namespace Game.Chat
}
[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();
if (target == null)
@@ -120,11 +119,11 @@ namespace Game.Chat
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
// 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)
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
// add the skill to the player's book with step 1 (which is the first rank, in most cases something
// 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);
return true;
}
+8 -8
View File
@@ -223,23 +223,23 @@ namespace Game.Chat
class TeleNameCommands
{
[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);
if (player == null)
if (player.Value == null)
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)
target.TeleportTo(target.GetHomebind());
else
{
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);
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);
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
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);
}
+3 -3
View File
@@ -16,7 +16,7 @@ namespace Game.Chat.Commands
class WPCommands
{
[Command("add", RBACPermissions.CommandWpAdd)]
static bool HandleWpAddCommand(CommandHandler handler, uint? pathId)
static bool HandleWpAddCommand(CommandHandler handler, OptionalArg<uint> pathId)
{
Creature target = handler.GetSelectedCreature();
@@ -91,7 +91,7 @@ namespace Game.Chat.Commands
}
[Command("load", RBACPermissions.CommandWpLoad)]
static bool HandleWpLoadCommand(CommandHandler handler, uint? pathId)
static bool HandleWpLoadCommand(CommandHandler handler, OptionalArg<uint> pathId)
{
Creature target = handler.GetSelectedCreature();
if (target == null)
@@ -224,7 +224,7 @@ namespace Game.Chat.Commands
}
[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
if (subCommand.IsEmpty())
+104 -75
View File
@@ -12,16 +12,26 @@ namespace Game.Chat
{
value = default;
HyperlinkInfo info = ParseHyperlink(arg);
HyperlinkInfo info = ParseSingleHyperlink(arg);
// invalid hyperlinks cannot be consumed
if (info == null)
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
HyperlinkDataTokenizer t = new(info.Data, true);
if (!t.TryConsumeTo(out value, type))
if (!hyperLinkValue.Parse(info.Data))
return new ChatCommandResult(handler.GetCypherString(CypherStrings.CmdparserLinkdataInvalid));
value = hyperLinkValue;
// finally, skip any potential delimiters
var (token, next) = info.Tail.Tokenize();
if (token.IsEmpty()) /* empty token = first character is delimiter, skip past it */
@@ -61,7 +71,7 @@ namespace Game.Chat
continue;
}
HyperlinkInfo info = ParseHyperlink(str.Substring(pos));
HyperlinkInfo info = ParseSingleHyperlink(str.Substring(pos));
if (info == null)// todo fix me || !ValidateLinkInfo(info))
return false;
@@ -74,107 +84,126 @@ namespace Game.Chat
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 ParseHyperlink(string currentString)
public static HyperlinkInfo ParseSingleHyperlink(string str)
{
if (currentString.IsEmpty())
if (str.IsEmpty())
return null;
string color = "";
string tag = "";
string data = "";
string text = "";
int pos = 0;
//color tag
if (currentString[pos++] != '|' || currentString[pos++] != 'c')
if (str[pos++] != '|' || str[pos++] != 'c')
return null;
uint color = 0;
for (byte i = 0; i < 8; ++i)
if (str.Length < 8)
return null;
if (str[pos] == 'n')
{
byte hex = toHex(currentString[pos++]);
if (hex != 0)
color = (uint)((int)(color << 4) | (hex & 0xf));
// numeric color id
pos++;
int endOfColor = str.IndexOf(":", pos);
if (endOfColor != -1)
{
color = str.Substring(pos, endOfColor - pos);
pos = endOfColor + 1;
}
else
return null;
}
// 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)
else
{
if (currentString[pos] == '|')
return null;
if (currentString[pos++] == ']')
break;
++textLength;
// hex color
color = str.Substring(pos, 8);
pos += 8;
}
// link end tag
if (currentString[pos++] != '|' || currentString[pos++] != 'h' || currentString[pos++] != '|' || currentString[pos++] != 'r')
if (str[pos++] != '|' || str[pos++] != 'H')
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;
// 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
{
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 HyperlinkColor color;
public string Tag;
public string Data;
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 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);
}
public string data = c;
}
}
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);
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);
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);
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);
@@ -261,6 +262,7 @@ namespace Game.DataStorage
PathStorage = ReadDB2<PathRecord>("Path.db2", HotfixStatements.SEL_PATH);
PathNodeStorage = ReadDB2<PathNodeRecord>("PathNode.db2", HotfixStatements.SEL_PATH_NODE);
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);
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);
@@ -492,6 +494,7 @@ namespace Game.DataStorage
public static DB6Storage<BankTabRecord> BankTabStorage;
public static DB6Storage<BannedAddonsRecord> BannedAddOnsStorage;
public static DB6Storage<BarberShopStyleRecord> BarberShopStyleStorage;
public static DB6Storage<BattlePetAbilityRecord> BattlePetAbilityStorage;
public static DB6Storage<BattlePetBreedQualityRecord> BattlePetBreedQualityStorage;
public static DB6Storage<BattlePetBreedStateRecord> BattlePetBreedStateStorage;
public static DB6Storage<BattlePetSpeciesRecord> BattlePetSpeciesStorage;
@@ -664,6 +667,7 @@ namespace Game.DataStorage
public static DB6Storage<NumTalentsAtLevelRecord> NumTalentsAtLevelStorage;
public static DB6Storage<OverrideSpellDataRecord> OverrideSpellDataStorage;
public static DB6Storage<ParagonReputationRecord> ParagonReputationStorage;
public static DB6Storage<PerksActivityRecord> PerksActivityStorage;
public static DB6Storage<PathRecord> PathStorage;
public static DB6Storage<PathNodeRecord> PathNodeStorage;
public static DB6Storage<PathPropertyRecord> PathPropertyStorage;
@@ -39,6 +39,18 @@ namespace Game.DataStorage
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 uint Id;
@@ -43,6 +43,17 @@ namespace Game.DataStorage
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 uint Id;
+1 -1
View File
@@ -2481,7 +2481,7 @@ namespace Game.Entities
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);
if (spellInfo == null)