1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-24 13:47:46 +00:00

fixed cast interrupt

- dont allow targeting of mob moving back to spawn
This commit is contained in:
Tahir Akhlaq 2017-08-30 00:14:14 +01:00
parent 2cee5ff573
commit 517bdc0638
17 changed files with 114 additions and 112 deletions

View file

@ -51,9 +51,19 @@ namespace FFXIVClassic.Common
return new Vector3(scalar * rhs.X, scalar * rhs.Y, scalar * rhs.Z); return new Vector3(scalar * rhs.X, scalar * rhs.Y, scalar * rhs.Z);
} }
public static Vector3 operator /(Vector3 lhs, Vector3 rhs) public static Vector3 operator /(Vector3 lhs, float scalar)
{ {
return new Vector3(lhs.X - rhs.X, lhs.Y - rhs.Y, lhs.Z - rhs.Z); return new Vector3(lhs.X / scalar, lhs.Y / scalar, lhs.Z / scalar);
}
public static bool operator !=(Vector3 lhs, Vector3 rhs)
{
return !(lhs?.X == rhs?.X && lhs?.Y == rhs?.Y && lhs?.Z == rhs?.Z);
}
public static bool operator ==(Vector3 lhs, Vector3 rhs)
{
return (lhs?.X == rhs?.X && lhs?.Y == rhs?.Y && lhs?.Z == rhs?.Z);
} }
public float Length() public float Length()
@ -78,7 +88,8 @@ namespace FFXIVClassic.Common
public static float GetAngle(float x, float z, float x2, float z2) public static float GetAngle(float x, float z, float x2, float z2)
{ {
return (float)(Math.Atan2((z2 - z), (x2 - x))); var angle = (float)(Math.Atan((z2 - z) / (x2 - x)));
return (float)(x > x2 ? angle + Math.PI : angle);
} }
public Vector3 NewHorizontalVector(float angle, float extents) public Vector3 NewHorizontalVector(float angle, float extents)

View file

@ -2169,12 +2169,12 @@ namespace FFXIVClassic_Map_Server
battleCommand.job = reader.GetByte("classJob"); battleCommand.job = reader.GetByte("classJob");
battleCommand.level = reader.GetByte("lvl"); battleCommand.level = reader.GetByte("lvl");
battleCommand.requirements = (AbilityRequirements)reader.GetUInt16("requirements"); battleCommand.requirements = (BattleCommandRequirements)reader.GetUInt16("requirements");
battleCommand.validTarget = (ValidTarget)reader.GetByte("validTarget"); battleCommand.validTarget = (ValidTarget)reader.GetByte("validTarget");
battleCommand.aoeType = (TargetFindAOEType)reader.GetByte("aoeType"); battleCommand.aoeType = (TargetFindAOEType)reader.GetByte("aoeType");
battleCommand.numHits = reader.GetByte("numHits"); battleCommand.numHits = reader.GetByte("numHits");
battleCommand.positionBonus = (AbilityPositionBonus)reader.GetByte("positionBonus"); battleCommand.positionBonus = (BattleCommandPositionBonus)reader.GetByte("positionBonus");
battleCommand.procRequirement = (AbilityProcRequirement)reader.GetByte("procRequirement"); battleCommand.procRequirement = (BattleCommandProcRequirement)reader.GetByte("procRequirement");
battleCommand.range = reader.GetInt32("range"); battleCommand.range = reader.GetInt32("range");
battleCommand.debuffDurationSeconds = reader.GetUInt32("debuffDuration"); battleCommand.debuffDurationSeconds = reader.GetUInt32("debuffDuration");
battleCommand.buffDurationSeconds = reader.GetUInt32("buffDuration"); battleCommand.buffDurationSeconds = reader.GetUInt32("buffDuration");

View file

@ -403,7 +403,6 @@ namespace FFXIVClassic_Map_Server.Actors
{ {
// push latest for player // push latest for player
var pos = positionUpdates[currentSubState == SetActorStatePacket.SUB_STATE_PLAYER ? positionUpdates.Count - 1 : 0]; var pos = positionUpdates[currentSubState == SetActorStatePacket.SUB_STATE_PLAYER ? positionUpdates.Count - 1 : 0];
oldPositionX = positionX; oldPositionX = positionX;
oldPositionY = positionY; oldPositionY = positionY;
oldPositionZ = positionZ; oldPositionZ = positionZ;
@ -413,6 +412,8 @@ namespace FFXIVClassic_Map_Server.Actors
positionY = pos.Y; positionY = pos.Y;
positionZ = pos.Z; positionZ = pos.Z;
zone.UpdateActorPosition(this);
//Program.Server.GetInstance().mLuaEngine.OnPath(actor, position, positionUpdates) //Program.Server.GetInstance().mLuaEngine.OnPath(actor, position, positionUpdates)
positionUpdates.Remove(pos); positionUpdates.Remove(pos);
@ -433,10 +434,8 @@ namespace FFXIVClassic_Map_Server.Actors
if ((updateFlags & ActorUpdateFlags.State) != 0) if ((updateFlags & ActorUpdateFlags.State) != 0)
{ {
packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, currentSubState)); packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, currentSubState));
if (this is Character)
packets.Add(BattleActionX00Packet.BuildPacket(actorId, 0x72000062, 0));
} }
updateFlags = ActorUpdateFlags.None; updateFlags = ActorUpdateFlags.None;
zone.BroadcastPacketsAroundActor(this, packets); zone.BroadcastPacketsAroundActor(this, packets);
} }
@ -654,7 +653,7 @@ namespace FFXIVClassic_Map_Server.Actors
public bool IsFacing(float x, float z, float angle = 40.0f) public bool IsFacing(float x, float z, float angle = 40.0f)
{ {
angle = (float)(Math.PI * angle / 180); angle = (float)(Math.PI * angle / 180);
return Vector3.GetAngle(positionX, positionZ, x, z) < angle; return Math.Abs(Vector3.GetAngle(positionX, positionZ, x, z) - rotation) < angle;
} }
// todo: is this legit? // todo: is this legit?

View file

@ -297,10 +297,16 @@ namespace FFXIVClassic_Map_Server.Actors
packets.Add(new SetActorAppearancePacket(modelId, appearanceIds).BuildPacket(actorId)); packets.Add(new SetActorAppearancePacket(modelId, appearanceIds).BuildPacket(actorId));
} }
if ((updateFlags & ActorUpdateFlags.State) != 0)
{
packets.Add(BattleActionX00Packet.BuildPacket(actorId, 0x72000062, 0));
}
// todo: should probably add another flag for battleTemp since all this uses reflection // todo: should probably add another flag for battleTemp since all this uses reflection
if ((updateFlags & ActorUpdateFlags.HpTpMp) != 0) if ((updateFlags & ActorUpdateFlags.HpTpMp) != 0)
{ {
var propPacketUtil = new ActorPropertyPacketUtil("charaWork.parameterSave", this); var propPacketUtil = new ActorPropertyPacketUtil("charaWork.parameterSave", this);
propPacketUtil.AddProperty("charaWork.parameterSave.mp"); propPacketUtil.AddProperty("charaWork.parameterSave.mp");
propPacketUtil.AddProperty("charaWork.parameterSave.mpMax"); propPacketUtil.AddProperty("charaWork.parameterSave.mpMax");
propPacketUtil.AddProperty("charaWork.parameterTemp.tp"); propPacketUtil.AddProperty("charaWork.parameterTemp.tp");

View file

@ -113,7 +113,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public bool CanChangeState() public bool CanChangeState()
{ {
return GetCurrentState() == null || states.Peek().CanInterrupt(); return GetCurrentState() == null || states.Peek().CanChangeState();
} }
public void ChangeTarget(Character target) public void ChangeTarget(Character target)
@ -294,31 +294,40 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
owner.updateFlags |= ActorUpdateFlags.HpTpMp; owner.updateFlags |= ActorUpdateFlags.HpTpMp;
// todo: use the update flags
owner.ChangeState(SetActorStatePacket.MAIN_STATE_PASSIVE);
ChangeTarget(null); ChangeTarget(null);
ClearStates(); ClearStates();
} }
public void InternalAbility(Character target, uint abilityId) public void InternalAbility(Character target, uint abilityId)
{ {
if (CanChangeState())
{
}
} }
public void InternalCast(Character target, uint spellId) public void InternalCast(Character target, uint spellId)
{ {
ChangeState(new MagicState(owner, target, (ushort)spellId)); if (CanChangeState())
{
ChangeState(new MagicState(owner, target, (ushort)spellId));
}
} }
public void InternalWeaponSkill(Character target, uint weaponSkillId) public void InternalWeaponSkill(Character target, uint weaponSkillId)
{ {
ChangeState(new WeaponSkillState(owner, target, (ushort)weaponSkillId)); if (CanChangeState())
{
ChangeState(new WeaponSkillState(owner, target, (ushort)weaponSkillId));
}
} }
public void InternalMobSkill(Character target, uint mobSkillId) public void InternalMobSkill(Character target, uint mobSkillId)
{ {
if (CanChangeState())
{
}
} }
public void InternalDie(DateTime tick, uint timeToFadeout) public void InternalDie(DateTime tick, uint timeToFadeout)

View file

@ -12,7 +12,7 @@ using FFXIVClassic_Map_Server.actors.chara.ai.utils;
namespace FFXIVClassic_Map_Server.actors.chara.ai namespace FFXIVClassic_Map_Server.actors.chara.ai
{ {
public enum AbilityRequirements : ushort public enum BattleCommandRequirements : ushort
{ {
None, None,
DiscipleOfWar = 0x01, DiscipleOfWar = 0x01,
@ -27,7 +27,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
Conjury = 0x200 Conjury = 0x200
} }
public enum AbilityPositionBonus : byte public enum BattleCommandPositionBonus : byte
{ {
None, None,
Front = 0x01, Front = 0x01,
@ -35,7 +35,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
Flank = 0x04 Flank = 0x04
} }
public enum AbilityProcRequirement : byte public enum BattleCommandProcRequirement : byte
{ {
None, None,
Evade = 0x01, Evade = 0x01,
@ -50,12 +50,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public string name; public string name;
public byte job; public byte job;
public byte level; public byte level;
public AbilityRequirements requirements; public BattleCommandRequirements requirements;
public ValidTarget validTarget; public ValidTarget validTarget;
public TargetFindAOEType aoeType; public TargetFindAOEType aoeType;
public byte numHits; public byte numHits;
public AbilityPositionBonus positionBonus; public BattleCommandPositionBonus positionBonus;
public AbilityProcRequirement procRequirement; public BattleCommandProcRequirement procRequirement;
public int range; public int range;
public uint debuffDurationSeconds; public uint debuffDurationSeconds;
public uint buffDurationSeconds; public uint buffDurationSeconds;
@ -158,7 +158,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
} }
// todo: check target requirements // todo: check target requirements
if (requirements != AbilityRequirements.None) if (requirements != BattleCommandRequirements.None)
{ {
if (false) if (false)
{ {

View file

@ -248,8 +248,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
private bool IsWithinCone(Character target, bool withPet) private bool IsWithinCone(Character target, bool withPet)
{ {
// todo: // todo: make this actual cone
return false; return owner.IsFacing(target, angle) && Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, target.positionX, target.positionY, target.positionZ) < extents;
} }
private void AddTarget(Character target, bool withPet) private void AddTarget(Character target, bool withPet)

View file

@ -76,17 +76,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
// todo: too far, path to player if mob, message if player // todo: too far, path to player if mob, message if player
// owner.ResetMoveSpeeds(); // owner.ResetMoveSpeeds();
owner.moveState = 2; owner.moveState = 2;
if (owner.currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && owner.GetSpeed() != 0)
{
// todo: actual stat based range
if (Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, target.positionX, target.positionY, target.positionZ) > 10)
{
owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None);
owner.aiContainer.pathFind.PathInRange(target.positionX, target.positionY, target.positionZ, 1.5f, owner.GetAttackRange());
ChangeTarget(target);
return false;
}
}
lastActionTime = DateTime.Now; lastActionTime = DateTime.Now;
// todo: adjust cooldowns with modifiers // todo: adjust cooldowns with modifiers
} }
@ -165,13 +154,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
// todo: // todo:
waitTime = tick.AddSeconds(10); waitTime = tick.AddSeconds(10);
owner.OnRoam(tick); owner.OnRoam(tick);
}
if (tick >= lastRoamUpdate && !owner.aiContainer.pathFind.IsFollowingPath()) if (!owner.aiContainer.pathFind.IsFollowingPath())
{ {
// will move on next tick // will move on next tick
owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None); owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None);
owner.aiContainer.pathFind.PathInRange(owner.spawnX, owner.spawnY, owner.spawnZ, 1.5f, 20.0f); owner.aiContainer.pathFind.PathInRange(owner.spawnX, owner.spawnY, owner.spawnZ, 1.5f, 20.0f);
}
} }
@ -181,10 +170,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
{ {
if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.aggroType != AggroType.None) if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.aggroType != AggroType.None)
{ {
uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - ((Player)player).charaWork.parameterSave.state_mainSkillLevel); uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - player.charaWork.parameterSave.state_mainSkillLevel);
if (levelDifference < 10 || (owner.aggroType & AggroType.IgnoreLevelDifference) != 0 && ((BattleNpcController)owner.aiContainer.GetController()).CanAggroTarget((Player)player)) if (levelDifference <= 10 || (owner.aggroType & AggroType.IgnoreLevelDifference) != 0 && CanAggroTarget(player))
owner.hateContainer.AddBaseHate((Player)player); {
owner.hateContainer.AddBaseHate(player);
break;
}
} }
} }
} }
@ -246,13 +238,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
continue; continue;
float mobDistance = Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, chara.positionX, chara.positionY, chara.positionZ); float mobDistance = Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, chara.positionX, chara.positionY, chara.positionZ);
if (mobDistance < 0.70f && (chara.updateFlags & ActorUpdateFlags.Position) == 0) if (mobDistance < 0.50f && (chara.updateFlags & ActorUpdateFlags.Position) == 0)
{ {
owner.aiContainer.pathFind.PathInRange(targetPos, 1.3f, 1.8f); owner.aiContainer.pathFind.PathInRange(targetPos, 1.3f, chara.GetAttackRange());
break; break;
} }
} }
} }
FaceTarget();
} }
} }
} }
@ -281,6 +274,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
{ {
return false; return false;
} }
if (owner.GetSpeed() == 0)
{
return false;
}
return true; return true;
} }
@ -339,12 +336,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
hasInvisible = hasSneak; hasInvisible = hasSneak;
} }
if (detectSight && !hasInvisible && isFacing)
return CanSeePoint(target.positionX, target.positionY, target.positionZ);
if ((owner.aggroType & AggroType.LowHp) != 0 && target.GetHPP() < 75) if ((owner.aggroType & AggroType.LowHp) != 0 && target.GetHPP() < 75)
return CanSeePoint(target.positionX, target.positionY, target.positionZ); return CanSeePoint(target.positionX, target.positionY, target.positionZ);
if (detectSight && !hasInvisible && isFacing)
return CanSeePoint(target.positionX, target.positionY, target.positionZ);
return false; return false;
} }

View file

@ -16,7 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
public AttackState(Character owner, Character target) : public AttackState(Character owner, Character target) :
base(owner, target) base(owner, target)
{ {
this.canInterrupt = true; this.canInterrupt = false;
this.startTime = DateTime.Now; this.startTime = DateTime.Now;
owner.ChangeState(SetActorStatePacket.MAIN_STATE_ACTIVE); owner.ChangeState(SetActorStatePacket.MAIN_STATE_ACTIVE);
@ -43,12 +43,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
} }
*/ */
if (target == null || owner.target != target || owner.target?.actorId != owner.currentLockedTarget) if (target == null || owner.target != target || owner.target?.actorId != owner.currentLockedTarget)
owner.aiContainer.ChangeTarget(target = Server.GetWorldManager().GetActorInWorld(owner.currentLockedTarget == 0xC0000000 ? owner.currentTarget : owner.currentLockedTarget) as Character); owner.aiContainer.ChangeTarget(target = owner.zone.FindActorInArea(owner.currentLockedTarget == 0xC0000000 ? owner.currentTarget : owner.currentLockedTarget) as Character);
if (target == null || target.IsDead()) if (target == null || target.IsDead())
{ {
//if (owner.currentSubState == SetActorStatePacket.SUB_STATE_MONSTER) if (owner.currentSubState == SetActorStatePacket.SUB_STATE_MONSTER)
// target = ((BattleNpc)owner).hateContainer.GetMostHatedTarget(); target = ((BattleNpc)owner).hateContainer.GetMostHatedTarget();
} }
else else
{ {

View file

@ -35,7 +35,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
} }
else else
{ {
errorResult = null; errorResult = new BattleAction(owner.actorId, 32553, 0);
interrupt = true; interrupt = true;
} }
} }
@ -47,7 +47,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
if (returnCode != 0) if (returnCode != 0)
{ {
interrupt = true; interrupt = true;
errorResult = new BattleAction(target.actorId, (ushort)(returnCode == -1 ? 32558 : returnCode), 0, 0, 0, 1); errorResult = new BattleAction(target.actorId, (ushort)(returnCode == -1 ? 32553 : returnCode), 0, 0, 0, 1);
} }
else else
{ {
@ -97,9 +97,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: send paralyzed/sleep message etc. // todo: send paralyzed/sleep message etc.
if (errorResult != null) if (errorResult != null)
{ {
//owner.zone.BroadcastPacketAroundActor(owner, errorResult); owner.DoBattleAction(spell.id, errorResult.animation, errorResult);
errorResult = null;
} }
owner.DoBattleAction(spell.id, 0x7F000002, new BattleAction(target.actorId, 0, 1, 0, 1));
} }
public override void OnComplete() public override void OnComplete()
@ -109,11 +109,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
var targets = spell.targetFind.GetTargets(); var targets = spell.targetFind.GetTargets();
BattleAction[] actions = new BattleAction[targets.Count]; BattleAction[] actions = new BattleAction[targets.Count];
List<SubPacket> packets = new List<SubPacket>();
var i = 0; var i = 0;
foreach (var chara in targets) foreach (var chara in targets)
{ {
var action = new BattleAction(target.actorId, spell.worldMasterTextId, spell.battleAnimation, 0, (byte) HitDirection.None, 1); var action = new BattleAction(target.actorId, spell.worldMasterTextId, spell.battleAnimation, 0, (byte)HitDirection.None, 1);
action.amount = (ushort)lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicFinish", owner, chara, spell, action); action.amount = (ushort)lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicFinish", owner, chara, spell, action);
actions[i++] = action; actions[i++] = action;
} }
@ -144,6 +143,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
return; return;
} }
if (HasMoved())
{
errorResult = new BattleAction(owner.actorId, 30211, 0);
errorResult.animation = 0x7F000002;
interrupt = true;
return;
}
interrupt = !CanCast(); interrupt = !CanCast();
} }
@ -154,7 +161,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
private bool HasMoved() private bool HasMoved()
{ {
return (Utils.DistanceSquared(owner.GetPosAsVector3(), startPos) > 4.0f); return (owner.GetPosAsVector3() != startPos);
} }
public override void Cleanup() public override void Cleanup()

View file

@ -83,7 +83,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: send paralyzed/sleep message etc. // todo: send paralyzed/sleep message etc.
if (errorResult != null) if (errorResult != null)
{ {
owner.DoBattleAction(skill.id, 0, errorResult); owner.DoBattleAction(skill.id, errorResult.animation, errorResult);
errorResult = null;
} }
} }

View file

@ -1971,6 +1971,13 @@ namespace FFXIVClassic_Map_Server.Actors
return false; return false;
} }
if (target.isMovingToSpawn)
{
// That command cannot be performed on the current target.
SendGameMessage(Server.GetWorldManager().GetActor(), 32547, 0x20);
return false;
}
// enemy only // enemy only
if ((validTarget & ValidTarget.Enemy) != 0) if ((validTarget & ValidTarget.Enemy) != 0)
{ {
@ -1980,7 +1987,6 @@ namespace FFXIVClassic_Map_Server.Actors
SendGameMessage(Server.GetWorldManager().GetActor(), 32547, 0x20); SendGameMessage(Server.GetWorldManager().GetActor(), 32547, 0x20);
return false; return false;
} }
if (currentParty != null && target.currentParty == currentParty) if (currentParty != null && target.currentParty == currentParty)
{ {
// That command cannot be performed on a party member. // That command cannot be performed on a party member.
@ -2030,7 +2036,7 @@ namespace FFXIVClassic_Map_Server.Actors
if (Utils.Distance(positionX, positionY, positionZ, target.positionX, target.positionY, target.positionZ) > spell.range) if (Utils.Distance(positionX, positionY, positionZ, target.positionX, target.positionY, target.positionZ) > spell.range)
{ {
// The target is out of range. // The target is out of range.
SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20, spell.id); SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20, (uint)spell.id);
return false; return false;
} }
if (!IsValidTarget(target, spell.validTarget) || !spell.IsValidTarget(this, target)) if (!IsValidTarget(target, spell.validTarget) || !spell.IsValidTarget(this, target))

View file

@ -112,7 +112,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle
/// <summary> /// <summary>
/// this field is not actually part of the packet struct /// this field is not actually part of the packet struct
/// </summary> /// </summary>
//public uint animation; public uint animation;
public BattleAction(uint targetId, ushort worldMasterTextId, uint effectId, ushort amount = 0, byte param = 0, byte unknown = 0) public BattleAction(uint targetId, ushort worldMasterTextId, uint effectId, ushort amount = 0, byte param = 0, byte unknown = 0)
{ {

View file

@ -22,14 +22,6 @@ function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, ta
return; return;
end end
--Does the target exist
target = player:getZone():FindActorInArea(targetActor);
if (target == nil) then
player:SendGameMessage(GetWorldMaster(), 30203, 0x20);
player:endEvent();
return;
end
player.Ability(command.actorId, targetActor); player.Ability(command.actorId, targetActor);
player:endEvent(); player:endEvent();

View file

@ -19,5 +19,4 @@ function onEventStarted(player, command, triggerName)
end end
player:endEvent(); player:endEvent();
sendSignal("playerActive"); sendSignal("playerActive");
end;
end

View file

@ -14,23 +14,6 @@ local attackMagicHandlers = {
} }
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8) function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
print(command.actorId)
--Are they in active mode?
if (player:GetState() != 2) then
player:SendGameMessage(GetWorldMaster(), 32503, 0x20);
player:endEvent();
return;
end
--Does the target exist
target = player:getZone():FindActorInArea(targetActor);
if (target == nil) then
player:SendGameMessage(GetWorldMaster(), 30203, 0x20);
player:endEvent();
return;
end
player.Cast(command.actorId, targetActor); player.Cast(command.actorId, targetActor);
player:endEvent(); player:endEvent();
end;
end

View file

@ -18,18 +18,9 @@ function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, ta
return; return;
end end
--Does the target exist
target = player:getZone():FindActorInArea(targetActor);
if (target == nil) then
player:SendGameMessage(GetWorldMaster(), 30203, 0x20);
player:endEvent();
return;
end
if not player.aiContainer.IsEngaged() then if not player.aiContainer.IsEngaged() then
player.Engage(targetActor); player.Engage(targetActor);
end; end;
player.WeaponSkill(command.actorId, targetActor); player.WeaponSkill(command.actorId, targetActor);
player:endEvent(); player:endEvent();
end;
end