Core/DataStores: Implemented WorldStateExpression
Port From (https://github.com/TrinityCore/TrinityCore/commit/548d79bb06cfba3517347070dfe606748dda55ab)
This commit is contained in:
@@ -1421,7 +1421,7 @@ namespace Framework.Constants
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PhaseUseFlags fields in different db2s
|
// PhaseUseFlags fields in different db2s
|
||||||
public enum PhaseUseFlagsValues : byte
|
public enum PhaseUseFlagsValues : byte
|
||||||
{
|
{
|
||||||
None = 0x0,
|
None = 0x0,
|
||||||
AlwaysVisible = 0x1,
|
AlwaysVisible = 0x1,
|
||||||
@@ -1819,4 +1819,84 @@ namespace Framework.Constants
|
|||||||
Micro = 5,
|
Micro = 5,
|
||||||
Orphan = 6
|
Orphan = 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum WorldStateExpressionValueType
|
||||||
|
{
|
||||||
|
Constant = 1,
|
||||||
|
WorldState = 2,
|
||||||
|
Function = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WorldStateExpressionLogic
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
And = 1,
|
||||||
|
Or = 2,
|
||||||
|
Xor = 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WorldStateExpressionComparisonType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Equal = 1,
|
||||||
|
NotEqual = 2,
|
||||||
|
Less = 3,
|
||||||
|
LessOrEqual = 4,
|
||||||
|
Greater = 5,
|
||||||
|
GreaterOrEqual = 6,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WorldStateExpressionOperatorType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Sum = 1,
|
||||||
|
Substraction = 2,
|
||||||
|
Multiplication = 3,
|
||||||
|
Division = 4,
|
||||||
|
Remainder = 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WorldStateExpressionFunctions
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Random,
|
||||||
|
Month,
|
||||||
|
Day,
|
||||||
|
TimeOfDay,
|
||||||
|
Region,
|
||||||
|
ClockHour,
|
||||||
|
OldDifficultyId,
|
||||||
|
HolidayStart,
|
||||||
|
HolidayLeft,
|
||||||
|
HolidayActive,
|
||||||
|
TimerCurrentTime,
|
||||||
|
WeekNumber,
|
||||||
|
Unk13,
|
||||||
|
Unk14,
|
||||||
|
DifficultyId,
|
||||||
|
WarModeActive,
|
||||||
|
Unk17,
|
||||||
|
Unk18,
|
||||||
|
Unk19,
|
||||||
|
Unk20,
|
||||||
|
Unk21,
|
||||||
|
WorldStateExpression,
|
||||||
|
KeystoneAffix,
|
||||||
|
Unk24,
|
||||||
|
Unk25,
|
||||||
|
Unk26,
|
||||||
|
Unk27,
|
||||||
|
KeystoneLevel,
|
||||||
|
Unk29,
|
||||||
|
Unk30,
|
||||||
|
Unk31,
|
||||||
|
Unk32,
|
||||||
|
MersenneRandom,
|
||||||
|
Unk34,
|
||||||
|
Unk35,
|
||||||
|
Unk36,
|
||||||
|
UiWidgetData,
|
||||||
|
|
||||||
|
Max,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -375,8 +375,8 @@ namespace Framework.Constants
|
|||||||
Unk7 = 0x80,
|
Unk7 = 0x80,
|
||||||
ContestedPVP = 0x100,
|
ContestedPVP = 0x100,
|
||||||
InPVP = 0x200,
|
InPVP = 0x200,
|
||||||
HideHelm = 0x400,
|
WarModeActive = 0x400,
|
||||||
HideCloak = 0x800,
|
WarModeDesired = 0x800,
|
||||||
PlayedLongTime = 0x1000,
|
PlayedLongTime = 0x1000,
|
||||||
PlayedTooLong = 0x2000,
|
PlayedTooLong = 0x2000,
|
||||||
IsOutOfBounds = 0x4000,
|
IsOutOfBounds = 0x4000,
|
||||||
|
|||||||
@@ -1080,6 +1080,9 @@ namespace Framework.Database
|
|||||||
// WorldSafeLocs.db2
|
// WorldSafeLocs.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, MapID, Facing FROM world_safe_locs ORDER BY ID DESC");
|
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, MapID, Facing FROM world_safe_locs ORDER BY ID DESC");
|
||||||
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?");
|
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?");
|
||||||
|
|
||||||
|
// WorldStateExpression.db2
|
||||||
|
PrepareStatement(HotfixStatements.SEL_WORLD_STATE_EXPRESSION, "SELECT ID, Expression FROM world_state_expression ORDER BY ID DESC");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1628,6 +1631,8 @@ namespace Framework.Database
|
|||||||
SEL_WORLD_SAFE_LOCS,
|
SEL_WORLD_SAFE_LOCS,
|
||||||
SEL_WORLD_SAFE_LOCS_LOCALE,
|
SEL_WORLD_SAFE_LOCS_LOCALE,
|
||||||
|
|
||||||
|
SEL_WORLD_STATE_EXPRESSION,
|
||||||
|
|
||||||
MAX_HOTFIXDATABASE_STATEMENTS
|
MAX_HOTFIXDATABASE_STATEMENTS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -640,7 +640,7 @@ namespace Game.Chat
|
|||||||
[Command("raidreset", RBACPermissions.CommandInstanceUnbind)]
|
[Command("raidreset", RBACPermissions.CommandInstanceUnbind)]
|
||||||
static bool HandleDebugRaidResetCommand(StringArguments args, CommandHandler handler)
|
static bool HandleDebugRaidResetCommand(StringArguments args, CommandHandler handler)
|
||||||
{
|
{
|
||||||
string map_str = args.NextString();
|
string map_str = args.NextString();
|
||||||
string difficulty_str = args.NextString();
|
string difficulty_str = args.NextString();
|
||||||
|
|
||||||
if (!int.TryParse(map_str, out int map) || map <= 0)
|
if (!int.TryParse(map_str, out int map) || map <= 0)
|
||||||
@@ -809,6 +809,82 @@ namespace Game.Chat
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandNonGroup("wpgps", RBACPermissions.CommandWpgps)]
|
||||||
|
static bool HandleWPGPSCommand(StringArguments args, CommandHandler handler)
|
||||||
|
{
|
||||||
|
Player player = handler.GetSession().GetPlayer();
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.SqlDev, "(@PATH, XX, {0}, {1}, {2}, 0, 0, 0, 100, 0),", player.GetPositionX(), player.GetPositionY(), player.GetPositionZ());
|
||||||
|
|
||||||
|
handler.SendSysMessage("Waypoint SQL written to SQL Developer log");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Command("worldstate", RBACPermissions.CommandDebug)]
|
||||||
|
static bool HandleDebugWorldStateCommand(StringArguments args, CommandHandler handler)
|
||||||
|
{
|
||||||
|
if (args.Empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
string worldStateIdStr = args.NextString();
|
||||||
|
string valueStr = args.NextString();
|
||||||
|
|
||||||
|
if (worldStateIdStr.IsEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Player target = handler.getSelectedPlayerOrSelf();
|
||||||
|
if (target == null)
|
||||||
|
{
|
||||||
|
handler.SendSysMessage(CypherStrings.PlayerNotFound);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint worldStateId = uint.Parse(worldStateIdStr);
|
||||||
|
uint value = valueStr.IsEmpty() ? 0 : uint.Parse(valueStr);
|
||||||
|
|
||||||
|
if (value != 0)
|
||||||
|
{
|
||||||
|
Global.WorldMgr.setWorldState(worldStateId, value);
|
||||||
|
target.SendUpdateWorldState(worldStateId, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
handler.SendSysMessage($"Worldstate {worldStateId} actual value : {Global.WorldMgr.getWorldState(worldStateId)}");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Command("wsexpression", RBACPermissions.CommandDebug)]
|
||||||
|
static bool HandleDebugWSExpressionCommand(StringArguments args, CommandHandler handler)
|
||||||
|
{
|
||||||
|
if (args.Empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
string expressionIdStr = args.NextString();
|
||||||
|
|
||||||
|
if (expressionIdStr.IsEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint expressionId = uint.Parse(expressionIdStr);
|
||||||
|
|
||||||
|
Player target = handler.getSelectedPlayerOrSelf();
|
||||||
|
if (target == null)
|
||||||
|
{
|
||||||
|
handler.SendSysMessage(CypherStrings.PlayerNotFound);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldStateExpressionRecord wsExpressionEntry = CliDB.WorldStateExpressionStorage.LookupByKey(expressionId);
|
||||||
|
if (wsExpressionEntry == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ConditionManager.IsPlayerMeetingExpression(target, wsExpressionEntry))
|
||||||
|
handler.SendSysMessage($"Expression {expressionId} meet");
|
||||||
|
else
|
||||||
|
handler.SendSysMessage($"Expression {expressionId} not meet");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
[CommandGroup("send", RBACPermissions.CommandDebugSend)]
|
[CommandGroup("send", RBACPermissions.CommandDebugSend)]
|
||||||
class SendCommands
|
class SendCommands
|
||||||
{
|
{
|
||||||
@@ -948,7 +1024,7 @@ namespace Game.Chat
|
|||||||
if (args.Empty())
|
if (args.Empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!byte.TryParse(args.NextString(), out byte failNum) ||failNum == 0)
|
if (!byte.TryParse(args.NextString(), out byte failNum) || failNum == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int failArg1 = args.NextInt32();
|
int failArg1 = args.NextInt32();
|
||||||
@@ -1066,16 +1142,5 @@ namespace Game.Chat
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandNonGroup("wpgps", RBACPermissions.CommandWpgps)]
|
|
||||||
static bool HandleWPGPSCommand(StringArguments args, CommandHandler handler)
|
|
||||||
{
|
|
||||||
Player player = handler.GetSession().GetPlayer();
|
|
||||||
|
|
||||||
Log.outInfo(LogFilter.SqlDev, "(@PATH, XX, {0}, {1}, {2}, 0, 0, 0, 100, 0),", player.GetPositionX(), player.GetPositionY(), player.GetPositionZ());
|
|
||||||
|
|
||||||
handler.SendSysMessage("Waypoint SQL written to SQL Developer log");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ using Game.Spells;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Framework.IO;
|
||||||
|
|
||||||
namespace Game
|
namespace Game
|
||||||
{
|
{
|
||||||
@@ -1946,7 +1947,17 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: time condition
|
// TODO: time condition
|
||||||
// TODO (or not): world state expression condition
|
|
||||||
|
if (condition.WorldStateExpressionID != 0)
|
||||||
|
{
|
||||||
|
var worldStateExpression = CliDB.WorldStateExpressionStorage.LookupByKey(condition.WorldStateExpressionID);
|
||||||
|
if (worldStateExpression == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!IsPlayerMeetingExpression(player, worldStateExpression))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: weather condition
|
// TODO: weather condition
|
||||||
|
|
||||||
if (condition.Achievement[0] != 0)
|
if (condition.Achievement[0] != 0)
|
||||||
@@ -2034,6 +2045,228 @@ namespace Game
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsPlayerMeetingExpression(Player player, WorldStateExpressionRecord expression)
|
||||||
|
{
|
||||||
|
ByteBuffer buffer = new ByteBuffer(expression.Expression.ToByteArray());
|
||||||
|
if (buffer.GetSize() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool enabled = buffer.ReadBool();
|
||||||
|
if (!enabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool finalResult = EvalRelOp(buffer, player);
|
||||||
|
WorldStateExpressionLogic resultLogic = (WorldStateExpressionLogic)buffer.ReadUInt8();
|
||||||
|
|
||||||
|
while (resultLogic != WorldStateExpressionLogic.None)
|
||||||
|
{
|
||||||
|
bool secondResult = EvalRelOp(buffer, player);
|
||||||
|
|
||||||
|
switch (resultLogic)
|
||||||
|
{
|
||||||
|
case WorldStateExpressionLogic.And:
|
||||||
|
finalResult = finalResult && secondResult;
|
||||||
|
break;
|
||||||
|
case WorldStateExpressionLogic.Or:
|
||||||
|
finalResult = finalResult || secondResult;
|
||||||
|
break;
|
||||||
|
case WorldStateExpressionLogic.Xor:
|
||||||
|
finalResult = finalResult != secondResult;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer.GetCurrentStream().Position < buffer.GetSize())
|
||||||
|
break;
|
||||||
|
|
||||||
|
resultLogic = (WorldStateExpressionLogic)buffer.ReadUInt8();
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int EvalSingleValue(ByteBuffer buffer, Player player)
|
||||||
|
{
|
||||||
|
WorldStateExpressionValueType valueType = (WorldStateExpressionValueType)buffer.ReadUInt8();
|
||||||
|
int value = 0;
|
||||||
|
|
||||||
|
switch (valueType)
|
||||||
|
{
|
||||||
|
case WorldStateExpressionValueType.Constant:
|
||||||
|
{
|
||||||
|
value = buffer.ReadInt32();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WorldStateExpressionValueType.WorldState:
|
||||||
|
{
|
||||||
|
uint worldStateId = buffer.ReadUInt32();
|
||||||
|
value = (int)Global.WorldMgr.getWorldState(worldStateId);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WorldStateExpressionValueType.Function:
|
||||||
|
{
|
||||||
|
var functionType = (WorldStateExpressionFunctions)buffer.ReadUInt32();
|
||||||
|
int arg1 = EvalSingleValue(buffer, player);
|
||||||
|
int arg2 = EvalSingleValue(buffer, player);
|
||||||
|
|
||||||
|
if (functionType >= WorldStateExpressionFunctions.Max)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
value = WorldStateExpressionFunction(functionType, player, arg1, arg2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int WorldStateExpressionFunction(WorldStateExpressionFunctions functionType, Player player, int arg1, int arg2)
|
||||||
|
{
|
||||||
|
switch (functionType)
|
||||||
|
{
|
||||||
|
case WorldStateExpressionFunctions.Random:
|
||||||
|
return (int)RandomHelper.URand(Math.Min(arg1, arg2), Math.Max(arg1, arg2));
|
||||||
|
case WorldStateExpressionFunctions.Month:
|
||||||
|
return GameTime.GetDateAndTime().Month + 1;
|
||||||
|
case WorldStateExpressionFunctions.Day:
|
||||||
|
return GameTime.GetDateAndTime().Day + 1;
|
||||||
|
case WorldStateExpressionFunctions.TimeOfDay:
|
||||||
|
DateTime localTime = GameTime.GetDateAndTime();
|
||||||
|
return localTime.Hour * Time.Minute + localTime.Minute;
|
||||||
|
case WorldStateExpressionFunctions.Region:
|
||||||
|
return Global.WorldMgr.GetRealmId().Region;
|
||||||
|
case WorldStateExpressionFunctions.ClockHour:
|
||||||
|
int currentHour = GameTime.GetDateAndTime().Hour + 1;
|
||||||
|
return currentHour <= 12 ? (currentHour != 0 ? currentHour : 12) : currentHour - 12;
|
||||||
|
case WorldStateExpressionFunctions.OldDifficultyId:
|
||||||
|
var difficulty = CliDB.DifficultyStorage.LookupByKey(player.GetMap().GetDifficultyID());
|
||||||
|
if (difficulty != null)
|
||||||
|
return difficulty.OldEnumValue;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
case WorldStateExpressionFunctions.HolidayActive:
|
||||||
|
return Global.GameEventMgr.IsHolidayActive((HolidayIds)arg1) ? 1 : 0;
|
||||||
|
case WorldStateExpressionFunctions.TimerCurrentTime:
|
||||||
|
return (int)GameTime.GetGameTime();
|
||||||
|
case WorldStateExpressionFunctions.WeekNumber:
|
||||||
|
long now = GameTime.GetGameTime();
|
||||||
|
uint raidOrigin = 1135695600;
|
||||||
|
Cfg_RegionsRecord region = CliDB.CfgRegionsStorage.LookupByKey(Global.WorldMgr.GetRealmId().Region);
|
||||||
|
if (region != null)
|
||||||
|
raidOrigin = region.Raidorigin;
|
||||||
|
|
||||||
|
return (int)(now - raidOrigin) / Time.Week;
|
||||||
|
case WorldStateExpressionFunctions.DifficultyId:
|
||||||
|
return (int)player.GetMap().GetDifficultyID();
|
||||||
|
case WorldStateExpressionFunctions.WarModeActive:
|
||||||
|
return player.HasPlayerFlag(PlayerFlags.WarModeActive) ? 1 : 0;
|
||||||
|
case WorldStateExpressionFunctions.WorldStateExpression:
|
||||||
|
var worldStateExpression = CliDB.WorldStateExpressionStorage.LookupByKey(arg1);
|
||||||
|
if (worldStateExpression != null)
|
||||||
|
return IsPlayerMeetingExpression(player, worldStateExpression) ? 1 : 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
case WorldStateExpressionFunctions.MersenneRandom:
|
||||||
|
if (arg1 == 1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
//todo fix me
|
||||||
|
// init with predetermined seed
|
||||||
|
//std::mt19937 mt(arg2? arg2 : 1);
|
||||||
|
//value = mt() % arg1 + 1;
|
||||||
|
return 0;
|
||||||
|
case WorldStateExpressionFunctions.None:
|
||||||
|
case WorldStateExpressionFunctions.HolidayStart:
|
||||||
|
case WorldStateExpressionFunctions.HolidayLeft:
|
||||||
|
case WorldStateExpressionFunctions.Unk13:
|
||||||
|
case WorldStateExpressionFunctions.Unk14:
|
||||||
|
case WorldStateExpressionFunctions.Unk17:
|
||||||
|
case WorldStateExpressionFunctions.Unk18:
|
||||||
|
case WorldStateExpressionFunctions.Unk19:
|
||||||
|
case WorldStateExpressionFunctions.Unk20:
|
||||||
|
case WorldStateExpressionFunctions.Unk21:
|
||||||
|
case WorldStateExpressionFunctions.KeystoneAffix:
|
||||||
|
case WorldStateExpressionFunctions.Unk24:
|
||||||
|
case WorldStateExpressionFunctions.Unk25:
|
||||||
|
case WorldStateExpressionFunctions.Unk26:
|
||||||
|
case WorldStateExpressionFunctions.Unk27:
|
||||||
|
case WorldStateExpressionFunctions.KeystoneLevel:
|
||||||
|
case WorldStateExpressionFunctions.Unk29:
|
||||||
|
case WorldStateExpressionFunctions.Unk30:
|
||||||
|
case WorldStateExpressionFunctions.Unk31:
|
||||||
|
case WorldStateExpressionFunctions.Unk32:
|
||||||
|
case WorldStateExpressionFunctions.Unk34:
|
||||||
|
case WorldStateExpressionFunctions.Unk35:
|
||||||
|
case WorldStateExpressionFunctions.Unk36:
|
||||||
|
case WorldStateExpressionFunctions.UiWidgetData:
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int EvalValue(ByteBuffer buffer, Player player)
|
||||||
|
{
|
||||||
|
int leftValue = EvalSingleValue(buffer, player);
|
||||||
|
|
||||||
|
WorldStateExpressionOperatorType operatorType = (WorldStateExpressionOperatorType)buffer.ReadUInt8();
|
||||||
|
if (operatorType == WorldStateExpressionOperatorType.None)
|
||||||
|
return leftValue;
|
||||||
|
|
||||||
|
int rightValue = EvalSingleValue(buffer, player);
|
||||||
|
|
||||||
|
switch (operatorType)
|
||||||
|
{
|
||||||
|
case WorldStateExpressionOperatorType.Sum:
|
||||||
|
return leftValue + rightValue;
|
||||||
|
case WorldStateExpressionOperatorType.Substraction:
|
||||||
|
return leftValue - rightValue;
|
||||||
|
case WorldStateExpressionOperatorType.Multiplication:
|
||||||
|
return leftValue * rightValue;
|
||||||
|
case WorldStateExpressionOperatorType.Division:
|
||||||
|
return rightValue == 0 ? 0 : leftValue / rightValue;
|
||||||
|
case WorldStateExpressionOperatorType.Remainder:
|
||||||
|
return rightValue == 0 ? 0 : leftValue % rightValue;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return leftValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool EvalRelOp(ByteBuffer buffer, Player player)
|
||||||
|
{
|
||||||
|
int leftValue = EvalValue(buffer, player);
|
||||||
|
|
||||||
|
WorldStateExpressionComparisonType compareLogic = (WorldStateExpressionComparisonType)buffer.ReadUInt8();
|
||||||
|
if (compareLogic == WorldStateExpressionComparisonType.None)
|
||||||
|
return leftValue != 0;
|
||||||
|
|
||||||
|
int rightValue = EvalValue(buffer, player);
|
||||||
|
|
||||||
|
switch (compareLogic)
|
||||||
|
{
|
||||||
|
case WorldStateExpressionComparisonType.Equal:
|
||||||
|
return leftValue == rightValue;
|
||||||
|
case WorldStateExpressionComparisonType.NotEqual:
|
||||||
|
return leftValue != rightValue;
|
||||||
|
case WorldStateExpressionComparisonType.Less:
|
||||||
|
return leftValue < rightValue;
|
||||||
|
case WorldStateExpressionComparisonType.LessOrEqual:
|
||||||
|
return leftValue <= rightValue;
|
||||||
|
case WorldStateExpressionComparisonType.Greater:
|
||||||
|
return leftValue > rightValue;
|
||||||
|
case WorldStateExpressionComparisonType.GreaterOrEqual:
|
||||||
|
return leftValue >= rightValue;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Dictionary<ConditionSourceType, MultiMap<uint, Condition>> ConditionStore = new Dictionary<ConditionSourceType, MultiMap<uint, Condition>>();
|
Dictionary<ConditionSourceType, MultiMap<uint, Condition>> ConditionStore = new Dictionary<ConditionSourceType, MultiMap<uint, Condition>>();
|
||||||
MultiMap<uint, Condition> ConditionReferenceStore = new MultiMap<uint, Condition>();
|
MultiMap<uint, Condition> ConditionReferenceStore = new MultiMap<uint, Condition>();
|
||||||
Dictionary<uint, MultiMap<uint, Condition>> VehicleSpellConditionStore = new Dictionary<uint, MultiMap<uint, Condition>>();
|
Dictionary<uint, MultiMap<uint, Condition>> VehicleSpellConditionStore = new Dictionary<uint, MultiMap<uint, Condition>>();
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ namespace Game.DataStorage
|
|||||||
BattlePetSpeciesStateStorage = DBReader.Read<BattlePetSpeciesStateRecord>("BattlePetSpeciesState.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE);
|
BattlePetSpeciesStateStorage = DBReader.Read<BattlePetSpeciesStateRecord>("BattlePetSpeciesState.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE);
|
||||||
BattlemasterListStorage = DBReader.Read<BattlemasterListRecord>("BattlemasterList.db2", HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE);
|
BattlemasterListStorage = DBReader.Read<BattlemasterListRecord>("BattlemasterList.db2", HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE);
|
||||||
BroadcastTextStorage = DBReader.Read<BroadcastTextRecord>("BroadcastText.db2", HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE);
|
BroadcastTextStorage = DBReader.Read<BroadcastTextRecord>("BroadcastText.db2", HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE);
|
||||||
|
CfgRegionsStorage = DBReader.Read<Cfg_RegionsRecord>("Cfg_Regions.db2", HotfixStatements.SEL_CFG_REGIONS);
|
||||||
CharacterFacialHairStylesStorage = DBReader.Read<CharacterFacialHairStylesRecord>("CharacterFacialHairStyles.db2", HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES);
|
CharacterFacialHairStylesStorage = DBReader.Read<CharacterFacialHairStylesRecord>("CharacterFacialHairStyles.db2", HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES);
|
||||||
CharBaseSectionStorage = DBReader.Read<CharBaseSectionRecord>("CharBaseSection.db2", HotfixStatements.SEL_CHAR_BASE_SECTION);
|
CharBaseSectionStorage = DBReader.Read<CharBaseSectionRecord>("CharBaseSection.db2", HotfixStatements.SEL_CHAR_BASE_SECTION);
|
||||||
CharSectionsStorage = DBReader.Read<CharSectionsRecord>("CharSections.db2", HotfixStatements.SEL_CHAR_SECTIONS);
|
CharSectionsStorage = DBReader.Read<CharSectionsRecord>("CharSections.db2", HotfixStatements.SEL_CHAR_SECTIONS);
|
||||||
@@ -273,6 +274,7 @@ namespace Game.DataStorage
|
|||||||
WorldEffectStorage = DBReader.Read<WorldEffectRecord>("WorldEffect.db2", HotfixStatements.SEL_WORLD_EFFECT);
|
WorldEffectStorage = DBReader.Read<WorldEffectRecord>("WorldEffect.db2", HotfixStatements.SEL_WORLD_EFFECT);
|
||||||
WorldMapOverlayStorage = DBReader.Read<WorldMapOverlayRecord>("WorldMapOverlay.db2", HotfixStatements.SEL_WORLD_MAP_OVERLAY);
|
WorldMapOverlayStorage = DBReader.Read<WorldMapOverlayRecord>("WorldMapOverlay.db2", HotfixStatements.SEL_WORLD_MAP_OVERLAY);
|
||||||
WorldSafeLocsStorage = DBReader.Read<WorldSafeLocsRecord>("WorldSafeLocs.db2", HotfixStatements.SEL_WORLD_SAFE_LOCS, HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE);
|
WorldSafeLocsStorage = DBReader.Read<WorldSafeLocsRecord>("WorldSafeLocs.db2", HotfixStatements.SEL_WORLD_SAFE_LOCS, HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE);
|
||||||
|
WorldStateExpressionStorage = DBReader.Read<WorldStateExpressionRecord>("WorldStateExpression.db2", HotfixStatements.SEL_WORLD_STATE_EXPRESSION);
|
||||||
|
|
||||||
Global.DB2Mgr.LoadStores();
|
Global.DB2Mgr.LoadStores();
|
||||||
|
|
||||||
@@ -406,6 +408,7 @@ namespace Game.DataStorage
|
|||||||
public static DB6Storage<BattlePetSpeciesStateRecord> BattlePetSpeciesStateStorage;
|
public static DB6Storage<BattlePetSpeciesStateRecord> BattlePetSpeciesStateStorage;
|
||||||
public static DB6Storage<BattlemasterListRecord> BattlemasterListStorage;
|
public static DB6Storage<BattlemasterListRecord> BattlemasterListStorage;
|
||||||
public static DB6Storage<BroadcastTextRecord> BroadcastTextStorage;
|
public static DB6Storage<BroadcastTextRecord> BroadcastTextStorage;
|
||||||
|
public static DB6Storage<Cfg_RegionsRecord> CfgRegionsStorage;
|
||||||
public static DB6Storage<CharacterFacialHairStylesRecord> CharacterFacialHairStylesStorage;
|
public static DB6Storage<CharacterFacialHairStylesRecord> CharacterFacialHairStylesStorage;
|
||||||
public static DB6Storage<CharBaseSectionRecord> CharBaseSectionStorage;
|
public static DB6Storage<CharBaseSectionRecord> CharBaseSectionStorage;
|
||||||
public static DB6Storage<CharSectionsRecord> CharSectionsStorage;
|
public static DB6Storage<CharSectionsRecord> CharSectionsStorage;
|
||||||
@@ -616,6 +619,7 @@ namespace Game.DataStorage
|
|||||||
public static DB6Storage<WorldEffectRecord> WorldEffectStorage;
|
public static DB6Storage<WorldEffectRecord> WorldEffectStorage;
|
||||||
public static DB6Storage<WorldMapOverlayRecord> WorldMapOverlayStorage;
|
public static DB6Storage<WorldMapOverlayRecord> WorldMapOverlayStorage;
|
||||||
public static DB6Storage<WorldSafeLocsRecord> WorldSafeLocsStorage;
|
public static DB6Storage<WorldSafeLocsRecord> WorldSafeLocsStorage;
|
||||||
|
public static DB6Storage<WorldStateExpressionRecord> WorldStateExpressionStorage;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region GameTables
|
#region GameTables
|
||||||
|
|||||||
@@ -75,4 +75,10 @@ namespace Game.DataStorage
|
|||||||
public ushort MapID;
|
public ushort MapID;
|
||||||
public float Facing;
|
public float Facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed class WorldStateExpressionRecord
|
||||||
|
{
|
||||||
|
public uint Id;
|
||||||
|
public string Expression;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,12 +121,6 @@ namespace Game.Network.Packets
|
|||||||
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Resurrect))
|
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Resurrect))
|
||||||
playerFlags &= ~PlayerFlags.Ghost;
|
playerFlags &= ~PlayerFlags.Ghost;
|
||||||
|
|
||||||
if (playerFlags.HasAnyFlag(PlayerFlags.HideHelm))
|
|
||||||
Flags |= CharacterFlags.HideHelm;
|
|
||||||
|
|
||||||
if (playerFlags.HasAnyFlag(PlayerFlags.HideCloak))
|
|
||||||
Flags |= CharacterFlags.HideCloak;
|
|
||||||
|
|
||||||
if (playerFlags.HasAnyFlag(PlayerFlags.Ghost))
|
if (playerFlags.HasAnyFlag(PlayerFlags.Ghost))
|
||||||
Flags |= CharacterFlags.Ghost;
|
Flags |= CharacterFlags.Ghost;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public class GameTime
|
|||||||
static DateTime _gameTimeSystemPoint = DateTime.MinValue;
|
static DateTime _gameTimeSystemPoint = DateTime.MinValue;
|
||||||
static DateTime _gameTimeSteadyPoint = DateTime.MinValue;
|
static DateTime _gameTimeSteadyPoint = DateTime.MinValue;
|
||||||
|
|
||||||
|
static DateTime _dateTime;
|
||||||
|
|
||||||
public static long GetStartTime()
|
public static long GetStartTime()
|
||||||
{
|
{
|
||||||
return StartTime;
|
return StartTime;
|
||||||
@@ -42,11 +44,18 @@ public class GameTime
|
|||||||
return (uint)(_gameTime - StartTime);
|
return (uint)(_gameTime - StartTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DateTime GetDateAndTime()
|
||||||
|
{
|
||||||
|
return _dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
public static void UpdateGameTimers()
|
public static void UpdateGameTimers()
|
||||||
{
|
{
|
||||||
_gameTime = Time.UnixTime;
|
_gameTime = Time.UnixTime;
|
||||||
_gameMSTime = Time.GetMSTime();
|
_gameMSTime = Time.GetMSTime();
|
||||||
_gameTimeSystemPoint = DateTime.Now;
|
_gameTimeSystemPoint = DateTime.Now;
|
||||||
_gameTimeSteadyPoint = DateTime.Now;
|
_gameTimeSteadyPoint = DateTime.Now;
|
||||||
|
|
||||||
|
_dateTime = Time.UnixTimeToDateTime(_gameTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user