mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-02 19:42:05 -04:00
Small fixes
Fixed final message for multi-hit attacks. Fixed self targeting for commands Made it so player.lua doesn't skip over home points setting, just the quest setitng. Began adding knockback effect handling
This commit is contained in:
parent
79f2edf406
commit
ace4dfe58f
@ -1072,6 +1072,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||
foreach (var chara in targets)
|
||||
{
|
||||
ushort hitCount = 0;
|
||||
ushort totalDamage = 0;
|
||||
for (int hitNum = 1; hitNum <= command.numHits; hitNum++)
|
||||
{
|
||||
var action = new BattleAction(chara.actorId, command, (byte)GetHitDirection(chara), (byte) hitNum);
|
||||
@ -1084,13 +1085,16 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||
{
|
||||
hitTarget = true;
|
||||
hitCount++;
|
||||
totalDamage += action.amount;
|
||||
}
|
||||
}
|
||||
|
||||
if (command.numHits > 1)
|
||||
{
|
||||
//You use [command] on [target].
|
||||
actions.AddAction(new BattleAction(chara.actorId, 30442, 0, 0, (byte)hitCount));
|
||||
//30442: [hitCount]fold Attack! [chara] takes a total of totalDamage points of damage.
|
||||
//30450: All attacks miss!
|
||||
ushort textId = (ushort) (hitTarget ? 30442 : 30450);
|
||||
actions.AddAction(new BattleAction(chara.actorId, textId, 0, totalDamage, (byte)hitCount));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,6 +92,7 @@ namespace FFXIVClassic_Map_Server.actors.chara
|
||||
Regain = 70, //TP regen, should be -90 out of combat, Invigorate sets to 100+ depending on traits
|
||||
RegenDown = 71, //Damage over time effects. Separate from normal Regen because of how they are displayed in game
|
||||
Stoneskin = 72, //Nullifies damage
|
||||
MinimumTpLock = 73
|
||||
MinimumTpLock = 73, //Don't let TP fall below this, used in openings
|
||||
KnockbackImmune = 74 //Immune to knockback effects when above 0
|
||||
}
|
||||
}
|
||||
|
@ -75,6 +75,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
Spell = 4
|
||||
}
|
||||
|
||||
public enum KnockbackType : ushort
|
||||
{
|
||||
None = 0,
|
||||
Level1 = 1,
|
||||
Level2 = 2,
|
||||
Level3 = 3,
|
||||
Level4 = 4,
|
||||
Level5 = 5,
|
||||
Clockwise1 = 6,
|
||||
Clockwise2 = 7,
|
||||
CounterClockwise1 = 8,
|
||||
CounterClockwise2 = 9,
|
||||
DrawIn = 10
|
||||
}
|
||||
|
||||
class BattleCommand
|
||||
{
|
||||
public ushort id;
|
||||
@ -121,7 +136,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
public float accuracyModifier; //modifies accuracy
|
||||
public float bonusCritRate; //extra crit rate
|
||||
public bool isCombo;
|
||||
public bool isRanged;
|
||||
public bool isRanged = false;
|
||||
|
||||
public bool actionCrit; //Whether any actions were critical hits, used for Excruciate
|
||||
|
||||
@ -365,28 +380,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
return targetFind?.GetTargets<Character>();
|
||||
}
|
||||
|
||||
//Handles setting the correct target for self-targeted spells
|
||||
public Character GetMainTarget(Character caster, Character target)
|
||||
{
|
||||
//If skill can only be used on self
|
||||
if (mainTarget == ValidTarget.Self)
|
||||
return caster;
|
||||
//If skill can only be used on party members and the target is not a party member
|
||||
else if (((mainTarget & ValidTarget.PartyMember) != 0) && (target.currentParty != caster.currentParty))
|
||||
return caster;
|
||||
//If skill can only be used on allys and the target is not an ally
|
||||
else if (((mainTarget & ValidTarget.Ally) != 0) && (target.allegiance != caster.allegiance))
|
||||
return caster;
|
||||
//If skill can only be used on players and the target is not a player
|
||||
else if (((mainTarget & ValidTarget.Player) != 0) && (!(target is Player)))
|
||||
return caster;
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
public ushort GetCommandType()
|
||||
{
|
||||
return (ushort) commandType;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -129,12 +129,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
RoamingSoul = 223111,
|
||||
Purge = 223112,
|
||||
Spiritsong = 223113,
|
||||
Resonance = 223114,
|
||||
Resonance = 223114, //Old Resonance? Both have the same icons and description
|
||||
Soughspeak = 223115,
|
||||
PresenceofMind2 = 223116,
|
||||
SanguineRite = 223117, //old effect
|
||||
PunishingBarbs = 223118,
|
||||
DarkSeal = 223119,
|
||||
DarkSeal = 223119, //old effect
|
||||
Emulate = 223120,
|
||||
ParadigmShift = 223121,
|
||||
ConcussiveBlowx1 = 223123,
|
||||
@ -241,7 +241,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
ShroudofSaints = 223226,
|
||||
ClericStance = 223227,
|
||||
BlissfulMind = 223228,
|
||||
DarkSeal2 = 223229,
|
||||
DarkSeal2 = 223229, //new effect
|
||||
Resonance2 = 223230,
|
||||
Excruciate = 223231,
|
||||
Necrogenesis = 223232,
|
||||
|
@ -23,7 +23,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
|
||||
this.skill = Server.GetWorldManager().GetBattleCommand(skillId);
|
||||
var returnCode = lua.LuaEngine.CallLuaBattleCommandFunction(owner, skill, "ability", "onAbilityPrepare", owner, target, skill);
|
||||
|
||||
this.target = skill.GetMainTarget(owner, target);
|
||||
this.target = target != null ? target : owner;
|
||||
|
||||
if (returnCode == 0)
|
||||
{
|
||||
|
@ -26,7 +26,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
|
||||
this.spell = Server.GetWorldManager().GetBattleCommand(spellId);
|
||||
var returnCode = lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicPrepare", owner, target, spell);
|
||||
|
||||
this.target = spell.GetMainTarget(owner, target);
|
||||
//Modify spell based on status effects. Need to do it here because they can modify cast times
|
||||
List<StatusEffect> effects = owner.statusEffects.GetStatusEffectsByFlag((uint)(StatusEffectFlags.ActivateOnCastStart));
|
||||
|
||||
//modify skill based on status effects
|
||||
//Do this here to allow buffs like Resonance to increase range before checking CanCast()
|
||||
foreach (var effect in effects)
|
||||
lua.LuaEngine.CallLuaStatusEffectFunction(owner, effect, "onMagicCast", owner, effect, spell);
|
||||
|
||||
this.target = target != null ? target : owner;
|
||||
|
||||
if (returnCode == 0 && owner.CanCast(this.target, spell))
|
||||
{
|
||||
@ -65,13 +73,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
|
||||
spell.isCombo = true;
|
||||
}
|
||||
|
||||
//Modify spell based on status effects. Need to do it here because they can modify cast times
|
||||
List<StatusEffect> effects = owner.statusEffects.GetStatusEffectsByFlag((uint) (StatusEffectFlags.ActivateOnCastStart));
|
||||
|
||||
//modify skill based on status effects
|
||||
foreach (var effect in effects)
|
||||
lua.LuaEngine.CallLuaStatusEffectFunction(owner, effect, "onMagicCast", owner, effect, spell);
|
||||
|
||||
if (!spell.IsInstantCast())
|
||||
{
|
||||
// command casting duration
|
||||
|
@ -50,6 +50,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.utils
|
||||
{ HitType.Crit, HitEffect.Crit }
|
||||
};
|
||||
|
||||
public static Dictionary<KnockbackType, HitEffect> KnockbackEffects = new Dictionary<KnockbackType, HitEffect>()
|
||||
{
|
||||
{ KnockbackType.None, 0 },
|
||||
{ KnockbackType.Level1, HitEffect.KnockbackLv1 },
|
||||
{ KnockbackType.Level2, HitEffect.KnockbackLv2 },
|
||||
{ KnockbackType.Level3, HitEffect.KnockbackLv3 },
|
||||
{ KnockbackType.Level4, HitEffect.KnockbackLv4 },
|
||||
{ KnockbackType.Level5, HitEffect.KnockbackLv5 },
|
||||
{ KnockbackType.Clockwise1, HitEffect.KnockbackClockwiseLv1 },
|
||||
{ KnockbackType.Clockwise2, HitEffect.KnockbackClockwiseLv2 },
|
||||
{ KnockbackType.CounterClockwise1, HitEffect.KnockbackCounterClockwiseLv1 },
|
||||
{ KnockbackType.CounterClockwise2, HitEffect.KnockbackCounterClockwiseLv2 },
|
||||
{ KnockbackType.DrawIn, HitEffect.DrawIn }
|
||||
};
|
||||
|
||||
public static Dictionary<byte, ushort> ClassExperienceTextIds = new Dictionary<byte, ushort>()
|
||||
{
|
||||
{ 2, 33934 }, //Pugilist
|
||||
|
@ -1,24 +1,24 @@
|
||||
require("global");
|
||||
|
||||
local initClassItems, initRaceItems;
|
||||
|
||||
function onBeginLogin(player)
|
||||
--New character, set the initial quest
|
||||
--[[
|
||||
if (player:GetPlayTime(false) == 0) then
|
||||
initialTown = player:GetInitialTown();
|
||||
|
||||
if (initialTown == 1 and player:HasQuest(110001) == false) then
|
||||
player:AddQuest(110001);
|
||||
--player:AddQuest(110001);
|
||||
player:SetHomePoint(1280001);
|
||||
elseif (initialTown == 2 and player:HasQuest(110005) == false) then
|
||||
player:AddQuest(110005);
|
||||
--player:AddQuest(110005);
|
||||
player:SetHomePoint(1280061);
|
||||
elseif (initialTown == 3 and player:HasQuest(110009) == false) then
|
||||
player:AddQuest(110009);
|
||||
--player:AddQuest(110009);
|
||||
player:SetHomePoint(1280031);
|
||||
end
|
||||
|
||||
end
|
||||
]]
|
||||
|
||||
--For Opening. Set Director and reset position incase d/c
|
||||
if (player:HasQuest(110001) == true and player:GetZoneID() == 193) then
|
||||
director = player:GetZone():CreateDirector("OpeningDirector", false);
|
||||
|
Loading…
Reference in New Issue
Block a user