mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-05-20 08:26:59 -04:00
Refactor StatusEffectContainer to better handle messages using
CommandResultContainer. Alter Modifiers to be the same as ParamNames. Add LoseOnClassChange flag for status effects. Add a few missing status effects. Fix EndTime for stance status effects to stop icon from blinking.
This commit is contained in:
@@ -336,17 +336,17 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
enum StatusEffectFlags : uint
|
||||
{
|
||||
None = 0,
|
||||
Silent = 1 << 0, // dont display effect loss message
|
||||
|
||||
//Loss flags
|
||||
LoseOnDeath = 1 << 1, // effects removed on death
|
||||
LoseOnZoning = 1 << 2, // effects removed on zoning
|
||||
LoseOnEsuna = 1 << 3, // effects which can be removed with esuna (debuffs)
|
||||
LoseOnDispel = 1 << 4, // some buffs which player might be able to dispel from mob
|
||||
LoseOnLogout = 1 << 5, // effects removed on logging out
|
||||
LoseOnAttacking = 1 << 6, // effects removed when owner attacks another entity
|
||||
LoseOnCastStart = 1 << 7, // effects removed when owner starts casting
|
||||
LoseOnAggro = 1 << 8, // effects removed when owner gains enmity (swiftsong)
|
||||
//Loss flags - Do we need loseonattacking/caststart? Could just be done with activate flags
|
||||
LoseOnDeath = 1 << 0, // effects removed on death
|
||||
LoseOnZoning = 1 << 1, // effects removed on zoning
|
||||
LoseOnEsuna = 1 << 2, // effects which can be removed with esuna (debuffs)
|
||||
LoseOnDispel = 1 << 3, // some buffs which player might be able to dispel from mob
|
||||
LoseOnLogout = 1 << 4, // effects removed on logging out
|
||||
LoseOnAttacking = 1 << 5, // effects removed when owner attacks another entity
|
||||
LoseOnCastStart = 1 << 6, // effects removed when owner starts casting
|
||||
LoseOnAggro = 1 << 7, // effects removed when owner gains enmity (swiftsong)
|
||||
LoseOnClassChange = 1 << 8, //Effect falls off whhen changing class
|
||||
|
||||
//Activate flags
|
||||
ActivateOnCastStart = 1 << 9, //Activates when a cast starts.
|
||||
@@ -373,9 +373,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
PreventMovement = 1 << 26, // effects which prevent movement such as bind, still allows turning in place
|
||||
PreventTurn = 1 << 27, // effects which prevent turning, such as stun
|
||||
PreventUntarget = 1 << 28, // effects which prevent changing targets, such as fixation
|
||||
|
||||
Stealth = 1 << 29, // sneak/invis
|
||||
Stance = 1 << 30, // effects that do not have a timer
|
||||
Stance = 1 << 29 // effects that do not have a timer
|
||||
}
|
||||
|
||||
enum StatusEffectOverwrite : byte
|
||||
@@ -392,19 +390,22 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
private Character owner;
|
||||
private Character source;
|
||||
private StatusEffectId id;
|
||||
private string name; // name of this effect
|
||||
private DateTime startTime; // when was this effect added
|
||||
private DateTime endTime; // when this status falls off
|
||||
private DateTime lastTick; // when did this effect last tick
|
||||
private uint duration; // how long should this effect last in seconds
|
||||
private uint tickMs; // how often should this effect proc
|
||||
private double magnitude; // a value specified by scripter which is guaranteed to be used by all effects
|
||||
private byte tier; // same effect with higher tier overwrites this
|
||||
private double extra; // optional value
|
||||
private StatusEffectFlags flags; // death/erase/dispel etc
|
||||
private StatusEffectOverwrite overwrite; // how to handle adding an effect with same id (see StatusEfectOverwrite)
|
||||
private bool silent = false; // do i send a message on losing effect
|
||||
private bool hidden = false;
|
||||
private string name; // name of this effect
|
||||
private DateTime startTime; // when was this effect added
|
||||
private DateTime endTime; // when this status falls off
|
||||
private DateTime lastTick; // when did this effect last tick
|
||||
private uint duration; // how long should this effect last in seconds
|
||||
private uint tickMs; // how often should this effect proc
|
||||
private double magnitude; // a value specified by scripter which is guaranteed to be used by all effects
|
||||
private byte tier; // same effect with higher tier overwrites this
|
||||
private double extra; // optional value
|
||||
private StatusEffectFlags flags; // death/erase/dispel etc
|
||||
private StatusEffectOverwrite overwrite; // how to handle adding an effect with same id (see StatusEfectOverwrite)
|
||||
private bool silentOnGain = false; //Whether a message is sent when the status is gained
|
||||
private bool silentOnLoss = false; //Whether a message is sent when the status is lost
|
||||
private bool hidden = false; //Whether this status is shown. Used for things that aren't really status effects like exp chains and procs
|
||||
private ushort statusGainTextId; //The text id used when the status is gained
|
||||
private ushort statusLossTextId; //The text id used when the status effect falls off when its time runs out
|
||||
public LuaScript script;
|
||||
|
||||
HitEffect animationEffect;
|
||||
@@ -438,26 +439,34 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
this.name = effect.name;
|
||||
this.flags = effect.flags;
|
||||
this.overwrite = effect.overwrite;
|
||||
this.statusGainTextId = effect.statusGainTextId;
|
||||
this.statusLossTextId = effect.statusLossTextId;
|
||||
this.extra = effect.extra;
|
||||
this.script = effect.script;
|
||||
this.silentOnGain = effect.silentOnGain;
|
||||
this.silentOnLoss = effect.silentOnLoss;
|
||||
this.hidden = effect.hidden;
|
||||
}
|
||||
|
||||
public StatusEffect(uint id, string name, uint flags, uint overwrite, uint tickMs)
|
||||
public StatusEffect(uint id, string name, uint flags, uint overwrite, uint tickMs, bool hidden, bool silentOnGain, bool silentOnLoss)
|
||||
{
|
||||
this.id = (StatusEffectId)id;
|
||||
this.name = name;
|
||||
this.flags = (StatusEffectFlags)flags;
|
||||
this.overwrite = (StatusEffectOverwrite)overwrite;
|
||||
this.tickMs = tickMs;
|
||||
this.hidden = hidden;
|
||||
this.silentOnGain = silentOnGain;
|
||||
this.silentOnLoss = silentOnLoss;
|
||||
}
|
||||
|
||||
// return true when duration has elapsed
|
||||
public bool Update(DateTime tick)
|
||||
public bool Update(DateTime tick, CommandResultContainer resultContainer = null)
|
||||
{
|
||||
if (tickMs != 0 && (tick - lastTick).TotalMilliseconds >= tickMs)
|
||||
{
|
||||
lastTick = tick;
|
||||
if (LuaEngine.CallLuaStatusEffectFunction(this.owner, this, "onTick", this.owner, this) > 0)
|
||||
if (LuaEngine.CallLuaStatusEffectFunction(this.owner, this, "onTick", this.owner, this, resultContainer) > 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -553,9 +562,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
return (byte)overwrite;
|
||||
}
|
||||
|
||||
public bool GetSilent()
|
||||
public bool GetSilentOnGain()
|
||||
{
|
||||
return silent;
|
||||
return silentOnGain;
|
||||
}
|
||||
|
||||
public bool GetSilentOnLoss()
|
||||
{
|
||||
return silentOnLoss;
|
||||
}
|
||||
|
||||
public bool GetHidden()
|
||||
@@ -563,6 +577,17 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
return hidden;
|
||||
}
|
||||
|
||||
public ushort GetStatusGainTextId()
|
||||
{
|
||||
return 30328;
|
||||
return statusGainTextId;
|
||||
}
|
||||
|
||||
public ushort GetStatusLossTextId()
|
||||
{
|
||||
return statusLossTextId;
|
||||
}
|
||||
|
||||
public void SetStartTime(DateTime time)
|
||||
{
|
||||
this.startTime = time;
|
||||
@@ -571,7 +596,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
|
||||
public void SetEndTime(DateTime time)
|
||||
{
|
||||
endTime = time;
|
||||
//If it's a stance, just set endtime to highest number possible for XIV
|
||||
if ((flags & StatusEffectFlags.Stance) != 0)
|
||||
{
|
||||
endTime = Utils.UnixTimeStampToDateTime(4294967295);
|
||||
}
|
||||
else
|
||||
{
|
||||
endTime = time;
|
||||
}
|
||||
}
|
||||
|
||||
//Refresh the status, updating the end time based on the duration of the status and broadcasts the new time
|
||||
@@ -634,9 +667,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
this.overwrite = (StatusEffectOverwrite)overwrite;
|
||||
}
|
||||
|
||||
public void SetSilent(bool silent)
|
||||
public void SetSilentOnGain(bool silent)
|
||||
{
|
||||
this.silent = silent;
|
||||
this.silentOnGain = silent;
|
||||
}
|
||||
|
||||
public void SetSilentOnLoss(bool silent)
|
||||
{
|
||||
this.silentOnLoss = silent;
|
||||
}
|
||||
|
||||
public void SetHidden(bool hidden)
|
||||
@@ -644,6 +682,17 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
this.hidden = hidden;
|
||||
}
|
||||
|
||||
public void SetStatusGainTextId(ushort textId)
|
||||
{
|
||||
this.statusGainTextId = textId;
|
||||
}
|
||||
|
||||
public void SetStatusLossTextId(ushort textId)
|
||||
{
|
||||
this.statusLossTextId = textId;
|
||||
}
|
||||
|
||||
|
||||
public void SetAnimation(uint hitEffect)
|
||||
{
|
||||
animationEffect = (HitEffect)hitEffect;
|
||||
|
Reference in New Issue
Block a user